或者......“何时调用 pluginWindowMac::InvalidateWindow()”?
道歉。在这里很难简短,这是一个相当具体的测试用例。
我正在 Firefox、Safari、Chrome 和 IE 下测试一个 NPAPI 插件(现已适应 Firebreath)。我正在 Windows 和 OS X 下测试插件。
它是一个使用 OpenGL 进行所有渲染的视频播放器。因此,在 OS X 上,我使用 CAOpenGLLayer 派生类,并支持在 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(另一个使用无效核心动画的浏览器)下运行良好。但也许这根本不依赖于工作的pluginWindowMac::InvalidateWindow()?
有没有其他人在 Chrome 上遇到过这个问题?发现任何解决方法?我现在能想到的只是某种计时器驱动的事件来触发额外的无效。