CefView / QCefView

A Qt Widget encapsulated CEF view based on QWidget
https://cefview.github.io/QCefView/
GNU Lesser General Public License v2.1
527 stars 137 forks source link

[BUG]: NCW模式下,多标签页切换页面,会有闪烁黑屏的情况 #269

Closed L-Super closed 9 months ago

L-Super commented 1 year ago

Describe the bug 【Bug描述】

实现了一个多标签页的类浏览器应用,发现在多标签页情况下,进行标签页新建、页面的切换时,在切换的过程中,经常会有窗口闪烁,轻微黑屏的情况。

To Reproduce 【复现步骤】

Expected behavior 【正确的预期行为】

不出现闪烁黑屏的情况

Screenshots 【截图】

动画

Environment 【BUG产生的环境】

Additional context 【更多额外信息】

OSR模式下,暂未发现此现象

guobbs commented 1 year ago

这个问题框架层面不一定好解决,改变开发思路可能是更好的方法。 比如可以预留一个空白窗口改成你想要的颜色背景,每当有新窗口加载的时候,页面加载成功前先展示预留的窗口,加载成功后再用真实窗口来替换掉。

L-Super commented 1 year ago

这个问题框架层面不一定好解决,改变开发思路可能是更好的方法。 比如可以预留一个空白窗口改成你想要的颜色背景,每当有新窗口加载的时候,页面加载成功前先展示预留的窗口,加载成功后再用真实窗口来替换掉。

这个方法表可能只是闪烁的背景色变了,也没起到治标的作用

HeGangSZ commented 1 year ago

我们的项目也出现了类似的问题,用cef的源码demo是没有这个问题的,排查起来比较困难 OSR模式会有性能消耗较大,关闭后就出现了这个打开窗口黑屏闪烁的问题,希望作者关注下,谢谢 @tishion

guobbs commented 1 year ago

这个问题框架层面不一定好解决,改变开发思路可能是更好的方法。 比如可以预留一个空白窗口改成你想要的颜色背景,每当有新窗口加载的时候,页面加载成功前先展示预留的窗口,加载成功后再用真实窗口来替换掉。

这个方法表可能只是闪烁的背景色变了,也没起到治标的作用

其实我的项目也遇到这样的问题,大概知道原因,在这种多标签页中使用了QLayout来管理当前web页面,这个切换过程中是会引起QLayout重新布局,会让web页重这个窗口重新渲染一次。这个黑黑的背景应该就是 web 页面原生窗口的背景色。

闪的原因是web页面发生了重绘,要解决就是要避免触发窗口无意义的重绘。这里要就小心处理QLayout的使用。

L-Super commented 1 year ago

这个问题框架层面不一定好解决,改变开发思路可能是更好的方法。 比如可以预留一个空白窗口改成你想要的颜色背景,每当有新窗口加载的时候,页面加载成功前先展示预留的窗口,加载成功后再用真实窗口来替换掉。

这个方法表可能只是闪烁的背景色变了,也没起到治标的作用

其实我的项目也遇到这样的问题,大概知道原因,在这种多标签页中使用了QLayout来管理当前web页面,这个切换过程中是会引起QLayout重新布局,会让web页重这个窗口重新渲染一次。这个黑黑的背景应该就是 web 页面原生窗口的背景色。

闪的原因是web页面发生了重绘,要解决就是要避免触发窗口无意义的重绘。这里要就小心处理QLayout的使用。

我使用的qtabwidget去添加view,这种情形下,有什么解决方案吗

L-Super commented 1 year ago

Bug fixed by 6be6affcde85cfd926273545282174cc2229f955. The problem was resolved after the NCW refactoring.

By the way, it's also OK:

windowInfo.SetAsChild((CefWindowHandle)ncw.qBrowserWindow_->winId(), { 0, 0, view->maximumWidth(), view->maximumHeight() });
be-water-myFriend commented 9 months ago

image

是不是这里代码处理引起的问题,窗口不可见时被resize(0, 0),再次可见时又重新resize到窗口大小,必然会出现闪烁。

L-Super commented 9 months ago

image

是不是这里代码处理引起的问题,窗口不可见时被resize(0, 0),再次可见时又重新resize到窗口大小,必然会出现闪烁。

尝试了一下,注释了这里的代码后,似乎没有闪烁了,有待进一步观察研究