平铺地图和精灵:我这样做对吗



我正在用Python+pyglet开发一个老式的2D RPG。

地图由几层(最多10层)组成,每层由正方形瓷砖(32x32像素)组成。精灵(派对角色、NPC和其他一些东西)绘制在两层之间(通常在最后一层之前)。

为了渲染它,我使用了一个批次,其中有许多有序组:每层一组,每个精灵一组。

精灵的问题是,它们必须按照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知之甚少,也不知道批和组是如何实现的)

目前,性能是正确的(我想要60帧/秒,我有最多8个移动的精灵),但如果超过8个移动精灵,性能会迅速下降(这在最终游戏中不应该发生,但我希望我的引擎尽可能高效,而无需在C/ASM中转换部分)。

所以我的第二个问题是:我选择的策略(使用批量,尽可能少)是好的吗?

提前感谢回答

我不是Pyton或Pyglet用户,但这里有一些提示:

  1. 您使用OpenGL

    因此不需要任何Y和/或视图平面排序渲染。Z-Buffer将为您执行此操作,因此绘制顺序可以是任何。。。除非您使用透明瓷砖(在这种情况下,您别无选择)。

  2. 您提供的代码

    但它告诉任何东西实际上确保您不在渲染中对任何东西进行排序/分组。似乎在每一帧上都创建了有序列表,这会非线性地影响性能。通常情况下,硬件加速的代码都很好,直到你达到一些关键的瓶颈,然后一切都会突然陷入地狱!!!

  3. 在单独的2D地图中保留图层地图

    那么您根本不需要任何排序/分组。如果对象从一层转到另一层,那么只需相应地更新展位层

相关内容

最新更新