unity 優化之三

2021-09-22 01:29:03 字數 3466 閱讀 6531

處理字串和文字是unity專案中效能問題的常見原因。在c#中,所有字串都是不可變的

。對字串的任何操作都會導致分配乙個全新的字串。這是相對昂貴的,並且當在大型字串,大型資料集或緊密迴圈中執行時,重複的字串連線可能會出現效能問題。

此外,由於n個字串連線需要分配n-1個中間字串,因此序列連線也可能是管理記憶體壓力的主要原因。

對於必須在緊密迴圈或每個幀中連線字串的情況,請使用stringbuilder執行實際的連線操作。stringbuilder例項也可以重用,以進一步減少不必要的記憶體分配。

unity不使用字串名稱來解決animator,material和shader

內部屬性。對於速度,所有屬性名稱都被雜湊為屬性id,而這些id實際上用於定址屬性。

因此,每當在animator,material或shader上使用set或get方法時,請使用整數值方法而不是字串值方法。字串方法只執行字串雜湊,然後將雜湊id**給整數值方法。

從字串雜湊建立的屬性id在單次執行過程中是確定性的。使用它們的最簡單方法是為每個屬性名稱宣告乙個靜態唯讀整數變數,並使用整數變數代替字串。這些在啟動期間自動初始化,無需進一步的初始化**。

適當的api是animator.stringtohash用於animator屬性名稱,shader.propertytoid用於material&shader屬性名稱

mono和il2cpp

執行時處理以特定方式從unityengine.object派生的類的例項。在例項上呼叫方法實際上會呼叫引擎**,引擎**必須執行查詢和驗證才能將指令碼引用轉換為本機引用。雖然很小,但是將此型別的變數與null進行比較的成本比與純c#類的比較要昂貴得多。因此,請避免在緊密迴圈或每幀執行的**中進行這些空比較。

對於向量和四元數

數學中的緊湊迴圈,請記住整數數學比浮點數學更快,浮點數學比向量,矩陣或四元數學更快。

因此,每當交換或關聯算術允許時,嘗試最小化單個數**算的成本:

vector3 x;

int a, b;

// less efficient: results in two vector multiplications

vector3 slow = a * x * b;

// more efficient: one integer mult, one vector mult

vector3 fast = a * b * x;

對於必須在html格式的顏色字串(#rrggbbaa)和unity的本機colorcolor32結構之間進行轉換的應用程式來說,通常使用統一社群中的指令碼。由於字串操作,此指令碼速度很慢並導致大量記憶體分配。

從unity 5開始,有乙個內建的colorutility api可以有效地執行這些轉換。應首選使用內建api。

一般的最佳做法是消除生產**中的所有使用object.findobject.findobjectoftype生產**。由於這些api要求unity迭代所有gameobjects

記憶體和元件,隨著專案範圍的擴大,它們會迅速變得不具備效能。

可以在單例物件的訪問器中對上述規則進行例外處理。全域性管理器物件經常暴露「例項」屬性,並且通常findobjectoftype在getter中呼叫以檢測單例的預先存在的例項:

class somesingleton 

if(_instnace == null)

return _instance;}}

}

雖然這種模式通常是可以接受的,但檢查**並確保在場景中

呼叫訪問器非常重要中單個物件不存在的位置。如果getter沒有自動建立缺失單例的例項,那麼很常見的是發現尋找單例的**會導致重複呼叫findobjectoftype(通常每幀多次)並且會導致不希望的效能消耗

在內部,unity的camera.main屬性呼叫object.findobjectwithtag,乙個專門的變體object.findobject。訪問此屬性並不比呼叫更有效object.findobjectoftype。如果**必須指向主攝像機

,強烈建議您執行以下兩項操作之一:

unityengine.debug日誌記錄api不是由非開發版本剝離,也寫入日誌檔案,如果呼叫。由於大多數開發人員不打算在非開發版本中編寫除錯資訊,因此建議在自定義方法中包含僅開發日誌記錄呼叫,如下所示:

namespace nxfish

}

通過使用[conditional]屬性修飾這些方法,條件屬性使用的定義或定義確定裝飾方法是否包含在已編譯的源中。

如果未定義傳遞給conditional屬性的任何定義,則編譯出裝飾方法和對trim方法的所有呼叫。效果與方法和對方法的所有呼叫都包含在#if … #endif預處理程式塊中時會發生的情況相同。

附加:使用conditional屬性的方法受到以下限制:

1、條件方法必須是類宣告或結構宣告中的方法。如果在介面宣告中的方法上指定conditional屬性,將出現編譯時錯誤;

2、條件方法不能是介面方法的實現。否則將發生編譯時錯誤;

3、條件方法必須具有void返回型別

4、不能用override修飾符標記條件方法。但是,可以用virtual修飾符標記條件方法。此類方法的重寫方法隱含為有條件的方法,而且不能用conditional屬性顯式標記。

注:環境變數(或條件編譯符號)的設定方法有三:

1)用#define定義以及#undef取消定義,在所有using命名空間前面定義;

2)用編譯器命令列選項(例如,/define:debug),在「專案——右鍵——屬性——生成——常規欄」下的條件編譯符號(y)中設定(如果多個,可以用英文逗號隔開)。debug版本下,系統預設設定了debug和trace;

3)用作業系統外殼程式中的環境變數(例如,set debug=1)

說明:1、debug可以看做是宣告的乙個變數,但此變數沒有真正的值,存在時#if debug結果為true,否則為false;

2、#define單獨用沒什麼意義,一般是和#if或者conditional特性結合使用;

3、#define必須定義在所有using命名空間前面;

4、debugdebug是不同的,c#區分大小寫

MySQL優化索引之三表優化

建表sql create table if not exists phone phoneid int 10 unsigned not null primary key auto increment,card int 10 unsigned not null engine innodb insert ...

MySQL 資料庫效能優化之(三)索引優化

大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面這幾個問題來做乙個簡要的分析,同時排除了業務場景所帶來的特殊性,請不要糾結業...

Unity優化 Unity優化技巧高階開篇

所謂的優化,目的應該是盡可能減弱某種消耗,而在unity上來說,大概可以分為以下幾種 程式的執行速度,一般是指執行幀率,也包括載入速度。是我們首要考慮的重點,也是將會花最多的精力去 的話題,執行幀率是遊戲類專案的乙個非常重要的效能指標,幀率的下降將直接導致遊戲體驗的下降。程式的資源消耗,一般是指包體...