在渲染之前按y值对对象进行排序?

时间:2012-06-12 18:41:24

标签: c++ graphics

我有一个2D自上而下的45度游戏,如口袋妖怪或塞尔达。由于对象的y值决定了它的深度,因此需要按y值的顺序绘制对象。因此,当你站在树后面的时候,树会被你的玩家顶上画,看起来就像你站在树后面一样。

我目前的设计是画一排瓷砖,然后画出站在那一排的任何玩家,然后绘制下一排,然后画出站在那一排的任何玩家。这样,任何具有比玩家更高y值的图块都会在其前面绘制以模拟深度。

但是,我的玩家目前是std::vector个对象,只需在绘制完所有图块后进行迭代和绘制。为了使我的方法起作用,我将不得不迭代每行瓦片的向量,并且只有当它们在当前行上时才进行渲染,或者按每个帧以某种方式对每个玩家进行y值排序。这两种方法看起来都是CPU密集型的,也许我在思考它,并且在这种类型的游戏中有一种更简单的模拟深度的方法。

编辑: 这个游戏是一个MMORPG类型的游戏,所以可能会有很多玩家/ NPC走来走去,这就是为什么我需要一个非常有效的方法。

我们将非常感谢您的想法或意见!

由于

4 个答案:

答案 0 :(得分:1)

您可以使用std::setstd::map代替vector来保持对象按排序顺序排列。遗憾的是,您无法简单地修改其位置,每次需要更改y坐标时都必须删除/插入。

答案 1 :(得分:0)

(不理解我的原始建议,如果你看过它;那是愚蠢的。)

据我所知,每次渲染帧时,你基本上都必须迭代一个已排序的容器;对此会有计算代价,每次不得不进行复制和排序(O(N log N)排序时间,我猜)。

聪明的数据结构可能对您有所帮助;例如,包含游戏对象矢量作为每个元素的数组。数组的每个元素代表一行平铺网格,然后迭代对象向量并将它们分成深度缓冲区数组(大约需要O(N)时间)。然后迭代遍历代表每一行的向量并依次绘制每个对象,再次为O(N)。

可能有更聪明的z缓冲技术,但我会将这些作为练习留给读者。

答案 2 :(得分:0)

只要您还没有尝试按照其他标准对玩家进行排序,那么每次想要迭代时,您都可以通过y坐标对玩家进行排序。只要您在输入主要排序时使用以线性时间运行的排序,那么您可能甚至不会为此步骤产生O(n log n)时间。我在这里假设你的球员组变化很慢,他们的y坐标也会慢慢变化。如果是这种情况,那么每次你需要对矢量进行排序时,它就会被大部分排序,而像Smooth sort或Tim sort这样的东西将在线性时间内运行。

对于c ++,您可以找到Tim sort here的实现。

答案 3 :(得分:0)

如果你有空间,另一种选择是创建一个玩家列表数组,数组的索引是行号,而数组包含该行中玩家的集合。

正如我所提到的,这将需要一些额外的记忆,并且每次玩家移动到不同的行时都会有一些书呆子,但是绘制只是迭代遍历行并绘制存在的玩家的问题。那一行。