Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1002|回复: 0
打印 上一主题 下一主题

nim_duilib多标签程序中使用libcef3内存泄漏问题解决

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2022-9-15 10:05:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-4 04:48 , Processed in 0.054774 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表