我所遭遇過的遊戲中間件---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作像素拷貝處理,性能低下.還有些相似序列幀動畫的功能,只有在開啓了多線程渲染才能實現.