|
https://blog.csdn.net/xmcy001122/article/details/110482832
文章目录
引言
问题
cef简介
升级内核到80
video标签
内存泄漏问题
总结
引言
网易开源的 duilib 中,有一个使用libcef3的例子,可以实现类似chrome的功能,还支持拖曳。
拖出来的效果(当然还可以拖回去):
刚好最近有个项目,需要用到这种混合架构,通过chromium内核加载网页,并且还需要多标签,就把这个项目用起来了。
在生产环境中,发现一些问题,特此记录和分享。
问题
cef简介
Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。
除了提供C/C++接口外,也有其他语言的移植版。
因为基于Chromium,所以CEF支持Webkit & Chrome中实现的HTML5的特性,并且在性能上面,也比较接近Chrome。
所以,如果要在windows程序中显示网页,比ie控件更好的选择就是libcef3了,所有内核组件都会被打包在本地,不用处理兼容性的问题,不用预装浏览器。
升级内核到80
网易官方维护的nim_duilib中cef的内核是49,这个是兼容xp的最后一个版本。
但是对于我们而言,chromium版本还是太低了。
升级步骤:
下载合适的libcef3。http://opensource.spotify.com/cefbuilds/index.html
使用cmake生成vs2017的工程。
vs2017打开cef.sln
编译,运行cefclient
到这里,libcef3就准备好了,剩下的就是替换nim_duilib下面的bin/cef动态库,以及libcef_dll_wrapper源文件,和解决错误了。
建议升级路线:
56:接口什么的和49相差不大,升级非常容易。
60:有一些变化,多和少一些接口,升级会相对难一点。
76:跨度有点大了,升级难度大一点,但是把一些编译错误解决一下,基本也没啥问题。
80:和76相差不大。
我的分支已经完成了:https://github.com/xmcy0011/NIM_Duilib_Framework
video标签
因为版权问题,从cef官方下载的库,是不带h264编码格式的,即对于html5的video标签是不支持的。
所以要去找别人通过源码编译的cef库,我是升级到了80,刚好 https://download.csdn.net/download/ldmlrx/12285397 编译好了,我就直接替换就可以了。
打开 http://www.html5test.com 验证一下即可。
内存泄漏问题
在生产环境中,客户的使用频率比较高,连续不停的使用2个小时以上,就会造成客户端崩溃,后面经过调查,初步怀疑是因为libcef内存泄漏造成的。
经过不停的试验,发现nim_duilib自带的 multi_browser 例子在关闭一个tab后,内存降低不明显,不停的关闭打开新的网页,内存就一直涨。
在支持了视频之后,关闭一个tab,测试同学反馈声音还在后台,就更确定是没有正确释放libcef了。
经过查阅资料:
CEF 的关闭流程
cef 关闭child窗口导致整个进程退出
最后解决了这个问题。
CefNativeControl::~CefNativeControl(void) {
if (browser_handler_.get() && browser_handler_->GetBrowser().get()) {
// fixed_s 内存泄漏问题
auto hwnd = GetCefHandle();
DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
// 因为ReCreateBrowser中使用了SetAsChild,而Browser又是根据接收WM_CLOSE消息来关闭释放的
// 所以这里退出前,需要更改一下父窗口,否则会造成内存泄漏或者只有整个MultiBrowserForm退出时才释放内存。
if (dwStyle & WS_CHILD)
::SetParent(hwnd, GetDesktopWindow());
// fixed_e
// Request that the main browser close.
browser_handler_->SetHostWindow(NULL);
browser_handler_->SetHandlerDelegate(NULL);
browser_handler_->GetBrowserHost()->CloseBrowser(false);
browser_handler_ = nullptr;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
总结
整体上来讲,如果要开发windows应用程序,觉得mfc太丑,duilib又bug太多,不如试一试网易的nim_duilib,bug少,例子多,好上手。
nim_duilib:https://github.com/netease-im/NIM_Duilib_Framework
当然,如果您也需要用到cef内核,可以到我的github上看一下:
https://github.com/xmcy0011/NIM_Duilib_Framework
修改说明:
本分支对cef进行了升级,目前是libcef chromium80,3987版本
并且添加了mp4的支持,可以在www.html5test.com验证,使用别人编译的库:https://download.csdn.net/download/ldmlrx/12285397
解决了multi_browser内存泄漏的问题(关闭1个tab,内存不释放,特别是如果这个tab里面包含视频的话,还会在后台播放😂)
————————————————
版权声明:本文为CSDN博主「Go和分布式IM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xmcy001122/article/details/110482832
|
|