我已经开始阅读维基百科上的资料,但我仍然感觉不太理解场景图是如何工作以及它如何为游戏提供好处。
- 在游戏引擎开发中,场景图是什么?
- 为什么我想要为我的2D游戏引擎实现一个场景图?
- 使用场景图是否作为具有线性实体管理器的经典实体系统的替代方案?
我已经开始阅读维基百科上的资料,但我仍然感觉不太理解场景图是如何工作以及它如何为游戏提供好处。
请注意:
在某些情况下,您甚至需要针对不同的目的使用不同的独立空间划分系统。通常,“场景图”用于渲染,因此优化方式取决于玩家的视角,并且其目的是允许快速收集要渲染并发送到图形卡的对象列表。它并不适合执行查找周围其他对象的对象,并且这使得它难以用于精确定位检测,例如当您使用物理引擎时。因此,为了帮助,您可能需要专门针对物理目的的不同空间分区系统。
举个例子,我想做一个“弹幕”游戏,其中有很多球需要玩家的飞船以非常精确的方式躲避。为了实现足够的渲染和碰撞检测性能,我需要知道:
所以我递归地将2D屏幕分成4个部分,这给了我一个四叉树。 四叉树在每个游戏tick上都会更新,因为一切都在不断移动,所以我必须跟踪四叉树中每个对象(飞船、子弹、怪物)的位置以知道哪个对象位于屏幕的哪个部分。
实现1很容易,只需将子弹输入系统即可。
要实现2,我在四叉树中保留了一个叶子列表(屏幕的平方部分),它们位于屏幕边框上。 这些叶子包含靠近边界的子弹的ID /指针,因此我只需要检查它们是否正在向外移动,就可以知道是否可以停止渲染它们并处理碰撞。(可能会更加复杂,但您会明白的。)
为了实现3和4,我需要检索离玩家飞船近的对象。所以我首先获取玩家飞船所在的叶子节点,并获取其中所有的对象。这样我就只需要测试与围绕其周围的对象发生碰撞的玩家飞船,而不是所有的对象。(它确实有些复杂,但你理解了意思就好。)在网上,有很多关于场景图职责的不同哲学观。人们倾向于将许多不同的内容放入其中,如几何形状、摄像机、光源、游戏触发器等。
总体而言,我会将场景图描述为一个场景的描述,由包含场景中实体的单个或多个数据结构组成。这些数据结构可以是任何类型(数组、树、组合模式等),并且可以描述实体的任何属性或实体之间的任何关系。
这些实体可以是任何东西,从实心可绘制对象到碰撞网格、摄像机和光源等。迄今为止唯一真正的限制是人们建议将游戏特定组件(如游戏触发器)排除在外,以避免后期的依赖问题。这些东西必须被抽象化,比如说“逻辑实体”、“隐形实体”或者只是“实体”。
以下是场景图中常见用途和数据结构。