最近為了讓舊專案可以在 WebGL 上執行, 開發各種深掘效能開銷的問題.
順便推薦一下 UWA 這個網站, 是專注在優化 unity 效能的範疇. (目前從台灣看會有很多圖看不到就是…)
某天爬文中才發現是我在 unity 大會上相當關注的講師張鑫所創立的網站, 內容真的很扎實!!
在其中一篇重複使用 WaitForSeconds 之類 yield 物件的 script 中看到 ValueType 的 boxing 問題的註解.
其實也不是第一次看到, 但這次就認真看了相關文章&做了些測試, 留些紀錄給後人省些時光~
環境: unity 5.6.0p2
※因為我手邊的 WebGL 測試專案一直無法實機連回 Profiling, 所以這裡只以 editor 裡的資訊推斷.
針對在專案使用頻率最高的 Dictionary<K, V> 的使用情境進行測試.
enum 作為 key 值在這個版本會有大量 GC 產生.
下面我透過 unity 本身的 profilier 測試 Dictionary<K,V> 的結果:

首先看到 int/float 的部分是使用 GenericEqualityComparer, 沒有產生多餘的 GC.
接著是最上面的 ‘default dict’ , 則會使用 DefaultComparer, 產生了不少 GC.
最後看到 ‘custom dict’ , 使用自訂的 csTypeComparer, 無論在 CPU or GC 上, 都明顯優於上述的任何一種方式!!
以下是我的 Comparer 內容, 只適用於特定的場合使用嘿~ (或者根本就錯的 XD)
class csTypeComparer : IEqualityComparer<MyType> { public bool Equals(MyType x, MyType y) { return (int)x == (int)y; } public int GetHashCode(MyType obj) { return (int)obj; } }
最後, 有任何指教請務必留言讓大家互相學習學習 🙂