【问题标题】:NPAPI self rendering plugin under safari (32 bit versus 64 bit)safari 下的 NPAPI 自渲染插件(32 位与 64 位)
【发布时间】:2011-09-13 12:30:29
【问题描述】:

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

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

问题:

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

  2. 如果不是,我如何在运行时检测浏览器是作为 32 位还是 64 位应用程序运行,以便我可以选择调用哪些 NPN 函数。

谢谢,

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

【问题讨论】:

    标签: cocoa plugins safari npapi


    【解决方案1】:

    首先,这个:

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

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

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

    【讨论】:

    • 另外,你究竟为什么要从另一个线程“渲染”?你知道你只能在某种抽奖事件中进行抽奖,对吧?在这种情况下,它将始终在主线程上。一种选择是设置一个计时器,在主线程上以特定频率调用 NPN_InvalidateRect; FireBreath 支持该方法(您没有明确说明是否使用它)和 PluginWindowMac 类上的 AutoInvalidate 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多