C++ 渲染前是否按y值对对象进行排序?

C++ 渲染前是否按y值对对象进行排序?,c++,graphics,C++,Graphics,我有一个2D自上而下的45度游戏,比如口袋妖怪或塞尔达。由于对象的y值决定其深度,因此需要按y值的顺序绘制对象。例如,当你站在一棵树后时,这棵树被画在你的播放器的顶部,看起来就像你站在树后一样 我目前的设计是画一排瓷砖,然后画出站在那一排上的任何玩家,然后画下一排,然后画出站在那一排上的任何玩家。这样,任何y值高于玩家的平铺都会在其前面绘制,以模拟深度 然而,我的播放器目前是一个对象的std::vector,它只是在绘制所有平铺后进行迭代和绘制。为了使我的方法发挥作用,我必须迭代每一行的向量,并

我有一个2D自上而下的45度游戏,比如口袋妖怪或塞尔达。由于对象的y值决定其深度,因此需要按y值的顺序绘制对象。例如,当你站在一棵树后时,这棵树被画在你的播放器的顶部,看起来就像你站在树后一样

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

然而,我的播放器目前是一个对象的
std::vector
,它只是在绘制所有平铺后进行迭代和绘制。为了使我的方法发挥作用,我必须迭代每一行的向量,并且仅在它们位于当前行时进行渲染,或者在每一帧中按y值对每个播放器进行排序。这两种方法似乎都是CPU密集型的,也许我想得太多了,在这类游戏中有一种更简单的模拟深度的方法

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

如果您有任何想法或意见,我们将不胜感激

谢谢

(如果你读过的话,你会觉得我原来的建议很愚蠢的。)

据我所知,每次渲染帧时,基本上都必须迭代排序容器;这将有一个计算上的惩罚,并且每次都要做一个拷贝和排序不会那么糟糕(我猜是O(N logn)排序时间)

一个聪明的数据结构可能会在这里帮助你;例如,包含游戏对象向量作为每个元素的数组。数组的每个元素表示平铺网格的一行,您迭代对象向量并将它们放入深度缓冲区数组(大约需要O(N)个时间)。然后在代表每一行的向量上迭代,然后依次绘制每个对象,同样是O(N)


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

您可以使用
std::set
std::map
而不是
vector
来保持对象的排序顺序。不幸的是你不能简单地改变他们的立场,每次需要更改
y
坐标时,您都必须删除/插入。

只要您不尝试根据其他标准对玩家进行排序,那么您就可以在每次迭代时仅按y坐标对玩家进行排序。只要您使用在线性时间内运行的排序,而输入基本上是排序的,那么您甚至可能不会为此步骤花费O(n logn)时间。我在这里假设你的一组玩家变化缓慢,他们的y坐标也会缓慢变化。如果是这种情况,那么每次你需要对向量进行排序时,它已经基本上被排序了,类似于平滑排序或Tim排序的东西将在线性时间内运行


< C++ >看起来你可以找到提姆排序的实现。

如果你有空格,另一个选项是创建一个列表的玩家,数组的索引是行号,数组包含一行的集合。 正如我所提到的,这将需要一些额外的内存,并且每次玩家移动到不同的行时都需要一些簿记,但是画图只是在这些行中进行迭代,然后画出该行中存在的玩家