2D游戏引擎 如何组织游戏对象?

3

晚上好(来自欧洲)。

我正在尝试使用Python和Pygame创建一个2D游戏引擎,与Unity 3D类似,但您只能创建2D游戏。 为了说明我的问题,我将展示一些您需要知道的类。


我有一个名为 Sprite 的类,表示我的游戏对象,我们关心的方法是 render 方法。该方法每秒调用一次, 并将精灵对象的图像绘制到屏幕上。它还调用另一个方法 update ,您可以覆盖并为精灵对象创建一些逻辑(我称其为“大脑”:p)。 我还有一个 Scene 类, 在其中将所有精灵对象存储到链接列表中。

为了呈现场景中的所有游戏对象,我在我的 Scene 类中创建了一个具有以下算法的方法:

#obj is a sprite object.
#Is been called every frame per second.
for obj in gameobjects:
    obj.render()

您可以看到,这是渲染场景中所有游戏对象的最简单方法。这就是我的问题所在。如果我们假设场景中有10000个游戏对象,那么这个for循环将会延迟帧率,导致卡顿问题。

我想到的一个解决方案是仅渲染我能看到的游戏对象(在窗口边界内的游戏对象)。这个方法有效,但问题是我必须检查场景中的所有游戏对象是否在窗口分辨率内,并仅渲染它们。因此,我做了如下操作:

#This method is been called only every time there is a movement
#action into te game causing all the game objects to change position.
for obj in all_game_objects:
    if inside_resolution(obj):
        render_objects.append(obj)

#Is been called every frame per second.
for obj in render_objects:
    obj.render()

如您所见,我仍需检查所有游戏对象,因此什么也没成功!

如果我能以二叉树等数据结构组织我的游戏对象,并创建一些智能方法,只返回在窗口分辨率内的游戏对象,那么我就可以成功实现快速渲染系统。

因此,我的整个问题是我应该使用什么数据结构来存储我的游戏对象? 树会非常快,但是我如何知道哪些游戏对象在屏幕分辨率内,而无需检查它们全部?

据我所听,像Unity3D这样的现代游戏引擎正在使用树来渲染场景的不同区域(这就是视野距离的作用)。问题是这是如何工作的。

希望我描述的问题足够清楚。
感谢您的耐心 :p


1
四叉树是一种相对常见的快速确定哪些对象在空间的某些部分的方法。 - James Elderfield
2
你是否尝试过渲染10000个对象并且确定渲染循环是应用程序的主要瓶颈?如果没有,那么这只是另一个过早优化的案例。大多数渲染库足够高效,可以毫不费力地渲染数千个对象。如果你完全确定渲染循环导致了性能瓶颈,那么才应该让其他人花时间帮助你。 - EvilTak
1
哦,如果渲染确实是瓶颈的话,你可能想考虑在不同的线程中进行所有渲染。你所做的事情实际上是提高性能最简单的方法,如果这是问题的话。无论如何,您都必须迭代每个对象并运行其更新方法,那么为什么不进行这个小检查呢?您实际上可以将所有渲染代码移动到“相机”或类似的类中,每个对象都可以通知每个相机它是否已离开或进入其视口。在调用渲染之前,将为每个对象运行此检查。 - EvilTak
你是对的。问题不仅在于渲染,还包括碰撞检测。而碰撞检测可能会导致很多延迟,但我现在并不关心它。除了渲染之外,渲染方法也可以运行昂贵的算法(我称之为 "brains" :p),而我无法知道这些算法的代码,因为游戏程序员将创建它们。所以引擎运行的越少,对于内存较差的计算机来说就越好 :p 我会去查一下这些四叉树,以前从未听过它们 :p - babaliaris
1个回答

1
将所有对象放置在一个二维网格中,其中网格代表整个场景。然后,您可以轻松迭代仅在屏幕上可见的对象。现在,碰撞检测变得更加容易。

单元格的大小由您决定。尝试不同的大小,看看哪个效果最好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接