我正在通過Adobe AIR(3.1)將基於Flash Player的遊戲移植到桌面(OSX和Windows)。移植到AIR本身已經非常順利。我已經處理的一個問題是遊戲將通過Steam網絡進行分發。爲了與Steam客戶端進行交互,我必須編寫一個本地擴展來將Steam SDK API公開到AS3。本機擴展支持已針對兩種平臺實施,並且我已根據需要啓動應用程序並與Steam進行通信。Adobe AIR 3.1蒸汽疊加層渲染/輸入問題(Windows)
我遇到麻煩的區域是處理Steam的疊加層,當它被激活時會使遊戲超過遊戲。從本質上講,當遊戲啓動時,Steam客戶端會暫停該進程,以便將Overlay庫掛接到D3D或OpenGL。最初,由於AIR應用程序描述符的默認渲染模式設置爲「auto」,所以Overlay未能完全顯示。但是,一旦我將渲染模式切換到「gpu」,Overlay將按需要顯示。
在OSX的東西方面,一切都按預期工作。我可以切換進入和退出覆蓋圖就好了。在光譜的窗口一端,當我激活疊加層時,我遇到了一些問題。具體來說,當Overlay被啓用(它渲染高於遊戲),並且我移動鼠標或生成鍵盤輸入時,Overlay和遊戲都會「凍結」(渲染停止)2-3秒。另外,我注意到當我打開運行遊戲的任務管理器時,CPU使用率大約爲75-80%。當我第一次激活覆蓋(這是所需的)時,CPU使用率保持不變。但是,當我移動鼠標光標或按下鍵盤上的某個鍵時,CPU使用率將下降到大約1%。這個問題發生在我們測試過的5臺Windows機器(2個XP,3個Win 7)上。當然,我首先與Valve聯繫瞭解這個問題,因爲這隻有在Overlay被啓用時纔會發生。我已經上傳了OSX和Windows版本,供他們的開發人員進行調試;然而,我的聯繫人建議我找出更多關於AIR渲染/輸入。
這是一個帶蒸汽開發,詳細覆蓋的工作原理後的一個片段:
「的Windows上的覆蓋要求如下:
- 遊戲必須使用D3D7, D3D8,D3D9,D3D10,D3D11或OpenGL
- 遊戲必須快速定期調用D3D Present()或OpenGL SwapBuffers()(這些調用被覆蓋層掛鉤並給它做工作的機會),例如2D只有在鼠標移動發生時才調用這些函數的遊戲或屏幕上的圖形實際上會改變,而不是每一幀都不能正常運行。
- 遊戲應該使用標準的Win32輸入消息,原始的Win32輸入消息或DirectInput作爲輸入,然後疊加層將在活動時檢測熱鍵並隱藏/阻止來自遊戲的輸入事件。
聽起來你的遊戲可能會違反#2,並且有時會在覆蓋層處於活動狀態時停止調用Present/SwapBuffers。如果您調用這些函數來響應用戶輸入,而這些用戶輸入現在因疊加被激活而被阻止,則可能會發生這種情況。你應該保證你一直抽幀,並以一定的間隔交換即使輸入事件沒有發生。」
多一點打回原形後,閥門開發者異型我的應用程序,以確定是否有任何具體問題發生的歷史不幸的是,他們無法找到Overlay本身發生的任何事情,這很大程度上意味着Windows上的AIR不喜歡Overlay阻止Win32輸入消息。這裏是閥門開發的迴應:
「我得到了你的倉庫,並做了一些測試沒有什麼不尋常發生在覆蓋與同時出現問題xpref剖析你的應用程序,並採取了一些小型轉儲檢查調用堆棧它看起來像。應用程序完全阻塞並在被阻塞的時候使用零CPU,當它發生時,它只會以大約1秒的間隔調用Present()直到它恢復(也許AIR代碼中某處存在1秒的超時)。以獲得更多的細節,因爲我沒有AIR運行時庫的任何符號
但它看起來像某種方式與輸入狀態有關,AIR對win32輸入消息停止不滿意如果我改變覆蓋一旦激活就不會阻止任何輸入(這顯然在可用性方面存在一些相當大的問題,但僅用於測試目的),則不會發生該問題。 AIR代碼有可能存在一些奇怪的邏輯,如果它看到某個特定的WM_WHATVER消息,它會期待另一個消息,然後以某種方式阻止它。
希望你能在你身邊或與Adobe工作了,爲什麼應用程序在這些情況下,行爲惡劣,並開始阻止和定期不呈現。」
我已經張貼在Adobe論壇,但在那裏沒有這樣的運氣,主要是希望有人或者以前處理過這個問題,或者有一個關於如何解決問題的想法,任何建議,意見或想法都將不勝感激!