Android Studio 中的“可能在循环内刷新”警告

问题描述 投票:0回答:1

我正在使用带有 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
调用,警告就会消失。

那么,如何在不收到警告的情况下做到这一点呢?有更好的方法吗?

谢谢

java libgdx
1个回答
0
投票

不要通过设置每个实体

SpriteBatch
的变换来定位单个实体,而是使用在设置批次的投影中有意义的坐标来定位单个实体。

在批次上设置变换矩阵需要刷新已提交到该批次的所有内容,因为之后的所有内容都将使用另一个变换绘制。

您可以在 SpriteBatch

 的源代码中看到 

您应该通常不会更改使用它绘制的每个实体的批次转换,每个实体的位置和旋转都在

draw
调用中传递(否则
Batch
无法批处理任何内容)。

通常您想要做的是将相机视图设置在

SpriteBatch
之前的
begin
上,然后在调用
end
之前绘制使用该投影的所有实体。

© www.soinside.com 2019 - 2024. All rights reserved.