• 使用CefSharp在.Net程序中嵌入Chrome浏览器(九)——性能问题


    在使用CEF的过程中,我发现了一个现象:WPF版的CEF比Chrome性能要差:一些有动画的地方会掉帧(例如,CSS动画,全屏图片拖动等),视频播放的效果也没有Chrome流畅。

    查了一下相关资料,发现CEFSharp.WPF不是直接渲染在控件上的,它的大概流程如下:

    1. CEFSharp.WPF的ChromiumWebBrowser控件本质上是一个图片
    2. 而是通过离屏渲染的方式渲染在缓冲区里,
    3. 绘制完成后,然后将缓冲区的数据传递到InteropBitmap中去
    4. 将InteropBitmap作为ChromiumWebBrowser的图源更新

    这个基本上是类似于WPF的视频播放器的做法:先离屏渲染出图片,在将图片更新到界面。这个做法由于是使用的WPF的原生渲染方案,可以说是WPF的原生控件的,本身是有不少好处的:

    1. 可以支持透明背景
    2. 可以在上面叠加其它WPF控件
    3. 可以支持WPF的变形,动画,裁剪等特效

    简单一句话,是可以和WPF程序无缝集成的,如果将WEB界面作为控件嵌入式再方便不过的。

    但是,它这个实现是有代价的:

    1. 离屏渲染本身需要多一层工序,
    2. 有切换上下文和内存拷贝的开销。
    3. 更要命的是,貌似目前GPU离线渲染视频效果还不是很好,因此默认还把gpu加速给关了,性能更下降了一截。

    另外,InteropBitmap传递图片内存的效率本身就不高,不光吃cpu,还吃内存,网上也有人讨论过。

    针对这些问题,有人建议使用WritableBitmap替换InteropBitmap,但貌似作者认为InteropBitmap的效率更好些。我使用过WritableBitmap离屏渲染地图,应该是能做到比当前更好的性能的。

    也有人建议使用效率更高的D3DImage(WPF原生支持这个,不过麻烦些),可能作者觉得目前它的这个性能问题不是首要解决的目标吧,也一直没有采纳。

    最后说一下解决方法吧,虽然在大部分的情况下,当前的解决方案是能满足我们的需求的,不过如果遇到非要解决的情况下,可以使用下WinFrom版的CEFSharp,通过WinFormHost来集成到WPF程序中去。

    WinFrom版的CEFSharp应该是直接渲染的,我试了一下,效率基本上接近Chrome,并且由于他们的基础库是公用的,在WPF程序中WinFrom版和WPF版的CEF是可以并存的,用起来还算方便。

  • 相关阅读:
    序列化与反序列化
    进程与线程
    winform基础
    MD5加密
    Docker安装Nextcloud+collabora office+ocdownloader
    Docker安装MariaDB
    Docker 安装 Nginx
    Docker命令大全
    Docker之镜像操作
    Linux入门-Docker安装
  • 原文地址:https://www.cnblogs.com/TianFang/p/9941501.html
Copyright © 2020-2023  润新知