Unity移動遊戲優化解決方案 前篇

2021-07-11 22:39:37 字數 1454 閱讀 5080

在今年的cj cgdc 中國遊戲開發者大會上,來自unity大中華區的技術支援經理張鑫帶來了關於《全新的unity移動遊戲優化解決方案》的精彩主題演講。本次演講分享的內容,包括從渲染模組、物理模組、動畫模組的cpu優化;如何對堆記憶體的管理以及面對記憶體洩露和資源冗餘的解決方案;以及對**的優化處理。

cpu優化

首先通過profiler來找到具體的瓶頸,通過profiler可以看到每一幀裡每個函式的具體開銷。

自身邏輯**效率

如果我們的**邏輯很複雜,上萬行,那麼可以借助begin/endsample 來拆分,得到真正開銷大的**塊。

渲染模組效率

在移動裝置上,半透明渲染的開銷是需要特別注意的(像花,樹,草等),因為在移動裝置上會造成更多的overdraw

不同的裝置對drawcall的敏感度不同,因此可以針對裝置做乙個「lod」,在高階機上允許更多的drawcall(即可以開啟更多的特效等)。

動畫模組效率

meshskinning.update 是蒙皮計算的開銷,animator.update 是骨骼動畫的更新開銷。optimizegameobject的優化選項預設是關閉的。在紅公尺上,乙個100人的測試案例中,開啟之後,前者可以提高70%的效率,而後者可以提高30%的效率。

另乙個測試也是在紅公尺上,200人同屏,單個角色400個頂點,560面左右,動畫的總時長為6秒,骨骼數量平均為12個。通過序列幀的形式實現skinnedmeshrenderer到meshrenderer 的轉換。可以跑到25幀。

bakemesh (skinnedmeshrenderer.bakemesh)

ui模組效率

上圖是乙個ui的例子,由一位工程師在兩周左右的時間完成,美術除外(來自scaleform在assetstore上的資源)。

ui系統的渲染順序是由ui元素在hierarchy中的順序決定的。而ui系統會通過重排ui元素的渲染順序來減少drawcall,但前提是不改變渲染結果。因此發生重疊之後,drawcall可能會上公升。

記憶體管理

遊戲製作的中後期通常會開始遇到記憶體上的問題。

•used total:當前幀的unity記憶體、mono記憶體、gfxdriver記憶體、profiler記憶體的總和。

mono記憶體有80%的團隊都不太關心,但卻是很重要,會影響遊戲的流暢性。

stacktraceutility.postprocessstacktrace ()

stacktraceutility.extractstacktrace()

log的輸出不僅會消耗cpu,同時也會引起較大的堆記憶體分配。

**優化

這部分耗時的避免,可以通過將shader打入單獨的assetbundle包,並在進入場景時就進行預載入。

同一時間load過多的非「基礎」ab,且不及時unload,會導致過多的記憶體消耗,如webstream 和serialized file 的記憶體。

小結:效能優化是沒有定式的,它需要「因時因地」制宜。

HIVE優化 解決方案

1.開啟並行引數 set hive.exec.parallel true set hive.exec.parallel.thread.number 16 同乙個sql允許最大並行度,預設為8 2.負載均衡引數 只針對groupby操作的傾斜 set hive.groupby.skewindata t...

Hbase的優化解決方案

1.hbase的periodic flusher 一般hbase在預設情況下回自動觸發flush操作,初衷是為了防止有些memstore長時間不flush,在沒有進行wal的情況下,出現資料的丟失.由於我們的hbase每個region server 有將近100個resign,幾乎每分鐘都有regi...

App啟動優化解決方案

首先,定義執行緒排程類,dispatcherexecutor。這個類的主要作用就是初始化執行緒池,作為接收所有任務的容器類。在oncreate方法中,初始化任務物件,然後將各個物件塞入任務容器,這裡邊會有乙個演算法的操作,稱為有向無環圖的拓撲排序,將有依賴關係的各任務執行關係進行排序,排序好的任務會...