2016-01-22 81 views
0

我的項目是爲Android。我需要在渲染幀後運行代碼。這是因爲對於不同的幀,渲染時間可能會有些不同。我有一些耗時的網格和對撞機創建例程(因此基本上沒有多線程的空間,因爲它與Unity的API直接交互)。比方說,探查顯示是這樣的:需要渲染幀後運行協程

enter image description here

當我做我的協程我不知道渲染多少時間。所以我無法確定我對協程有多少時間的預算,什麼時候放棄它。它可能是20ms,也可能是1ms。

讓我們爲協同執行預留一個固定的時間,比如10ms,並假設目標幀速率爲30,物理時間可以忽略不計。現在,如果渲染需要5ms,那麼5 + 10 = 15ms,我放棄了使用15毫秒的機會。相反,如果幀具有尖峯並花費25ms,則25 + 10 = 35ms,並且大於30FPS目標幀率,導致可見的FPS下降。所以無論哪種方式,持續時間都會有非常糟糕的後果

但是如果我可以在渲染時間之後運行代碼,我可以確切地知道我有多少時間在屏幕刷新並在合適的時機屈服,而不會浪費寶貴的時間或用我自己的雙手創建秒殺的風險! !

我知道代碼按照團結的執行順序http://docs.unity3d.com/Manual/ExecutionOrder.html運行。我需要一種解決方法或任何可行的策略來可靠地進行協程。

+1

也許你可以使用[this。](http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html) –

+1

只是一個說明,協程和多線程沒有任何關係, –

+0

@BarışÇırıkaWOW !沒有看到那個。謝謝 –

回答

1
IEnumerator MyCoroutine() 
{ 
    while(true){ 
     yield return new WaitForEndOfFrame(); 
     // My code 
    } 
} 

http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

如文檔提到,等待所有的工作要做,右交換緩衝區之前。之後我認爲你不可能做任何事情,而不會破壞引擎。

+0

這正是我需要的。 –