2013-06-19 43 views
13

libgdx SpriteBatch開始和結束方法對於處理器而言是否昂貴,或者如果我多次調用它們會使性能變慢?正在調用libgdx SpriteBatch開始和結束方法多次昂貴?

例如:

public void render(float delta) { 
GL10 gl = Gdx.gl10; 
gl.glClearColor(0, 0, 0, 0); 
gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 

batch.begin(); 
//draw something 
batch.end(); 
//do something before draw the others 
batch.begin(); 
//draw others 
batch.end(); 
//update 
//controls 
} 

在上述我的代碼只是只調用2次開始和結束。但我想做4到5次....這會減慢速度嗎?

回答

9

這並不昂貴。別擔心。請記住,如果您使用不同的紋理,則不必爲每個紋理調用開始和結束。它會自動切換您正在繪製的區域的紋理。當然,這意味着您必須將區域的繪圖調用分組。

這將更好地解釋它,假設我們有英雄和敵人的所有TextureRegions圖譜,和另一個硬幣和平臺的所有TextureRegions:

//You only need to call batch.begin once: 

batch.begin(); 
//then draw 
//-Hero 
//-Enemies 
//(Automatic texture switching here) 
//-Coins 
//-Platforms 
batch.end(); 

作爲一個小加,有一個特例:通常你有一個填充所有屏幕的背景,完全不透明。所以禁用混合的抽獎肯定會提高性能。所以,你批一次,然後再對其他地區,像這樣:

batch.disableBlending(); 
batch.begin(); 
//draw background 
batch.end(); 

batch.enableBlending(); 
batch.begin(); 
//etc 
+1

感謝@lestat,實際上IM規劃渲染了一層又一層tilemap的和得出層之間的事,但要做到這一點我需要做的像開始結束。 在此輸入代碼 public void render(float delta){ 。 。 //繪製平鋪圖層 batch.begin(); stage.draw(); batch.end(); //繪製另一個圖塊層 batch.begin(); //繪製另一個紋理 batch.end(); //得出最後的區塊層 } 所以我必須調用開始多次以實現我的目標。無論如何感謝您的答覆。 –

+0

您的背景是否會改善應用程序的視覺效果? –

+0

不,不會造成任何視覺差異。 – Lestat

4

2個通話將5次通話是不會太大的交易的。

但是,通常,end調用會導致批處理清除其累積的所有狀態,並調用基礎OpenGL繪製調用。 (如果它填滿,它可能會提前刷新,或者您切換紋理,但通常在end時間發生刷新。)減少OpenGL繪製調用和紋理上傳的調用是SpriteBatch類的主要動機。

SpriteBatch上有一些計數器,您可以使用它來了解它在實際中的實際操作情況,以幫助指出您是否做得太多。見https://code.google.com/p/libgdx/wiki/SpriteBatch#Performance_tuning

+0

非常好的答案,謝謝! –