Медленно выполняется то, что заставляет пакет спрайтов «сбрасываться», что означает, что он должен выполнить ряд команд OpenGL и передать данные вершин и т. Д. Сброс происходит при вызове spriteBatch.end()
, но также происходит, еслиyou:
- Нарисуйте что-нибудь с экземпляром текстуры, отличным от последнего нарисованного объекта
- Измените матрицы проекции или преобразования
- Включите / отключите смешивание
Итак, вы хотите организовать, чтобы не вызывать сброс на каждый нарисованный объект.Обычно это делается для запуска пакета, а затем каждый спрайт рисуется в определенном месте одним из методов spriteBatch.draw()
, который включает в себя все необходимые параметры.Например:
batch.setProjectionMatrix(camera.combined);
batch.begin();
for (GameObject obj : myGameObjects)
obj.draw();
batch.end();
//And in your game object / sprite class
public void draw() {
if (texture == null)
return;
spriteBatch.setColor(1f, 1f, 1f, getAlpha());
spriteBatch.draw(texture, -size.width / 2, -size.height / 2, size.width, size.height);
}
Обратите внимание, что в приведенном выше примере предполагается, что вы ссылаетесь на один и тот же экземпляр пакета спрайтов в каждом объекте.
Теперь, чтобы заставить его вести себя больше как SpriteKit (я предполагаю,так как я не использовал его), каждый из ваших объектов нуждается в преобразовании.Но вы не хотите звонить setTransformMatrix
, иначе вы вызовете флеш.Вместо этого вы можете использовать класс Affine2 вместо Matrix4.Он также функционирует для хранения данных преобразования для 2D-объекта.Затем вы можете использовать spriteBatch.draw(textureRegion, width, height, affine2Transform)
, чтобы нарисовать его без запуска сброса.
Чтобы избежать запуска сброса при использовании разных экземпляров текстуры, вы должны использовать TextureAtlas и области текстуры.Вы можете прочитать об этом в документации LibGDX на их вики.
Кроме того, при использовании SpriteBatch вам не нужно делать вызовы OpenGL для включения и отключения смешивания.Это обрабатывается внутри SpriteBatch.Позвоните spriteBatch.enableBlending()
вместо.