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

引言

网易开源的 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版本还是太低了。

升级步骤:

  1. 下载合适的libcef3。http://opensource.spotify.com/cefbuilds/index.html
  2. 使用cmake生成vs2017的工程。
  3. vs2017打开cef.sln
    在这里插入图片描述
  4. 编译,运行cefclient
    在这里插入图片描述
  5. 到这里,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了。

经过查阅资料:

最后解决了这个问题。

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

总结

整体上来讲,如果要开发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里面包含视频的话,还会在后台播放😂)
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
nim duilib是一个基于Nim语言开发的UI框架,它提供了丰富的控件库,包括按钮、文本框、列表框等常见的控件。除了内置的控件,它还支持自定义控件的开发。 要开发自定义控件,首先需要理解nim duilib的架构和控件的生命周期。每个控件都有自己的类,通过继承Duilib的Control类来创建自定义的控件。在这个类需要重写一系列的方法,比如OnCreate、OnPaint等,来处理自定义控件的创建、绘制等事件。 在OnCreate方法,可以定义自定义控件的属性和初始化。可以设置控件的尺寸、位置、背景颜色等样式属性。在OnPaint方法,可以绘制自定义控件的外观。可以使用nim duilib提供的绘图接口来绘制自定义的图形、文本等,以实现想要的外观效果。 除了控件的外观,还需要处理控件的交互事件。可以重写鼠标按下、鼠标移动、鼠标释放等事件方法,来实现控件的拖拽、点击等交互效果。可以使用nim duilib提供的函数来获取鼠标的位置、键盘的状态等信息,以实现与用户交互的功能。 最后,在使用自定义控件时,需要创建一个对应的控件类的实例,并添加到父容器。可以通过调用父容器的Add控件方法,将自定义控件添加到容器,并设置控件的位置和尺寸。 总的来说,nim duilib的自定义控件开发提供了丰富的接口和方法,可以根据需求自由定制控件的外观和交互。通过理解框架的架构和控件的生命周期,加上nim语言的灵活性和易用性,可以方便地开发出符合自己需求的自定义控件。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值