我正在使用带有 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(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);
}
如果我删除这两个batch.setTransformMatrix
调用,警告就会消失,但我需要这样做,否则 ninepatch 将不会绘制在正确的位置,因为 ninepatch.draw 方法在应用旋转时不考虑身体中心......关于 ninepatches 的这个问题,我在这里开了一个专门的 SO 问题
那么,如何才能做到不收到警告呢?有没有更好的方法呢?
谢谢
不要通过设置
SpriteBatch
每个实体的变换来定位单个实体,而是使用在批次设置的投影中有意义的坐标来定位单个实体。在批次上设置变换矩阵需要刷新已提交给该批次的所有内容,因为之后的所有内容都将使用另一个变换来绘制。
您可以在源代码中
SpriteBatch
看到这一点。通常,您不应该更改使用它绘制的每个实体的批次的变换,每个实体的位置和旋转都会在调用中传递
draw
(否则Batch
无法批处理任何内容)。通常您想要做的是在之前设置相机视图
SpriteBatch
,begin
然后在调用之前绘制使用该投影的所有实体end
。对于 的情况
NinePatchDrawable
,只需使用draw
允许您指定旋转的方法,如果您希望旋转围绕 `NinePatchDrawable' 的中心进行,则将原点调整为宽度和高度的一半: