我所遭遇過的游戲中間件--Scaleform


我所遭遇過的游戲中間件---Scaleform

      Scaleform幫助開發人員利用現代系統的三維硬件加速性能創建電影品質的菜單、游戲內HUD,動畫紋理、迷你游戲以及移動游戲與應用。Scaleform作為一個可視化UI設計的中間件解決方案,其高性能已被充分證明,有了它,開發者通過Adobe Flash Studio可以高效率、低成本地創建富有現代感的GPU加速動畫用戶界面和矢量圖形,而無需學習新工具的使用或者動畫處理方法。Scaleform的另外一個名子叫GFX,在本文中有時使用Scaleform,有時會使用GFX,讀者把它們當成一個東西就可以了.GFx為直接在Flash Studio創作游戲用戶界面開辟了一條可視化開發途徑,能夠無縫銜接工作中的各個環節。

      除了普通的UI界面顯示,開發者還可以利用GFx在3D場景中顯示Flash動畫,將Flash畫面映射到3D表面。同樣,3D對象和視頻也可以在Flash UI當中顯示。由此,Scaleform GFx即可以作為單獨的UI設計工具,也可以用來增強游戲前端界面設計功能。Scaleform已被大多數主流游戲引擎所集成。支持Scaleform GFx的游戲引擎中只需少量的代碼便可以使用。最新版本的Scaleform GFx 4.0直持Flash的大部分AS 3.0腳本。並且可以通過Flash實現3D的游戲UI界面。

      以上文字是從Scaleform的官網和宣傳手冊上扒下來的,而我這篇文章的題目是:"我所遭遇過的游戲中間件".對我來說"遭遇"這個詞,用在Scaleform上是最恰當不過了.Scaleform無疑是我使用過的最痛苦,最糾結的中間件.我從來沒有學過Flash,一直不會所謂的AS腳本.本來我以為需要Scaleform做的工作,僅僅是將其與我們項目中的引擎相結合.這一塊工作不難,但這僅僅是個開始,當Scaleform用到具體的游戲項目中時,出現過各種奇葩的問題.下面將吐嘈下我的遭遇:

(1)Scaleform的存在意義
     使用FLASH做游戲界面,可以讓界面更為靈活,易操作,易修改。但Scaleform並不是使用Flash的唯一選擇.另外一種方式是:其是通過GDI處理Flash界面.將Flash圖像通過GDI繪制出來后,保存到一個D3D的紋理結構中,再由引擎的D3D接口進行渲染。Scaleform的優勢在於:能夠直接調用引擎的D3D接口進行渲染,從而省去了GDI處理的這一步驟,所以能夠提高游戲效率。我將在下一篇文章中寫一下有關如何通過GDI處理Flash界面.

(2)Scaleform的版本升級
     Scaleform每個新版本都會修改它的一個渲染模塊.如果我們項目中直接將它的渲染模塊的lib拿來用,也無所謂了.但我們引擎中將所有與d3d相關的接口和資源做了層封裝.所以我需要重寫它的渲染模塊,而它每次版本升級,我都要將渲染模塊改一次,十分麻煩.從3版本開始,后來經歷了4.0,4.2,它小版本更新的很頻繁,我也不記得改過多少次的Scaleform渲染模塊.

(3)與其官方的扯皮交流
      當開發碰到問題時,與其官方交流是件很頭疼的事情.一般流程是:我先將問題描述一下,對方通常的回復是不明白我的描述,需要個DEMO.於是我改寫其官方提供的DEMO,將問題的重現出來.經過漫長的等待后,對方提供解決方案.有時對方還是不清楚我DEMO的意思,我又得再發信息解釋一下;有時問題會不了了之.最早之前,官方為我提供了可以發布問題的網站,但后來技術支持過期后,只能通過郵件聯系.郵件聯系的靠譜性比之前差遠了,回復的時間周期也長很多.而且我總覺得和我做郵件聯系的人是產品銷售,而不是正規的技術支持.

      舉個最近一個與其官方扯皮的問題:我發現其Text文本框中顯示的紋理資源,不能像普通控件中的紋理資源那樣做矩陣的剪裁處理.同一個紋理資源,顯示在文本框中是一個樣子,顯示在普通控件中是另外的樣子.經過若干封郵件以及電話的扯皮之后,對方終於明白這個Bug了.說是要尋問其國外的開發人員,最終得到的答復是Text文本框里顯示紋理資源就是這操行.問題從提出到得到最終答復,過了整整一個月,讓我有種想打人的沖動.

