safari下的NPAPI自渲染插件(32位对64位)

时间:2011-09-13 12:30:29

标签: cocoa plugins safari npapi

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

  • 64位(可可事件模型):需要NPN_InvalidateRect + NPN_ForceRedraw =正确重绘
  • 32位(如果支持可可,否则为碳):NPN_InvalidateRect =正确重绘 然而,同时执行NPN_InvalidateRect + NPN_ForceRedraw(如64位情况)会导致图像闪烁。

问题:

  1. 是否有更好的方法强制插件呈现自身,同时坚持原生NPAPI,核心图形以及对碳和可可事件模型的支持。

  2. 如果没有,我如何在运行时检测浏览器是否运行32位而不是64位应用程序,以便我可以选择呼叫的NPN功能。

  3. 谢谢,

    (交叉发布到firebreath,我会在两个地方发布回复)

1 个答案:

答案 0 :(得分:1)

首先,这个:

  

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

是一个严重的问题,除非你的意思是你的渲染计时器线程导致在主插件线程上调用NPN_InvalidateRect。 NPAPI显然不是线程安全的,你需要在主线程上调用像NPN_InvalidateRect这样的方法。

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