2011-09-13 82 views
0

我在OSX上使用核心图形在safari中工作,我有一个插件运行两个线程(主线程和渲染计时器线程)。呈现计时器线程在主插件线程处理相应事件并重绘本身时调用“NPN_InvalidateRect”。然而,这似乎在Safari不同的方式工作32位与狩猎64位:Safari浏览器下的NPAPI自我渲染插件(32位与64位)

  • 64位(可可事件模型):需要NPN_InvalidateRect + NPN_ForceRedraw =正确重绘
  • 32位(可可如果支持,否则碳): NPN_InvalidateRect =正确重绘 但是,同时执行NPN_InvalidateRect + NPN_ForceRedraw(如64位大小写)会导致闪烁的图像。

问题:

  1. 有没有更好的办法来迫使一插件来表现自己,同时坚持原生NPAPI,核芯显卡,支持碳&可可事件模型。

  2. 如果没有,我该如何检测,在运行时,如果浏览器运行为32与64位应用程序,所以我可以选择哪些NPN函数的调用。

感谢,

(交叉张贴到firebreath,我将张贴在这两个地方的反应)

回答

1

首先,这样的:

渲染计时器线程调用“ NPN_InvalidateRect“

是一个严重的问题,除非你真的是我您的渲染计时器线程会导致在主插件线程上调用NPN_InvalidateRect。 NPAPI明确不是线程安全的,并且您需要在主线程上调用像NPN_InvalidateRect这样的方法。

其次,你真的不应该叫NPN_ForceRedraw。 Chromium,Firefox OOP,WebKit2,以及几乎可以肯定的Safari的OOP模式(这就是你在64位中获得的)将NPN_ForceRedraw视为无操作;迫使立即重绘的概念违背了OOP插件的整个模型。在任何情况下,您都应该调用NPN_InvalidateRect,并信任浏览器给您回电。在OOP插件世界中,您不应该期望浏览器在任何特定时刻呈现插件。

+0

另外,为什么你从另一个线程“渲染”?你知道你只能回应某种抽签事件,对吗?在这种情况下,它总是在主线上。一种选择是设置一个定时器,在主线程上以特定频率调用NPN_InvalidateRect;该方法由FireBreath支持(您对于是否使用它并不清楚)是否使用PluginWindowMac类的AutoInvalidate函数。 – taxilian