Java Libgdx:从多个纹理地图集渲染已排序的精灵
我需要在屏幕上的libgdx(平均20-30)中渲染对象,所有对象都按Y值排序,因此首先渲染Y值最低的精灵。(想想这个视角:) 游戏使用纹理地图集,每个地图集的大小为2048*2048 我目前有三个地图集。一个用于可玩角色,一个用于NPC角色,一个用于动物/怪物。最终,我们计划添加许多不同的对象、npc集等,因此将所有精灵混合到一个大地图册中是不可能的(在设计和硬件上都会受到很大限制) 当前的渲染方法首先按Y值对屏幕上每帧的对象进行排序,然后绘制它们。这是完美的,除了这样一个事实,即通过这种方式,可以进行许多纹理切换 例如,渲染: -3只动物 -2全国人大常委会 -玩家 -1全国人大 -1只动物 -1全国人大 -2动物 需要7个纹理切换。这完全取决于对象在屏幕上的位置 按atlas排序精灵不是一个选项(先绘制动物,然后绘制npc,然后绘制玩家),因为这将使Y排序不可能 (我想到的第一件事是将纹理图集增加到8192*8192,但许多较旧的台式电脑和移动设备将无法运行游戏。我想到的第二件事是某种深度缓冲,但如果可能的话,我不确定如何做。)Java Libgdx:从多个纹理地图集渲染已排序的精灵,java,opengl,libgdx,depth-buffer,Java,Opengl,Libgdx,Depth Buffer,我需要在屏幕上的libgdx(平均20-30)中渲染对象,所有对象都按Y值排序,因此首先渲染Y值最低的精灵。(想想这个视角:) 游戏使用纹理地图集,每个地图集的大小为2048*2048 我目前有三个地图集。一个用于可玩角色,一个用于NPC角色,一个用于动物/怪物。最终,我们计划添加许多不同的对象、npc集等,因此将所有精灵混合到一个大地图册中是不可能的(在设计和硬件上都会受到很大限制) 当前的渲染方法首先按Y值对屏幕上每帧的对象进行排序,然后绘制它们。这是完美的,除了这样一个事实,即通过这种方式
在保持稳定帧速率的同时,必须使用什么方法来实现所需的结果(从多个纹理中排序精灵)?有什么可行的openGL技巧可以做到这一点吗?我应该担心每帧有6-7个纹理切换吗?事实上,如果你给你的演员指定的精灵作为属性,这应该不会是一个问题。渲染内容时从不加载任何内容。如果你创建了你的演员,你可以从地图册中加载精灵、纹理等,然后交给你的演员。大概是这样的:
Texture monster = getTextureByType(type);
Monster mon = new Monster(level, new Sprite(monster), screen, ai,npc);
在你的怪物(演员!)内部,你将它们保存为你的精灵。我想是普通的构造器
public Monster(int level, Sprite sprite, GameScreen screen, AIInterface ai,
boolean npc) {
this.life = 300;
this.curLife = 200;
this.ai = ai;
this.level = level;
this.sprite = sprite;
this.sprite.setRegion(0, 0, 32, 48);
}
绘图非常简单:
@Override
public void draw(SpriteBatch batch, float parentAlpha) {
if (alife) {
sprite.setPosition(this.getX() + ofset, this.getY());
sprite.draw(batch);
}
}
如果您这样做了,您将不会有任何帧率的问题。不是在演员数量这么少的情况下。简单地说,不要在绘制/渲染周期内加载纹理,它应该可以正常工作。多个Atlas不会有任何问题。地图册不用于渲染。它用于将多个纹理放入一个纹理中,以便更轻松地处理。从不从atlas中加载draw或render方法内部的内容。如果你这样做,你会得到一个非常糟糕的表现
对于排序,请使用insertionsort。这应该比szenario中的集合排序更快。也许每10帧就调用一次。你甚至不应该注意到它们在这么短的时间内排序不正确
private void sortList(Array<Actor> array) {
// double starttime = System.nanoTime();
for (int i = 1; i < array.size; i++) {
Actor temp = array.get(i);
int j = i - 1;
while (j >= 0 && array.get(j).getY() < temp.getY()) {
array.set(j + 1, array.get(j));
j--;
}
array.set(j + 1, temp);
}
// System.out.println("Time taken: " + (System.nanoTime() - starttime));
}
private void排序列表(数组){
//double starttime=System.nanoTime();
for(int i=1;i=0&&array.get(j.getY()
查看此链接,它是libgdx测试,测试中有z作为深度,但您可以使用y轴
你需要使用比较器对数组进行排序,这样会明显降低游戏的性能。我很感激你的回答,但实际上,我问的是完全不同的问题。。。问题在于openGL状态的更改。地图册已加载,但在渲染过程中,gpu必须切换纹理。当使用多个纹理时,这种切换就是问题所在。我确实会像这样渲染150个对象。每个物体都有自己的纹理。向我们展示一下你是如何渲染的,我们会弄明白的。你可能应该添加一些OpenGL标记和标题,因为这主要是OpenGL的问题,而不是Libgdx的问题?不要太担心纹理切换,即使你使用10种不同的纹理绘制屏幕,并且每次绘制都有20个纹理切换,它不会显著影响性能。记住不要过早地优化。