Java 在libgdx-opengl中优化交替纹理
我正在使用libgdx制作一个游戏,屏幕上的每个角色都由两个纹理(身体和头部图像)组成。当绘制数千个纹理时,渲染调用的数量非常高,因为在绘制交替纹理时,纹理需要不断重新绑定。如果我先画头部,然后画身体,我只做2次渲染调用,我的帧速率很高。但是,这样做会导致z顺序错误,当字符彼此经过时,很容易看到z顺序错误。是否有任何方法可以优化或缓存这些纹理,以便它们能够以正确的顺序绘制,并最小化opengl绑定?在批量绘制之前,您应该为对象保留一个z索引,并使用Comparator类按所需的顺序对其排序 让我们假设您有一个DisplayObject类,该类的实例是您的可视对象,它具有getZ()函数来检索对象的z索引 将显示对象存储在阵列中Java 在libgdx-opengl中优化交替纹理,java,android,opengl-es,libgdx,Java,Android,Opengl Es,Libgdx,我正在使用libgdx制作一个游戏,屏幕上的每个角色都由两个纹理(身体和头部图像)组成。当绘制数千个纹理时,渲染调用的数量非常高,因为在绘制交替纹理时,纹理需要不断重新绑定。如果我先画头部,然后画身体,我只做2次渲染调用,我的帧速率很高。但是,这样做会导致z顺序错误,当字符彼此经过时,很容易看到z顺序错误。是否有任何方法可以优化或缓存这些纹理,以便它们能够以正确的顺序绘制,并最小化opengl绑定?在批量绘制之前,您应该为对象保留一个z索引,并使用Comparator类按所需的顺序对其排序 让我
Array<DisplayObject> displayObjects
declare a comparator one time
comparator = new Comparator<DisplayObject>() {
@Override
public int compare(DisplayObject object1, DisplayObject object2) {
return (int) Math.signum(object1.getZ() -
object2.getZ());
}
};
绘制所有对象
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
有关Comparator的更多信息,请打开此链接
您需要拆分循环:
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
对于2个循环,如果头部和身体放置在不同的TextureClass上,因为每个纹理切换都调用flush():
使用纹理打包减少opengl重新绑定的数量。见:
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
}
for(DisplayObject displayObject : displayObjects) {
batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}