2014-07-21 27 views
0

我試圖優化我的遊戲以獲得更好的性能。所以我試圖啓用腳本調用優化來使用Fast,但沒有例外,而不是Slow和Safe。問題是,當在該模式下我得到這個錯誤:遊戲無法以快速啓動,但沒有任何例外

PropertyToID can only be called from the main thread. 

我GOOGLE了一下,結果發現,它可能是由一些着色器引起的。但我不知道如何找出哪一個或哪個地方。它應該是一些在構造函數中的調用。

只有我在着色器上改變的東西在OnPostRender()函數中完成。我認爲沒關係。

+0

你使用'System.Threading'或其他線程API嗎?嘗試在另一個線程中使用Unity類時,通常會出現該錯誤。 – Jerdak

+0

只有在我使用System.threading的地方是在TextMeshPro插件https://www.assetstore.unity3d.com/en/#!/content/17662。難道是那個插件被竊聽?我在整個項目中使用它,所以真的很煩人,禁用它。 – gabrjan

+0

檢查你的調試,以找到'PropertyToID'被調用的地方,如果它在可能是問題的工作線程中。快速優化的問題在於它「沒有明確處理異常」,您提到的錯誤可能一直存在,但它卻悄然隱藏起來。 – Jerdak

回答

0

請確保您沒有從任何構造函數或字段初始值設定項調用Shader.PropertyToID。而不是將此代碼移至Awake()Start()方法。這樣的事情:

class MyClass: MonoBehaviour 
{ 
    int somePropertyID = Shader.PropertyToID("SomePropertyID"); //<-- ERROR: this is field initializer 

    MyClass()              //<-- ERROR: this is constructor 
    { 
     somePropertyID = Shader.PropertyToID("SomePropertyID"); 
    } 

    void Awake()             //<-- THIS IS OK! 
    { 
     somePropertyID = Shader.PropertyToID("SomePropertyID"); 
    } 

    void Start()             //<-- THIS IS OK! 
    { 
     somePropertyID = Shader.PropertyToID("SomePropertyID"); 
    } 
}