標籤:

【厚積薄發】開發WebGL項目,你需要了解這些...

【厚積薄發】開發WebGL項目,你需要了解這些...

來自專欄 UWA:簡單優化、優化簡單4 人贊了文章

這是第122篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收穫。

UWA 問答社區:answer.uwa4d.com

UWA QQ群:465082844(僅限技術交流)


WebGL

Q:目前我們有一個採用Spine的2D項目需要轉換成H5遊戲,請問直接使用Unity開發WebGL的項目,性能上會有哪些注意事項呢?

A:看題主的意思是想在移動設備上跑。我們項目(競速類)曾嘗試了直接用Unity 5轉為頁游版本,但是是運行在PC平台上的,手機上簡單了解過別人的項目,當時得出的初步結論是在移動設備上中重度的3D性能扛不住,這個沒有經過親自驗證。

我列下我們在Unity5轉PC頁游踩的坑供你參考下:

1)WebGL中不支持多線程和C#網路,可以用協程、Websocket代替;

2)我們有些協程用法寫得有問題,在協程函數中用了While(1)這種死循環等待資源載入完成,在其它平台下沒問題,但是在WebGL中會死循環,大概跟WebGL不支持多線程有關;

3)在遊戲載入資源過程中,隨著佔用內存增大,偶爾會內存溢出,這主要是我們資源沒有優化好導致的。我們在跟一個成熟的頁游團隊交流時,對方建議頁游內存不要超過256MB,需要很細緻地控制資源的載入和釋放;

4)建議使用LZ4壓縮格式,WebGL不支持多線程,LZMA壓縮的Bundle會導致主線程解壓縮時的卡頓;

5)單個資源體積不宜過大,建議控制在1MB以下,盡量做資源依賴打包,要不載入時間過長,很影響體驗;

6)WebGL不支持中文輸入,我們用原生的方式實現了中文輸入;

7)PC端一些瀏覽器直接不支持,我們測試支持的瀏覽器有:

  • Google Chrome 9+
  • 2.Mozilla Firefox 4+
  • Safari 5.1+(僅限Mac OS X操作系統,不包括Windows)
  • Opera 12 alpha以及以上版本
  • IE9+,但是IE並不支持WebGL,不過你可以通過下載並安裝IEWebGL這個插件
  • QQ 360 搜狗

8)資源如果沒有實例化使用,在Editor下不會閃退,但是打出的PC包和導出的WebGL版本都會閃退。

感謝趙林@UWA問答社區提供了回答,歡迎大家轉至社區進一步交流:

WebGL - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

堆內存

Q:從理論上來說,Mono堆內存是越小越好(UWA是建議控制在40MB以內),分配頻率越低越好。那單次比較大的內存分配和頻率很高的(比如每幀)小內存分配,在性能影響上誰更大呢?單次GC的耗時,是受總體堆大小影響較大,還是受堆內引用對象數量的影響較大?簡單來說,是要優先優化那些每幀分配的小內存還是單次較大的內存分配?GC對機器發熱的影響大嗎?

UWA:優先優化那些每幀都分配的小內存。這個對於GC到來的影響比較大。頻繁GC對於運行流暢性的影響比較大,從整體上來說,GC對於能耗的影響不大,比常規開銷(渲染模塊、UI模塊等)要小很多。

單次較高的堆內存分配,建議要注意2MB以上的分配,查看其分配是否合理,儘可能避免8MB以上的分配。它主要的麻煩點在於撐大Mono堆內存峰值,一旦上去了就下不來。

該回答由UWA提供

A:Mono堆內存峰值高,最大的影響是會撐大Mono內存的佔用量,而Mono向系統申請的內存是只增不減的。直白說就是遊戲內存佔用上升,風險是低內存設備上更容易閃退。

感謝Walker@UWA問答社區提供了回答

A:GC耗時肯定會受到影響。目前來講,無論是IL2CPP還是Mono,GC都不分代,這也就意味著,回收的時候會遍歷所有的節點。

感謝凱奧斯@UWA問答社區提供了回答

歡迎大家轉至社區進一步交流:

Mono堆內存優化的疑問 - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

資源管理

Q:大家是怎麼做代碼分離的?遊戲項目由於有多個部門需要共同訪問,為了保護源代碼,希望做到非技術部門在遊戲工程只拿到加密後的DLL文件。

