【问题标题】:Game engines: What are scene graphs?游戏引擎:什么是场景图?
【发布时间】:2011-07-16 05:05:46
【问题描述】:

我已经开始阅读 Wikipedia 上的资料,但我仍然觉得我并不真正了解场景图的工作原理以及它如何为游戏带来好处。

  • 什么是游戏引擎开发环境中的场景图?
  • 我为什么要为我的 2D 游戏引擎实现一个?
  • 场景图的使用是否可以替代具有线性实体管理器的经典​​实体系统?

【问题讨论】:

  • 有一个 gamedev StackExchange,你可能想看看。一切都与游戏开发有关。
  • 无论是谁写了“试试 Google...”的评论,如果您在说出这句话之前阅读了我的问题,那就太好了!显然,您也无法回答:P
  • @Zan:这不是所以专门针对游戏开发的。即使不是您正在制作的游戏,场景图也可能以相同的方式工作,如果我错了,请纠正我。另外,我希望在这里比在 GameDev StackExchange 上获得问题的答案有更好的机会
  • 您的问题主题以“游戏引擎”开头,标记为“游戏开发”,因此它似乎是游戏开发的理想选择。 耸耸肩

标签: c++ graph scenegraph


【解决方案1】:

什么是游戏中的场景图 引擎开发环境?

嗯,这是一些代码,它可以主动对游戏空间中的游戏对象进行排序,从而可以轻松快速找到游戏空间中某个点周围的对象。

这样,很容易:

  1. 快速找到相机视图中的对象(并仅将它们发送到显卡,使渲染速度非常快)
  2. 快速找到玩家附近的物体(并仅对那些物体应用碰撞检查)

还有其他的。这是关于允许在空间中快速搜索。它被称为“空间分区”。这是关于分而治之的。

我为什么要实现一个 我的 2D 游戏引擎?

这取决于游戏的类型,更确切地说取决于您的游戏空间的结构。

例如,像 Zelda 这样的游戏如果速度足以测试屏幕中所有对象之间的碰撞,则可能不需要此类技术。然而它很容易真的很慢,所以大多数时候你至少设置一个场景图(或任何类型的空间分区)至少知道所有移动物体周围是什么,并只测试这些物体上的碰撞。

所以,这取决于。大多数情况下,出于性能原因需要它。但是空间分区的实现完全与游戏空间的结构方式有关。

场景图的使用是否站得住脚 作为经典实体的替代品 具有线性实体管理器的系统?

没有。

无论您以何种方式管理游戏实体的对象生命,空间分区/场景图的存在只是为了让您快速搜索空间中的对象,不多也不少。大多数情况下,它会是一个具有一些对象槽的对象,对应于游戏空间的不同部分,并且在这些槽中它将是那些部分中的对象。 它可以是平面的(如 2 或 4 中的 2D 屏幕分隔器),也可以是树(如二叉树或四叉树,或任何其他类型的树)或任何其他限制您必须进行的操作数量的排序结构执行以获取一些与空间相关的信息。

注意一件事:

在某些情况下,您甚至需要为不同的目的使用不同的独立空间分区系统。通常,“场景图”是关于渲染的,因此它以取决于玩家视角的方式进行优化,其目的是允许快速收集要渲染的对象列表以发送到显卡。它并不真正适合在另一个对象周围执行对象搜索,这使得它难以用于精确的碰撞检测,例如当您使用物理引擎时。因此,为了提供帮助,您可能会出于物理目的使用不同的空间分区系统。

举个例子,我想做一个“子弹地狱”游戏,玩家的飞船必须以非常精确的方式躲避很多球。为了获得足够的渲染和碰撞检测性能,我需要知道:

  1. 当项目符号出现在屏幕空间中时
  2. 当子弹离开屏幕空间时
  3. 当玩家与子弹碰撞时进入
  4. 当玩家与怪物发生碰撞时

所以我递归地将 2D 屏幕分成 4 个部分,这给了我一个四叉树。四叉树在每个游戏刻更新,因为一切都在不断移动,所以我必须跟踪四叉树中每个对象(飞船、子弹、怪物)的位置,以知道哪个对象位于屏幕的哪个部分。

实现1.很容易,只需在系统中输入项目符号即可。

为了实现 2。我在屏幕边框上的四叉树(屏幕的平方部分)中保留了一个叶子列表。这些叶子包含靠近边界的子弹的 id/指针,所以我只需要检查它们是否正在移动,以了解我是否可以停止渲染它们并管理碰撞。 (它可能有点复杂,但你明白了。)

要实现 3 和 4。我需要检索玩家飞船附近的物体。所以首先我得到了玩家宇宙飞船所在的叶子,然后我得到了里面的所有物体。这样,我只会在周围的物体上测试与玩家飞船的碰撞,而不是所有物体。 (它有点复杂,但你明白了。)

这样我可以确保我的游戏即使在成千上万颗子弹不断移动的情况下也能流畅运行。

在其他类型的空间结构中,需要进行其他类型的空间划分。通常,卡丁车/汽车游戏会有一个“隧道”场景图,因为玩家在视觉上只会看到沿路的事物,因此您只需检查他在路上的位置即可检索“隧道”周围的所有可见对象.

