2013-06-19 8 views
13

Le spriteBatch libgdx iniziano e terminano i metodi costosi per il processore o rallentano le prestazioni se li chiamo più volte?sta chiamando libgdx SpriteBatch begin and end method più volte costoso?

Ad esempio:

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 
} 

Sul codice di cui sopra mi basta chiamare solo 2 volte iniziano e finiscono. Ma voglio farlo 4 o 5 volte .... questo rallenterà?

risposta

9

Non è costoso. Non preoccuparti. Ricorda che non è necessario, se si utilizzano trame diverse non è necessario chiamare inizio e fine per ciascuna. cambia automaticamente la trama per la regione che stai disegnando. Ovviamente, questo significa che devi raggruppare le chiamate di disegno delle regioni.

questo lo spiegherà meglio, supponiamo di avere un atlante con tutti i TextureRegions di Hero e nemici, e un altro con tutte le TextureRegions di monete e piattaforme:

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

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

Come un po 'di più, non v'è un caso speciale: di solito hai uno sfondo che riempie tutto lo schermo, totalmente opaco. Disabilitare la fusione per tale estrazione migliora decisamente le prestazioni. Quindi in batch una volta per esso, e poi di nuovo per le altre regioni, come questo:

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

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

grazie a @lestat, in realtà sto progettando di eseguire il rendering di un tileMap strato per livello e disegnare qualcosa tra quel livello, ma per farlo ho bisogno di iniziare come fine. inserire il codice qui public void render (float delta) { . . // Disegna strato tile batch.begin(); stage.draw(); batch.end(); // disegna un altro strato di piastrelle batch.begin(); // disegna un'altra trama batch.end(); // disegnare l'ultimo strato di piastrelle } quindi devo chiamare più volte per raggiungere il mio obiettivo. comunque grazie per il vostro responso. –

+0

Il miglioramento delle prestazioni in background può causare differenze visive sull'applicazione? –

+0

No, non causerà alcuna differenza visiva .. – Lestat

4

Passando da 2 chiamate a 5 chiamate non sta per essere troppo grande di un affare.

Tuttavia, in generale, la chiamata end fa sì che un batch svuoti tutto lo stato accumulato e invochi la chiamata di richiamo OpenGL sottostante. (Può sciacquare prima se si riempie, o si cambia trama, ma generalmente lo svuotamento avviene al tempo end.) La riduzione delle chiamate di richiama OpenGL e dei caricamenti trama è la motivazione principale per la classe SpriteBatch.

Ci sono alcuni contatori su SpriteBatch che è possibile utilizzare per vedere come si sta effettivamente facendo in pratica che ti aiuterà a sottolineare se lo stai facendo troppo. Vedi https://code.google.com/p/libgdx/wiki/SpriteBatch#Performance_tuning

+0

risposta molto bella, grazie! –

Problemi correlati