2

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

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

为了渲染它,我使用一个带有许多 OrderedGroups 的 Batch:每层一组,每个精灵一组。

sprite 的问题是它们必须按 y 值的递减顺序呈现,因此组排列如下(假设地图中有 3 层,并且必须在最后一个之前绘制 2 个 sprite):

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

当我将图层精灵添加到批处理时,我指定它们是静态的。当我添加派对精灵时,它们是“动态的”。

所以我的第一个问题:既然它们都属于同一个批次,是不是很矛盾?(换一种说法:“静态”或“动态”是精灵对象还是批处理的属性?)(注意:我确切地说我对 OpenGL 的了解很少,也不知道批处理和组是如何实现的)

目前,性能是正确的(我想要 60 fps,并且我有最多 8 个移动精灵),但是当移动精灵超过 8 个时,性能会迅速下降(这在最终游戏中不应该发生,但我想要我的引擎是最高效的,无需在 C/ASM 中翻译部件)。

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

提前感谢您的回答

4

1 回答 1

0

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

  1. 你使用 OpenGL

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

  2. 你提供代码

    但它实际上并没有说明什么,请确保您不对渲染中的任何内容进行排序/分组。似乎您在每一帧上都创建了有序列表,这可能会非线性地影响性能。通常对于硬件加速的代码来说一切都很好,直到你遇到一些关键的瓶颈,然后一切都突然变糟了!!!

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

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

于 2014-01-22T12:39:37.547 回答