c# - CefSharp WPF 和离屏性能
问题描述
我试图支持一个使用 cefsharp(v79.1.360) 的应用程序。
我需要实施的事情清单:
1) WPF 中的 ChromiumWebBrowser(使用 CefSharp.Wpf 最小示例)
2)这个浏览器可以离开屏幕(折叠窗口或关闭它)
3) 使用 JavaScriptObjectRepository,并启动一些代码,这将与网页一起工作(单击按钮,更改元素的文本)。页面可以使用框架、websockets、Http 请求和网页通常使用的其他东西。
页面工作完成后,我通过调用对象的方法将结果发送到 C#,我绑定在 jsObjectRepository/
期望:
离屏前奏(时间延迟)应该和打开窗口一样/
现实:
有时屏幕外的性能真的很差,最多需要 10 秒的时间才能完成工作(当 wpf 只有 1-5 时)。
我的代码:
初始化
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
CefSharpSettings.WcfEnabled = true;
CefSettings cefSettings = new CefSettings
{
LocalesDirPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "locales"),
Locale = appsettings.CurrentChromeLanguage.ToLocal(),
AcceptLanguageList = appsettings.CurrentChromeLanguage.ToAcceptList(),
};
if (!cefSettings.CefCommandLineArgs.ContainsKey("disable-gpu"))
{
cefSettings.CefCommandLineArgs.Add("disable-gpu", "1");
}
if (cefSettings.CefCommandLineArgs.ContainsKey("enable-system-flash"))
{
cefSettings.CefCommandLineArgs.Remove("enable-system-flash");
}
if (cefSettings.CefCommandLineArgs.ContainsKey("enable-media-stream"))
{
cefSettings.CefCommandLineArgs.Remove("enable-media-stream");
}
cefSettings.CefCommandLineArgs.Add("enable-begin-frame-scheduling", "1");
cefSettings.CefCommandLineArgs.Add("disable-gpu-vsync", "1");
cefSettings.CefCommandLineArgs.Add("mute-audio", "true");
cefSettings.CefCommandLineArgs.Add("enable-media-stream", "0");
cefSettings.CefCommandLineArgs.Add("disable-3d-apis", "1");
cefSettings.CefCommandLineArgs.Add("renderer-process-limit", "10");
cefSettings.CefCommandLineArgs.Add("js-flags", "--lite_mode");
if (!appsettings.IsLoadImage)
{
cefSettings.CefCommandLineArgs.Add("disable-image-loading", "1");
}
cefSettings.LogFile = Path.Combine(ClientConfig.ChromeDataPath, "Log.txt");
cefSettings.LogSeverity = LogSeverity.Error;
cefSettings.IgnoreCertificateErrors = true;
cefSettings.SetOffScreenRenderingBestPerformanceArgs();
浏览器的创建和使用:
ChromiumWebBrowser browser = new ChromiumWebBrowser();
//xaml window with <ContentControl> with browser
//need hide means when window is closing, we cancel it, and using Hide()
NewBrowserView view = new NewBrowserView(new ChromeTabViewModel(browser));
view.Closing += BrowserView_Closing;
Browser.FrameLoadStart += _browser_FrameLoadStart;
var options = new BindingOptions { CamelCaseJavascriptNames = false };
browser.JavascriptObjectRepository.Register("resultController", this, false, options);
//we can just hide window
void BrowserView_Closing(object sender, CancelEventArgs e)
{
if (_needHide)
{
e.Cancel = true;
Hide();
}
}
//on page load
void _browser_FrameLoadStart(object sender, FrameLoadStartEventArgs e) {
string code = "";
code += "(async function(){ " +
"await CefSharp.BindObjectAsync('resultController'); " +
code += TestJsCode;
code += " })();";//AddWorker
e.Frame.ExecuteJavaScriptAsync(code, $"about:blank/myCode");
Consol.WriteLine(DateTime.Now);
}
public void OnGoodResult()
{
Consol.WriteLine(DateTime.Now);
}
public void OnBadResult()
{
Consol.WriteLine(DateTime.Now);
}
//then i just go by differnet pages and await results
正如我之前提到的,当我隐藏 wnd 时,打印结果需要很长时间
解决方案
我真的很依赖布局和其他视觉效果,所以我想通了。当窗口折叠时,我应该设置此代码:
GetBrowser().GetHost().WasHidden(false);
推荐阅读
- javascript - 如何使用 msw(模拟服务工作者)设置请求对象的 responseURL
- matlab - 移动最小二乘拟合有问题的点位移
- c++ - 我怎样才能将 wchar_t* 交给 espeak 而不让德语字符发音不正确?
- python - dict 参数的类型注释
- xml - XQuery - 相当于 SQL NOT IN
- python - append(variable) 插入错误的值,我不知所措
- c# - 组合框选定值返回 System.Data.DataRowView
- javascript - VueJs 从 Vuetify 重新加载一个简单的表
- node.js - 如何在 Node 中使用 Promises 链接数据库查询?
- django - 无法将外键传递给表单以过滤该键