Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome 当可见区域发生变化时,OpenGL插件会使Chrome崩溃_Google Chrome_Opengl_Npapi_Firebreath - Fatal编程技术网

Google chrome 当可见区域发生变化时,OpenGL插件会使Chrome崩溃

Google chrome 当可见区域发生变化时,OpenGL插件会使Chrome崩溃,google-chrome,opengl,npapi,firebreath,Google Chrome,Opengl,Npapi,Firebreath,我正在开发一个在Windows上使用FireBreath的插件(目前),其中包括使用OpenGL显示网络摄像头提要。我正在使用一个窗口插件,我正在从一个单独的线程中绘制。可在此处查看代码: 头文件 源文件 (忽略onWindowResized中的奇怪代码,这只是提交中的一些测试。) 问题是,一旦浏览器窗口的大小被重新调整,插件的可见区域被改变,或者扩展部分以某种方式滚动到滚动框的可见区域之外,插件就会在Chrome中崩溃。我还没有安装Firefox,但我猜这是一个NpApi的东西,因为它在I

我正在开发一个在Windows上使用FireBreath的插件(目前),其中包括使用OpenGL显示网络摄像头提要。我正在使用一个窗口插件,我正在从一个单独的线程中绘制。可在此处查看代码:

头文件

源文件

(忽略onWindowResized中的奇怪代码,这只是提交中的一些测试。)

问题是,一旦浏览器窗口的大小被重新调整,插件的可见区域被改变,或者扩展部分以某种方式滚动到滚动框的可见区域之外,插件就会在Chrome中崩溃。我还没有安装Firefox,但我猜这是一个NpApi的东西,因为它在InternetExplorer中工作

我相信现在的情况是,只要插件的可见维度发生变化,Chrome就会发布并创建一个新的HDC。这可能导致呈现上下文无效,但它仍在插件中使用,从而导致崩溃

我注意到发生这种情况时会调用NPP_SetWindow get,但在NpapiPluginModule_NPP.cpp中会忽略这些调用,因此我无法连接到此事件

我已经在谷歌上搜索了几个小时,但没有找到任何帮助。有人有过这样的经历吗


我有一个想法,如果我在插件窗口中创建自己的子窗口来处理自己的DC,它就可以工作了。我做了一些快速测试,但失败了,这可能是因为我的Win32技能太差了。但是,再多做一些工作,这能奏效吗?我的另一个想法是以某种方式跟踪可见区域,但我还没有对此进行研究。

Windows句柄失效不应导致程序按so崩溃。但是OpenGL,即它的扩展需要一些特殊的预防措施,特别是如果宿主程序也使用OpenGL的话

任何一种使用OpenGL的插件或DLL都必须小心,也就是说,在使用它们之前将其所需的资源置于正常状态,一旦使用完毕,就将其放回原处。对于OpenGL,这意味着每次开始使用它之前,都应该重新绑定上下文:

HDC hOldDC = wglGetCurrentDC();
HRC hOldContext = wglGetCurrentContext();

 // first unbind old context/DC from current thread
wglMakeCurrent(NULL, NULL);

 // then bind our context
wglMakeCurrent(hMyDC, hMyContext);

 // this is essential, as in Windows the addresses of extensions
 // may depend on the active context, so you must reinitialise
 // extension function pointers!
reinitialize_extensions();

/* NOW USE OPENGL FUNCTION

 // cleaning up once we're done:
wglMakeCurrent(NULL, NULL);
wglMakeCurrent(hOldDC, hOldRC);
// remember that we also need to reset extension
// function pointers to the other context
reinitialize_extensions();
由于窗口内的扩展函数指针依赖于上下文,因此将它们放入一个结构并通过该结构调用它们是有意义的。这节省了整个扩展重新初始化的时间。在C++中,可以将整个OpenGL上下文包在一个类中。
请记住,每次通过NP-API调用插件时,您都需要进行此设置/拆卸。

出于好奇,您是否真的因为无效的扩展指针而遇到问题?多年来,我一直在Windows上运行GL,没有遇到任何问题,但由于专用硬件,我可能很幸运,并且不要经常与多个同时的上下文混淆。OP在一个单独的线程中包含OpenGL设置和绘图代码,并表示每个线程都有一个当前的GL上下文thread@GeorgFritzsche:如果OP听从了我的建议,他也会得到多线程支持。OpenGL多线程处理的要点是,一个上下文一次只能在一个线程中处于活动状态,并且每个线程只有一个上下文。但是上下文可以在线程之间完美地迁移。上面的代码也会考虑多线程的安全性。嗯,这也是我收集的,但是他在一个新线程上创建了一个新的上下文,从不迁移任何内容或激活该线程上的另一个上下文。供参考:我将上述内容添加到了一个repo案例中,它不会改变行为here@GeorgFritzsche:哦,这意味着他试图在同一窗口上多次设置PIXELFORMATDESCRIPTOR?这可能是部分原因,因为一个窗口的PFD可以,实际上只能设置一次。快速查看一下,但没有时间深入挖掘。只需在不绘制的情况下设置OGL就足够了,它发生在FF和Chrome中,当进程外插件被禁用时,它不会发生在FF中。禁用FBs窗口子类化没有帮助。在配置了MicrosoftSymbol服务器的情况下连接VisualStudio(可能也是),您将看到它在某些窗口进程处理(显然是无限递归)中由于堆栈溢出而崩溃。顺便说一句,
SetWindow
在这里通过
FB::NpapiPluginWin