我正在使用Python + pyglet开发一个老式的2D RPG。
地图由多个图层(最多10个)组成,每个图层由方形图块(32x32像素)构成。精灵(派对角色,NPC和其他一些东西)是在两层之间绘制的(通常在最后一层之前)。
为了渲染它,我使用单个Batch,包含许多OrderedGroups:每层一个组,每个sprite一个组。
精灵的问题在于它们必须以y值的递减顺序渲染,因此组的排列方式如下(假设地图中有3个图层,并且必须在最后一个之前绘制2个精灵) :
g[0] = OrderedGroup(0) : first layer
g[1] = OrderedGroup(1) : second layer
g[2] = OrderedGroup(2) : empty, serves as a base for the following :
OrderedGroup(0, parent = g[2]) : the highest sprite
OrderedGroup(1, parent = g[2]) : the lowest sprite
g[3] = OrderedGroup(3) : the third layer
当我向批处理中添加图层精灵时,我指定它们是静态的。当我添加派对精灵时,它们是“动态的”。
所以我的第一个问题是:既然它们都属于同一批,那不是很矛盾吗? (换句话说:是'静态'还是'动态'是sprite对象或批处理的属性?)(注意:我确切地说我对OpenGL知之甚少,并且不知道如何实现批处理和组)< / p>
目前,性能是正确的(我想要60 fps,我有8个移动精灵),但是超过8个移动精灵的性能会迅速降低(这不应该发生在最后的游戏中,但是我如果没有在C / ASM中翻译部件,我希望我的引擎是最有效的。)
所以我的第二个问题:我选择的策略(使用批次,尽可能少)是好的策略吗?
提前感谢您的答案
答案 0 :(得分:0)
我不是Pyton或Pyglet用户,但这里有一些提示:
您使用的是OpenGL
因此您不需要任何Y
和/或视图平面排序渲染。 Z-Buffer 将为您完成,因此绘制顺序可以是任何...除非您使用透明图块(在这种情况下,您别无选择)。
您提供的代码
但它实际上没有说明确保您不在渲染内对任何内容进行排序/分组。您似乎在每个帧上创建可以非线性地影响性能的有序列表。通常对于硬件加速代码都很好,直到你达到一些关键的瓶颈然后它突然变成地狱!!!
将图层地图保存在单独的2D地图中
那么你根本不需要任何排序/分组。如果对象从一个层转到另一个层,则只需相应地更新booth层