或者......“何时调用pluginWindowMac :: InvalidateWindow()”?
道歉。这里很难简短,这是一个相当具体的测试案例。
我正在测试Firefox,Safari,Chrome和IE下的NPAPI插件(现在适用于Firebreath)。 我正在Windows和OS X下测试该插件。
这是一个使用OpenGL进行所有渲染的视频播放器。所以在OS X上我使用的是CAOpenGLLayer 派生类,并支持在下面使用的Invalidating Core Animation模型 Firefox和Chrome。
该插件在所有情况下以及在两个平台上都运行良好,但OS X上的Chrome(v26.0.1410.65)除外,我在OS X 10.6下看到了一个奇怪的“刷新”问题 和10.7。
就好像Chrome在某处复合了一层复合层。它总是一个 通过OpenGL绘制的框架后面的“框架”。我通过对每个绘制调用进行编号来证明这一点 并将该数字绘制到OpenGL渲染中,并通过NSLog记录它。什么是 在屏幕上始终是一个落后的绘制回调(我没有渲染视频) 这一点 - 它暂停了。)
通过使用特定的键盘事件来触发对pluginWindowMac :: InvalidateWindow()的额外调用, 我可以强制外部无效,这将使屏幕上的内容与之同步 最后渲染的是什么,但在下一次绘制调用时会再次失去同步(触发 由图层setNeedsDisplay)。
我现在正在每次抽奖结束时调用pluginWindowMac :: InvalidateWindow() 打回来。换句话说,在图层'drawInCGLContext()'调用结束时。这个会 似乎是唯一合乎逻辑的地方。但我开始怀疑它 Chrome这只是不起作用?很明显,通话是有效的 - 正如键盘所证明的那样 触发InvalidateWindow,但也许它不能在drawInCGLContext内部工作?
该插件在Firefox(另一个使用Invalidating的浏览器)下正常运行 核心动画)。但也许这根本不依赖于一个工作的pluginWindowMac :: InvalidateWindow()?
是否还有其他人因使用Chrome而遇到此问题?发现了什么变通方法?关于 我现在所能想到的是某种计时器驱动的事件来触发一个额外的事件 无效。