Cocoa safari下的NPAPI自呈现插件(32位与64位)

Cocoa safari下的NPAPI自呈现插件(32位与64位),cocoa,plugins,safari,npapi,Cocoa,Plugins,Safari,Npapi,我在safari中工作,在OSX之上,使用核心图形,我有一个插件运行两个线程(主线程和渲染计时器线程)。呈现计时器线程调用“NPN_invalidate直立”,而主插件线程处理相应的事件并重新绘制自身。但是,这在safari 32位和safari 64位中的工作方式似乎有所不同: 64位(cocoa事件模型):需要NPN_+NPN_ForceRedraw=正确的重绘 32位(如果支持,则为可可色,否则为碳):NPN_=正确的重绘 但是,同时执行NPN_和NPN_强制重画(如64位大小写)会导致

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

  • 64位(cocoa事件模型):需要NPN_+NPN_ForceRedraw=正确的重绘
  • 32位(如果支持,则为可可色,否则为碳):NPN_=正确的重绘 但是,同时执行NPN_和NPN_强制重画(如64位大小写)会导致图像闪烁
问题:

  • 有没有更好的方法来强制插件呈现自己,同时坚持原生NPAPI、核心图形和对carbon&cocoa事件模型的支持

  • 如果不是,我如何在运行时检测浏览器是否以32位和64位应用程序的形式运行,以便选择要调用的NPN函数

  • 谢谢

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

    首先,这:

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

    这是一个严重的问题,除非你真的认为你的渲染计时器线程会导致在主插件线程上调用NPN_。NPAPI显然不是线程安全的,您需要在主线程上调用NPN_等方法


    第二,你真的不应该叫NPN_ForceRedraw。Chromium、Firefox OOP、WebKit2,以及几乎可以肯定的Safari的OOP模式(这是您在64位中得到的)将NPN_ForceRedraw视为不可操作;强制立即重画的概念与OOP插件的整个模型背道而驰。在任何情况下,你都应该打电话给NPN_,并相信浏览器会给你回电话。在OOP插件世界中,您不应该期望在任何给定时刻强制浏览器呈现插件。

    此外,为什么您要从另一个线程“呈现”插件?你知道你只能对某种抽奖事件做出反应,对吗?在这种情况下,它将始终位于主线程上。一种选择是设置一个计时器,在主线程上以特定频率调用NPN_;FireBreath(您没有明确说明是否正在使用它)支持这种方法,并在PluginWindowMac类上使用AutoInvalidate函数。