[英]Awesomium decrease webview memory usage
我正在制作一个用于浏览器游戏的机器人。 我正在使用http://awesomium.com连接到该页面。 我使用webview以curstom形式显示页面,但是问题是,很长一段时间后,awesomium_process达到200k的内存使用量,并且一直在增加。.我不知道如何减少内存使用量。不要使用webcontrol,因为injectmousemove不会影响webcontrol中的Flash内容)
谁能帮我?
这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Awesomium.Core;
using Awesomium.Windows.Forms;
using Awesomium.Web;
using System.Diagnostics;
using System.IO;
namespace ProBot
{
public partial class Explorer : UserControl
{
private WebView webView;
private ImageSurface surface;
private WebSession session;
public Explorer()
{
session = InitializeCoreAndSession();
InitializeComponent();
InitializeView(WebCore.CreateWebView(this.ClientSize.Width, this.ClientSize.Height, session));
}
#region Metodos
private void InitializeView(WebView view)
{
if (view == null)
return;
surface = new ImageSurface();
surface.Updated += OnSurfaceUpdated;
webView = view;
webView.Surface = surface;
webView.Source = "http://google.com".ToUri();
webView.FocusView();
}
private WebSession InitializeCoreAndSession()
{
if (!WebCore.IsInitialized)
WebCore.Initialize(new WebConfig() { LogLevel = LogLevel.Normal, ReduceMemoryUsageOnNavigation = true });
// Build a data path string. In this case, a Cache folder under our executing directory.
// - If the folder does not exist, it will be created.
// - The path should always point to a writeable location.
string dataPath = String.Format("{0}{1}Cache", Path.GetDirectoryName(Application.ExecutablePath), Path.DirectorySeparatorChar);
// Check if a session synchronizing to this data path, is already created;
// if not, create a new one.
session = WebCore.Sessions[dataPath] ??
WebCore.CreateWebSession(dataPath, WebPreferences.Default);
// The core must be initialized by now. Print the core version.
Debug.Print(WebCore.Version.ToString());
// Return the session.
return session;
}
protected override void OnPaint(PaintEventArgs e)
{
if ((surface != null) && (surface.Image != null))
{
e.Graphics.DrawImageUnscaled(surface.Image, 0, 0);
}
else
base.OnPaint(e);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.IsRendering = (this.ClientSize.Width > 0) && (this.ClientSize.Height > 0);
if (webView.IsRendering)
webView.Resize(this.ClientSize.Width, this.ClientSize.Height);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectMouseMove(e.X, e.Y);
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectMouseDown(e.Button.GetMouseButton());
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectMouseUp(e.Button.GetMouseButton());
}
protected override void OnMouseWheel(MouseEventArgs e)
{
base.OnMouseWheel(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectMouseWheel(e.Delta, 0);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectKeyboardEvent(e.GetKeyboardEvent());
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectKeyboardEvent(e.GetKeyboardEvent(WebKeyboardEventType.KeyDown));
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
if ((webView == null) || (!webView.IsLive))
return;
webView.InjectKeyboardEvent(e.GetKeyboardEvent(WebKeyboardEventType.KeyUp));
}
#endregion
#region Eventos
private void OnSurfaceUpdated(object sender, SurfaceUpdatedEventArgs e)
{
Invalidate(e.DirtyRegion.ToRectangle(), false);
}
#endregion
#region Publics
private delegate void InstarMouseMoverCallback(int x, int y);
public void InsertarMouseMover(int x, int y)
{
if (InvokeRequired)
{
InstarMouseMoverCallback method = InsertarMouseMover;
Invoke(method, new object[] { x, y });
}
else
{
webView.InjectMouseMove(x, y);
}
}
private delegate void InstarMouseClickIzquierdoCallback();
public void InsertarMouseClickIzquierdo()
{
if (InvokeRequired)
{
InstarMouseClickIzquierdoCallback method = InsertarMouseClickIzquierdo;
Invoke(method, new object[] {});
}
else
{
webView.InjectMouseDown(MouseButton.Left);
webView.InjectMouseUp(MouseButton.Left);
}
}
Bitmap captura;
private delegate Bitmap CapturaCallback();
public Bitmap Captura()
{
if (InvokeRequired)
{
CapturaCallback method = Captura;
Invoke(method, new object[] { });
}
else
{
captura = new Bitmap(surface.Image);
}
return captura;
}
private delegate void ReducirMemoriaCallback();
public void ReducirMemoria()
{
if (InvokeRequired)
{
ReducirMemoriaCallback method = ReducirMemoria;
Invoke(method, new object[] { });
}
else
{
webView.ReduceMemoryUsage();
}
}
private delegate void CerrarCoreCallback();
public void CerrarCore()
{
if (InvokeRequired)
{
CerrarCoreCallback method = CerrarCore;
Invoke(method, new object[] { });
}
else
{
WebCore.Shutdown();
}
}
public void CambiarPagina(String pagina)
{
webView.Source = new Uri(pagina);
}
#endregion
}
}
您可以采取一些措施来改善这种情况,但这还取决于您使用的工具以及游戏的构建方式。
如果您使用的是Awesomium 1.7.4,则可以考虑恢复到Awesomium 1.7.3,新awesomium中的内存使用量已大大增加。
您可以使用内存探查器来查看是否正在创建任何会影响内存使用率的内存泄漏。
当awesomium进程的大小增加时,其原因之一是由于javascript执行在页面上创建了对象,请确认您没有在设置的任何javascript代码中泄漏内存。
闪存也可能正在泄漏内存,请确认您没有泄漏任何内存。
Web上有很多用于分析这些各种组件的工具。 我已经使用ANTS进行.NET的内存分析,并且发现它非常有用和有用。
如果您正在运行1.7.4,我要采取的第一步是尝试1.7.3,因为这可能是一个相当简单的更改。 我最近(实际上是昨天发布)昨天由于1.7.4中的内存问题而不得不将我的代码库移回1.7.3,我确定这些问题将得到解决,但是现在我需要稳定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.