Java 在libgdx-opengl中优化交替纹理

Java 在libgdx-opengl中优化交替纹理,java,android,opengl-es,libgdx,Java,Android,Opengl Es,Libgdx,我正在使用libgdx制作一个游戏,屏幕上的每个角色都由两个纹理(身体和头部图像)组成。当绘制数千个纹理时,渲染调用的数量非常高,因为在绘制交替纹理时,纹理需要不断重新绑定。如果我先画头部,然后画身体,我只做2次渲染调用,我的帧速率很高。但是,这样做会导致z顺序错误,当字符彼此经过时,很容易看到z顺序错误。是否有任何方法可以优化或缓存这些纹理,以便它们能够以正确的顺序绘制,并最小化opengl绑定?在批量绘制之前,您应该为对象保留一个z索引,并使用Comparator类按所需的顺序对其排序 让我

我正在使用libgdx制作一个游戏,屏幕上的每个角色都由两个纹理(身体和头部图像)组成。当绘制数千个纹理时,渲染调用的数量非常高,因为在绘制交替纹理时,纹理需要不断重新绑定。如果我先画头部,然后画身体,我只做2次渲染调用,我的帧速率很高。但是,这样做会导致z顺序错误,当字符彼此经过时,很容易看到z顺序错误。是否有任何方法可以优化或缓存这些纹理,以便它们能够以正确的顺序绘制,并最小化opengl绑定?

在批量绘制之前,您应该为对象保留一个z索引,并使用Comparator类按所需的顺序对其排序

让我们假设您有一个DisplayObject类,该类的实例是您的可视对象,它具有getZ()函数来检索对象的z索引 将显示对象存储在阵列中

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());
}