【讨论】:

    【解决方案2】:

    什么是场景图?Scene graph 包含特定场景的所有几何图形。它们对于表示对象相对于彼此的平移、旋转和缩放(以及其他affine transformations)很有用。

    例如,考虑一辆坦克(带有履带和枪的类型)。您的场景可能有多个坦克,但每个坦克的方向和位置都不同,每个坦克的炮塔都旋转到不同的方位角和不同的火炮仰角。您可以在遍历场景图以正确定位它时累积仿射变换,而不是准确地确定每个坦克的枪应如何定位。它使此类事物的计算变得更加容易。

    2D 场景图:如果您的内容足够复杂,并且如果您的对象有许多子组件未严格固定在较大的主体上,则使用 2D 场景图可能会很有用。否则,正如其他人所提到的,这可能是矫枉过正。 2D 仿射变换的复杂度比 3D 小很多。

    线性实体管理器:我不清楚你所说的 linear entity manager 到底是什么意思,但如果你指的是跟踪场景中事物的位置,那么场景如果场景中的各种对象或子对象之间存在高度的空间依赖性,则图表可以使事情变得更容易。

    【讨论】:

      【解决方案3】:

      场景图是一种组织环境中所有对象的方式。通常会注意组织数据以进行有效渲染。图表或树,如果你喜欢,可以显示子对象的所有权。例如,在最高层可能有一个城市对象,在它下面会是许多建筑对象,在这些对象下面可能是墙壁、家具……

      但在大多数情况下,这些仅用于 3D 场景。对于 2D 场景,我建议不要使用那么复杂的东西。

      【讨论】:

      • 您要创建什么样的 2D 场景?
      • 我正在创建一个引擎,它应该支持尽可能多的不同场景,从很小到很大。
      【解决方案4】:

      对于场景图的响应能力,网络上似乎有很多不同的理念。人们倾向于放入很多不同的东西,比如几何、相机、光源、游戏触发器等。

      一般来说,我会将场景图描述为场景的描述,它由包含场景中存在的实体的单个或多个数据结构组成。这些数据结构可以是任何类型的(数组、树、Composite pattern 等),并且可以描述实体的任何属性或场景中实体之间的任何关系。 这些实体可以是任何东西,从实体可绘制对象到碰撞网格、相机和光源。 到目前为止,我看到的唯一真正的限制是人们建议保留游戏特定组件(如游戏触发器)以防止以后出现依赖性问题。这些东西必须被抽象为“LogicEntity”、“InvisibleEntity”或只是“Entity”。

      以下是场景图中的一些常见用途和数据结构。

      亲子关系

      您可以在游戏或引擎中使用场景图的方式是描述具有位置的任何事物之间的父/子关系,无论是实体对象、相机还是其他任何事物。这种关系意味着任何孩子的位置、比例和方向都将与其父母的相对。这将允许您使相机跟随玩家或让光源跟随手电筒对象。它还允许你制作像太阳系这样的东西,你可以在其中描述行星相对于太阳的位置以及卫星相对于它们的行星的位置,如果你正在制作的话。

      您的游戏/引擎中某些系统的特定内容也可以存储在场景图中。例如,作为物理引擎的一部分,您可能已经为实体对象定义了简单的碰撞网格,这些实体对象可能具有过于复杂的几何形状而无法测试碰撞。您可以将这些碰撞网格(我确定它们有另一个名称,但我忘记了:P)放在您的场景图中,并让它们跟随它们建模的对象。

      空间分区

      场景图中另一种可能的数据结构是space-partitioning 的某种形式,如其他答案中所述。这将允许您在场景中执行快速查询,例如剪裁不在视锥体中的任何对象或有效过滤掉需要碰撞检查的对象。您还可以允许客户端代码(如果您正在编写引擎)为任何目的执行自定义查询。这样,客户端代码就不必维护自己的空间分区结构。

      我希望我能给你和其他读者一些关于如何使用场景图以及可以在其中放入什么的想法。我确信还有很多其他方法可以使用场景图,但这些都是我想出的。

      【讨论】:

        【解决方案5】:

        在实践中,视频游戏中的场景对象很少被组织成一个图形,当场景被渲染时,它会像树一样“行走”。图形系统通常需要渲染一大堆东西,而这个大数组是线性遍历的。

        需要几何亲子关系的游戏,例如那些拿着枪的人或带有炮塔的坦克的游戏,会在图形系统之外根据需要定义和强制执行这些关系。这些关系往往只有一层,因此几乎不需要任意深度的树结构。

        【讨论】:

        • 其实不是。任何引擎都有一个适当的场景图来存储实体之间的关系。大多数引擎(无论如何,甚至是模糊的互补引擎)也具有空间分区中的实体。遍历八叉树仍然比绘制比实际可见对象多 100% 的对象要快。
        • 只有在 CPU 受限的情况下遍历树的成本低于实际渲染所有内容的成本时,这才是正确的。如果你的 GPU 绑定不是肯定的,但你有不同的问题。
        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 2023-03-16
        • 2013-07-21
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多