| 
 | 
	
 
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 
 
 |   
 
 
 
 |