最初的想法是,各個部門都是拿同一個遊戲工程,其中技術部直接獲取源碼,其他部門拿到DLL文件,技術編寫完成後生成DLL給其他部門更新。但發現Unity中掛腳本組件是通過GUID+FileID的方式去匹配的,所以拿源碼的同事是不同的腳本就有不同的GUID,拿DLL的同事則都是同一個GUID。導致不同部門之間沒法在同一個工程上製作。

現在的做法是另外創建一個編譯工程去生成各個平台對應的DLL文件,但是這樣又比較繁瑣。

PS:即使在已經做了模塊分隔的情況下,導入DLL的時間比更新少量cs文件的時間多出很多,請問大家有沒有更好的做法呢?

A1:這個我們是看部門需求的。

1)美術部門時常需要在Unity上調試效果,我們只對該部門提供帶加密好DLL的工程項目,指定目錄提交對應資源,並做好工具操作的提示。

2)策劃部門在Unity調效果不是硬需求(看各自公司的情況吧),可以提供可載入本地Lua代碼的exe包,讓業務提供配置代碼,並將該部分代碼對策劃開放(但由於有語法學習成本,可以在svn可hook一個語法檢查),或者工具打包到exe中。臨時想到這些,看看是否能幫到題主。

感謝蘭葉凜香@UWA問答社區提供了回答

A2:"導入DLL的時間比更新少量cs文件的時間多太多了,即使在已經做了模塊分隔的情況下"。這個問題我估計是題主沒加AssemblyInfo,導致Unity會掃描API,可以參考下:github.com/pangweiwei/s。只要大家用一個Unity版本速度會快很多。

再PS: 現在2018了為了一些代碼搞這麼麻煩性價比真心低。

感謝錢康來@UWA問答社區提供了回答

A3:如果業務邏輯都在Lua,那麼可以選擇加密Lua的bytecode,

如果業務邏輯也是C#寫的,那麼可以選擇不加密。

其實都到2018年年中了,代碼沒那麼值錢了。用DLL都會加大其他部門的使用繁瑣程度。

感謝史雲柯@UWA問答社區提供了回答

歡迎大家轉至社區進一步交流:

大家是怎麼做代碼分離的? - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

資源管理

Q:如果多個不同的Shader引用同一份cginc文件,實際上會被編譯多少次?

A:我理解的是,cginc 是被包含的,相當於編譯器預處理複製粘貼到了Shader文件里,可以看做並不存在cginc 這個文件,所以有幾個Shader文件包含了這個 cginc,就編譯幾次。

感謝jim@UWA問答社區提供了回答

UWA:cginc只是一些代碼片段,Shader用到某個cginc的時候就會把裡面對應的函數摳出來,在precompile的時候完成該項工作。所以,如果不同的Shader引用到了同一份cginc文件,其編譯並不是整個cginc文件參與編譯,而是Shader中用到的那一段代碼進行了編譯。

歡迎大家轉至社區進行進一步交流:

Unity 同一份cginc被不同的shader引用,實際編譯多少次??

answer.uwa4d.com圖標

動畫

Q:在一個動畫事件中實例化另一個動畫物體(使用Animator),發現實例化的物體並沒有直接開始動畫,而是顯示了一下默認姿態,在下一幀之後才開始了動畫。請問這個該如何處理呢?

UWA:動畫事件是動畫系統在進行了該幀動畫計算(Animation Evaluation)之後激活,如果在動畫事件中實例化動畫物體,該物體的animator不會在該幀進行動畫計算,而會等到下一幀時由動畫系統進行動畫計算。解決方案是在實例化動畫物體後,調用一下 Animator.Update(0).

該回答由UWA提供,歡迎大家轉至社區進行進一步交流:

實例化新的動畫物體後,動畫物體在下一幀才開始播放動畫 - UWA問答: 侑虎科技官方問答社區?

answer.uwa4d.com圖標

今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。

官網:www.uwa4d.com

官方技術博客:blog.uwa4d.com

官方問答社區:answer.uwa4d.com

官方技術QQ群:465082844(僅限技術交流)

封面圖片來自網路


推薦閱讀:

立體地圖的圖形細分
Cesium相關資料匯總
Muddy Driver (摩的大飈客)
基於 HTML5 的 WebGL 3D 版俄羅斯方塊
寫一個發光材質

TAG:WebGL | HTML5 | 科技 |