我需要在屏幕上呈现libgdx (平均20-30)中的对象,所有对象都按Y值排序,因此首先呈现Y值最低的精灵。(想想这个透视图:http://i.stack.imgur.com/m1VQA.gif )
游戏使用纹理地图集,每个都有2048*2048的大小。
我现在有三个地图集。一个用于可玩角色,一个用于NPC角色,另一个用于动物/怪物。最后,我们计划添加许多不同的对象、npc集等等,因此将所有的精灵混合到一个大地图集中是不可能的(在设计和硬件方面都可能受到很大的限制)。
当前的呈现方法首先根据Y值对屏幕上的每一帧对象进行排序,然后绘制对象。这是完美的工作,除了事实,这样,许多纹理转换可以发生。
例如:-3只动物-2只npc的玩家-1只npc -1只动物-1只npc-2只动物,
将需要7纹理切换。这完全取决于对象在屏幕上的位置。
根据地图集分类精灵不是一种选择(首先画动物,然后是npc,然后是玩家),因为这将使Y排序不可能。
(我想到的第一件事是将纹理地图集增加到8192*8192,但许多较老的台式电脑和移动设备将无法运行游戏。我想到的第二件事是某种深度缓冲,但如果可能的话,我不知道该如何做。)
必须使用什么方法才能达到预期的结果(从多个纹理中分离出精灵),同时保持稳定的帧速率?是否有任何可行的openGL技巧来做到这一点?我应该担心每帧有6-7个纹理开关吗?
发布于 2014-01-07 13:23:09
发布于 2014-01-07 12:42:03
实际上,如果你给你的演员指定的雪碧作为attribut,那就不成问题了。你从不在渲染东西的时候装载任何东西。如果您创建您的演员,您确实加载了精灵,纹理等从阿特拉斯,并把它给你的演员。就像这样:
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);
}
}如果你这样做,你将不会有任何问题的框架。不是在这么低的演员人数下。简单地说,不要加载纹理在绘制/渲染周期内,它应该工作没有任何问题。多个地图集也不会有任何问题。地图集不是用来渲染的。它用于将多个纹理放入一个纹理中,以便更容易地处理。您从不从地图集中加载绘图或呈现方法中的某些内容。如果你这样做,你会得到一个非常糟糕的表现。
对于排序,请使用插入排序。这应该比您的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));
}https://stackoverflow.com/questions/20971539
复制相似问题