Подтвердить что ты не робот

Вызывает метод 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 раз.... будет ли это замедлять работу?

4b9b3361

Ответ 1

Это не дорого. Не волнуйтесь. Просто помните, что вам не нужно, если вы используете разные текстуры, вам не нужно называть начало и конец для каждого. он автоматически переключает текстуру для региона, который вы рисуете. Конечно, это означает, что вам нужно группировать призывы рисования регионов.

Это объяснит это лучше, предположим, что у нас есть атлас со всеми TextureRegions of Hero и Enemies, а другой со всеми TextureRegions of Coins и Platforms:

//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

Ответ 2

Переход от 2 вызовов к 5 вызовам не будет слишком большим для сделки.

Однако, в общем случае вызов end заставляет пакет очищать все состояние, которое он накопил, и вызывать основной вызов рисования OpenGL. (Он может закрашиваться раньше, если он заполняется, или вы переключаете текстуры, но, как правило, сброс происходит в end время.) Уменьшение количества вызовов вызовов OpenGL и загрузки текстур является основной мотивацией для класса SpriteBatch.

На SpriteBatch есть несколько счетчиков, которые вы можете использовать, чтобы увидеть, как на самом деле это делается на практике, что поможет указать, слишком ли вы делаете это. См. https://code.google.com/p/libgdx/wiki/SpriteBatch#Performance_tuning

Ответ 3

как насчет вызова batch.flush()? какой-нибудь существенный удар по производительности там?