Estou usando o Android Studio com Java e LibGDX.
O estúdio Android alerta sobre a draw
linha "Possível descarga dentro de um loop", com esta descrição detalhada:
Informações de inspeção: Procura pela possibilidade de um flush de um lote ou renderizador ocorrendo dentro de um loop, direta ou indiretamente. Por razões de desempenho, deve-se tomar cuidado para não causar flushes desnecessários e limitar o número de flushes por quadro o máximo possível.
DelayedRemovalArray<MyEntity> myEntities = ...;
bricks.begin();
for(MyEntity myEntity : myEntities) {
myEntity.draw(game.getBatch()); // warning: Possible flush inside a loop
}
bricks.end();
o método MyEntity.draw:
Matrix4 tempMatrix = new Matrix4();
Matrix4 originalMatrix = new Matrix4();
NinePatchDrawable ninePatchDrawable = ...;
public void draw(SpriteBatch batch) {
originalMatrix.set(batch.getTransformMatrix());
tempMatrix.set(originalMatrix);
tempMatrix
.translate(myEntity.width/2, myEntity.height/2, 0)
.rotate(0, 0, myEntity.angle, 10)
.translate(-myEntity.width/2, -myEntity.height/2, 0);
batch.setTransformMatrix(tempMatrix);
ninePatchDrawable.draw(batch, ...);
batch.setTransformMatrix(originalMatrix);
}
Se eu remover as duas batch.setTransformMatrix
chamadas, o aviso desaparece, mas preciso fazer isso, caso contrário, o ninepatch não será desenhado na posição correta, devido ao fato de que o método ninepatch.draw não considera o centro do corpo ao aplicar a rotação... Sobre esse problema com ninepatches, abri uma pergunta SO dedicada aqui
Então, como fazer isso sem receber esse aviso? Existe uma maneira melhor de fazer isso?
Obrigado
Não posicione entidades individuais definindo a transformação de
SpriteBatch
cada entidade; posicione entidades individuais com coordenadas que façam sentido na projeção em que o lote está configurado.Definir a matriz de transformação em um lote precisa liberar tudo o que já foi enviado para esse lote, pois tudo depois será desenhado com outra transformação.
Você pode ver isso no código-fonte para
SpriteBatch
.Normalmente, você não deve alterar a transformação do lote para cada entidade desenhada usando-o; a posição e a rotação de cada entidade são passadas na
draw
chamada (caso contrário,Batch
não será possível agrupar nada).Muitas vezes, o que você quer fazer é definir a visualização da câmera
SpriteBatch
antes dobegin
e então desenhar todas as entidades que usam essa projeção antes de chamarend
.No caso de um
NinePatchDrawable
, basta usar odraw
método que permite especificar a rotação e, se quiser que a rotação aconteça em torno do centro do `NinePatchDrawable', ajuste a origem pela metade da largura e altura: