晚上好(来自欧洲)。
我正在尝试使用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