(4)渲染的Bug
      Scaleform中碰到最多的Bug是有關渲染方面的.Flash是一種很開放的平台,美術可以做出非常多元化,多樣性的Flash界面.總會出現在Adobe Flash播放器上播放正常的swf資源,在Scaleform的播放器上顯示不一樣.碰到這樣的問題,只能求助於它們官方.官方的解決方案要么給我們臨時修正的代碼,要么提供另外一種制作資源的方式.

      當然渲染方面的Bug不全是Scaleform的問題,也有Flash中的一些潛規則導致.但這些問題都會找到我頭上,有時我覺得自己很無辜,我又沒學過Flash,對Flash也沒有絲毫興趣,我所做的無非是將Scaleform封裝了一下,集成到引擎中,所有該拋出的接口都拋出了.在使用過程中碰到什么問題,我真沒有解決的道行.

(5)崩潰的Bug
      Scaleform是Autodesk的幾款中間件中唯一一個提供源碼的.但這代碼真不是人看的,記得有個Autodesk的人給我講,他們之所以對Scaleform提供源碼,是因為他們整個公司只有一個主程在搞Scaleform,也只有他能看懂這源碼.Scaleform大部分的崩潰都很難重現,而大部分崩潰堆棧都崩在其深深的函數調用中,有時會有深深的遞歸.這根本沒辦法查.而將這些崩潰堆棧發給他們官方,基本上不會給我們解決問題.之前使用的Scaleform是4.0版本,因為其后版本的開發環境最低是VS2008,而我們項目的開發環境還是VS2005.后來,沒辦法只能升級到4.2版本.Scaleform的lib是VS2008編譯的,在VS2005中使用,還需要給VS2005安裝一個補丁包.升級到4.2版本后,崩潰還算少了些,但也會有.

      基本上所有Scaleform的崩潰都是內存原因.內存申請失敗是最多的,這個也確實沒辦法徹底解決.Scaleform還有個潛規則是:flash的更新advance()需要與渲染display()相匹配.每次advance()時會申請一塊內存,在display()時釋放掉,如果不停的調用advance(),而不調用display(),遲早會崩在內存中.這個問題查了很久,當時發現將電腦鎖屏后,過上幾個小時解鎖一看,游戲崩潰了.

(6)AS3腳本
      Scaleform不是所有AS3的腳本都支持.好在GFX會對其不支持的腳本都會輸出LOD,其文檔中也記錄了所有不支持的腳本.腳本事件方面的坑不僅如此,由於我不懂AS腳本,這里的坑不歸我管.此外Scaleform對AS腳本的解析效率比較差.

(7)字體
      字體的顯示是個坑,需要確定加載哪個字庫,字庫的加載順序如何,字庫紋理的管理.開發者可以將某種字庫打包成SWF文件,供GFX使用.需要特別注意字庫的使用順序,如果操作系統中有該字庫,那么默認將使用系統字庫.而我發現在有些機器上,若使用系統字庫,渲染的字體會有明顯的鋸齒感.解決方法是修改GFX源碼,調整字庫的加載順序.此外,還碰到個坑是,打包的字庫顯示的字體有大有小,字庫中的某些文字顯示不正常等,這與字庫資源有關.

(8)多線程加載文件
      資源文件的多線程加載.Flash資源文件可以加載其他的資源,這時為了保證游戲的流暢,通常采用異步加載.這塊還算好搞,照它的文檔說明做就行.

(9)紋理剪裁
      紋理資源剪裁的實現,即將紋理的指定區域顯示在控件上.為了減少紋理文件的數目,將若干小紋理合並成一幅大紋理文件.設置給GFX時,需要設置該紋理的顯示區域.這個在它官方文檔中沒有太詳細的說明,只提供了個設置紋理顯示的矩陣,至於矩陣參數如何設置,我試了很久才試出來.

(10)鼠標右擊
      對鼠標右擊事件的響應,我就一直搞不明白為什么客戶端說Scaleform的右擊事件無影響,調到AS腳本中,就沒反映了,我總覺得這是客戶端邏輯的問題,我又不懂AS腳本.最終我的解決方法是,修改Scaleform的源碼,將左中右三種事件統統設置為左擊事件,然后篡改其點擊位置的X坐標,使左中右三種事件的X坐標值對3的余數分別為0,1,2.

(11)序列幀動畫
     不要在Flash中使用序列幀動畫,因為序列幀動畫會使Scaleform做像素拷貝處理,性能低下.還有些類似序列幀動畫的功能,只有在開啟了多線程渲染才能實現.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM