2014-07-21 30 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"); 
    } 
}