Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx:从多个纹理地图集渲染已排序的精灵_Java_Opengl_Libgdx_Depth Buffer - Fatal编程技术网

Java Libgdx:从多个纹理地图集渲染已排序的精灵

Java Libgdx:从多个纹理地图集渲染已排序的精灵,java,opengl,libgdx,depth-buffer,Java,Opengl,Libgdx,Depth Buffer,我需要在屏幕上的libgdx(平均20-30)中渲染对象,所有对象都按Y值排序,因此首先渲染Y值最低的精灵。(想想这个视角:) 游戏使用纹理地图集,每个地图集的大小为2048*2048 我目前有三个地图集。一个用于可玩角色,一个用于NPC角色,一个用于动物/怪物。最终,我们计划添加许多不同的对象、npc集等,因此将所有精灵混合到一个大地图册中是不可能的(在设计和硬件上都会受到很大限制) 当前的渲染方法首先按Y值对屏幕上每帧的对象进行排序,然后绘制它们。这是完美的,除了这样一个事实,即通过这种方式

我需要在屏幕上的libgdx(平均20-30)中渲染对象,所有对象都按Y值排序,因此首先渲染Y值最低的精灵。(想想这个视角:)

游戏使用纹理地图集,每个地图集的大小为2048*2048

我目前有三个地图集。一个用于可玩角色,一个用于NPC角色,一个用于动物/怪物。最终,我们计划添加许多不同的对象、npc集等,因此将所有精灵混合到一个大地图册中是不可能的(在设计和硬件上都会受到很大限制)

当前的渲染方法首先按Y值对屏幕上每帧的对象进行排序,然后绘制它们。这是完美的,除了这样一个事实,即通过这种方式,可以进行许多纹理切换

例如,渲染: -3只动物 -2全国人大常委会 -玩家 -1全国人大 -1只动物 -1全国人大 -2动物

需要7个纹理切换。这完全取决于对象在屏幕上的位置

按atlas排序精灵不是一个选项(先绘制动物,然后绘制npc,然后绘制玩家),因为这将使Y排序不可能

(我想到的第一件事是将纹理图集增加到8192*8192,但许多较旧的台式电脑和移动设备将无法运行游戏。我想到的第二件事是某种深度缓冲,但如果可能的话,我不确定如何做。)


在保持稳定帧速率的同时,必须使用什么方法来实现所需的结果(从多个纹理中排序精灵)?有什么可行的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个纹理切换,它不会显著影响性能。记住不要过早地优化。