【厚積薄發】開發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問答: 侑虎科技官方問答社區
堆內存
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問答: 侑虎科技官方問答社區資源管理
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,可以參考下:https://github.com/pangweiwei/slua/blob/master/Assets/Slua/Editor/LuaCodeGen.cs#L544。只要大家用一個Unity版本速度會快很多。
再PS: 現在2018了為了一些代碼搞這麼麻煩性價比真心低。
感謝錢康來@UWA問答社區提供了回答
A3:如果業務邏輯都在Lua,那麼可以選擇加密Lua的bytecode,
如果業務邏輯也是C#寫的,那麼可以選擇不加密。其實都到2018年年中了,代碼沒那麼值錢了。用DLL都會加大其他部門的使用繁瑣程度。感謝史雲柯@UWA問答社區提供了回答
歡迎大家轉至社區進一步交流:
大家是怎麼做代碼分離的? - UWA問答: 侑虎科技官方問答社區資源管理
Q:如果多個不同的Shader引用同一份cginc文件,實際上會被編譯多少次?
A:我理解的是,cginc 是被包含的,相當於編譯器預處理複製粘貼到了Shader文件里,可以看做並不存在cginc 這個文件,所以有幾個Shader文件包含了這個 cginc,就編譯幾次。
感謝jim@UWA問答社區提供了回答
UWA:cginc只是一些代碼片段,Shader用到某個cginc的時候就會把裡面對應的函數摳出來,在precompile的時候完成該項工作。所以,如果不同的Shader引用到了同一份cginc文件,其編譯並不是整個cginc文件參與編譯,而是Shader中用到的那一段代碼進行了編譯。
歡迎大家轉至社區進行進一步交流:
Unity 同一份cginc被不同的shader引用,實際編譯多少次?
動畫
Q:在一個動畫事件中實例化另一個動畫物體(使用Animator),發現實例化的物體並沒有直接開始動畫,而是顯示了一下默認姿態,在下一幀之後才開始了動畫。請問這個該如何處理呢?
UWA:動畫事件是動畫系統在進行了該幀動畫計算(Animation Evaluation)之後激活,如果在動畫事件中實例化動畫物體,該物體的animator不會在該幀進行動畫計算,而會等到下一幀時由動畫系統進行動畫計算。解決方案是在實例化動畫物體後,調用一下 Animator.Update(0).
該回答由UWA提供,歡迎大家轉至社區進行進一步交流:
實例化新的動畫物體後,動畫物體在下一幀才開始播放動畫 - UWA問答: 侑虎科技官方問答社區今天的分享就到這裡。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之「石」,也能攻你之「玉」。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com官方問答社區:answer.uwa4d.com官方技術QQ群:465082844(僅限技術交流)
封面圖片來自網路
推薦閱讀:
※立體地圖的圖形細分
※Cesium相關資料匯總
※Muddy Driver (摩的大飈客)
※基於 HTML5 的 WebGL 3D 版俄羅斯方塊
※寫一個發光材質