Unity – ValueType & boxing with Dictionary

最近為了讓舊專案可以在 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> 的結果:
enum_boxing_test
首先看到 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; }
}
最後, 有任何指教請務必留言讓大家互相學習學習 🙂

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.