2011-09-13 43 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