我正在使用带有 Java 和 LibGDX 的 Android Studio。
Android studio 警告
draw
行“可能在循环内刷新”,并附有详细说明:
检查信息:查找发生批处理或渲染器刷新的可能性 在循环内,直接或间接。出于性能原因 应注意不要引起不必要的冲洗,并限制 每帧的刷新次数尽可能多。
DelayedRemovalArray<MyEntity> myEntities = ...;
bricks.begin();
for(MyEntity myEntity : myEntities) {
myEntity.draw(game.getBatch()); // warning: Possible flush inside a loop
}
bricks.end();
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(1, 1, 0)
.rotate(0, 0, 1, 10)
.translate(-1, -1, 0);
batch.setTransformMatrix(tempMatrix);
ninePatchDrawable.draw(batch, ...);
batch.setTransformMatrix(originalMatrix);
}
如果我删除两个
batch.setTransformMatrix
调用,警告就会消失。
那么,如何在不收到警告的情况下做到这一点呢?有更好的方法吗?
谢谢
不要通过设置每个实体
SpriteBatch
的变换来定位单个实体,而是使用在设置批次的投影中有意义的坐标来定位单个实体。
在批次上设置变换矩阵需要刷新已提交到该批次的所有内容,因为之后的所有内容都将使用另一个变换绘制。
您可以在 SpriteBatch
您应该通常不会更改使用它绘制的每个实体的批次转换,每个实体的位置和旋转都在
draw
调用中传递(否则Batch
无法批处理任何内容)。
通常您想要做的是将相机视图设置在
SpriteBatch
之前的 begin
上,然后在调用 end
之前绘制使用该投影的所有实体。