首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏引擎:什么是场景图?

游戏引擎:什么是场景图?
EN

Stack Overflow用户
提问于 2011-03-15 23:29:41
回答 4查看 24.1K关注 0票数 32

我已经开始阅读维基百科上的材料,但我仍然觉得我不太明白场景图是如何工作的,以及它如何为游戏提供好处。

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

回答 4

Stack Overflow用户

发布于 2011-03-16 00:11:27

什么是游戏引擎开发上下文中的场景图?

嗯,这是一些代码,可以在游戏空间中对游戏对象进行积极的排序,这样可以使快速地找到游戏空间中某个点周围的对象。

这样,很容易:

  1. 快速找到相机视图中的对象(只将它们发送到显卡,使渲染速度非常快)
  2. 快速找到靠近播放器的对象(并且只对那些对象进行碰撞检查)

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

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

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

例如,像Zelda这样的游戏如果足够快地测试屏幕上所有对象之间的碰撞,就不需要这样的技术。但是,它很容易变得非常慢,所以大多数情况下,您至少要设置一个场景图(或任何类型的空间分区),以便至少知道所有移动对象周围的是什么,并且只测试这些对象上的碰撞。

那就看情况了。大多数情况下,出于性能原因,它是必需的。但是您的空间分区的实现完全与您的游戏空间的结构方式有关。

场景图的使用是否可以替代具有线性实体管理器的经典实体系统?

不是的。

不管你如何管理你的游戏实体的对象生命,空间分区/场景图只允许你快速搜索空间中的物体,而不是更多。在大多数情况下,它将是一个对象,它将有一些对象槽,对应于游戏空间的不同部分,而在这些空间中,它将是在这些部分中的对象。它可以是平坦的(如2或4中的2D屏幕除法器),也可以是树(如二叉树或四叉树,或任何其他类型的树),也可以是任何其他排序结构,这些结构限制了您必须执行的操作数量,以获得一些与空间相关的信息。

注意一件事:

在某些情况下,为了不同的目的,您甚至需要不同的空间分区系统。通常,“场景图”是关于渲染,所以它是以一种取决于玩家观点的方式进行优化的,并且它的目的是允许快速收集对象列表以呈现到图形卡上。它并不适合在另一个对象周围执行对象搜索,这使得精确的碰撞检测很难使用,比如当您使用一个物理引擎时。因此,为了提供帮助,您可能有一个不同的空间分区系统,仅仅是为了物理目的。

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

  1. 当子弹出现在屏幕空间时
  2. 当子弹离开屏幕空间时
  3. 当玩家与子弹相撞时
  4. 当玩家与怪物发生碰撞时

所以我递归地把屏幕切成4部分,这给了我一个四叉树。四叉树是更新每一个游戏滴答,因为一切不断移动,所以我必须跟踪每个物体的(宇宙飞船,子弹,怪物)在四叉树中的位置,以知道一个是在屏幕的哪一部分。

实现1很容易,只需在系统中输入子弹即可。

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

为了实现3和4,我需要找回玩家飞船附近的物体。首先,我得到了玩家飞船所在的叶子,我得到了其中所有的物体。那样的话,我只会测试与玩家飞船在周围物体上的碰撞,而不是所有物体。(这有点复杂,但你明白了。)

这样,我就可以确保我的游戏能够顺利进行,即使有成千上万的子弹不断移动。

在其他类型的空间结构中,需要其他类型的空间分区。通常情况下,卡丁车/汽车游戏会有一个“隧道”场景图,因为玩家在视觉上只会看到沿路的东西,所以你只需要检查他在路上的位置,就可以在“隧道”中检索所有可见的物体。

票数 28
EN

Stack Overflow用户

发布于 2011-03-15 23:43:04

场景图是组织环境中所有对象的一种方式。通常需要注意的是组织数据以实现高效的渲染。如果您愿意的话,图表或树可以显示子对象的所有权。例如,在最高层可能有一个城市物体,下面可能有许多建筑物体,在这些建筑下面可能是墙壁、家具.

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

票数 3
EN

Stack Overflow用户

发布于 2013-09-09 11:28:27

网络上似乎有相当多的不同的哲学,关于什么是一个镜片的责任。人们倾向于放置很多不同的东西,如几何,相机,光源,游戏触发器等。

一般来说,我会把一个场景描述为一个场景的描述,它是由一个或多个数据结构组成的,其中包含了场景中的实体。这些数据结构可以是任意类型的(数组、树、复合图案等),并且可以描述实体的任何属性或场景中实体之间的任何关系。这些实体可以是任何东西,从固体可绘制的物体到碰撞-网格,相机和光源。到目前为止,我看到的唯一真正的限制是,人们建议将特定于游戏的组件(如游戏触发器)排除在外,以防止以后出现退学问题。这类事情必须抽象成"LogicEntity“、"InvisibleEntity”或仅仅是“实体”。

以下是几种在显微镜中常见的数据结构和用法。

父母/子女关系

在游戏或引擎中使用显微镜的方法是描述任何有位置的东西之间的父子关系,无论是固体物体、照相机还是其他任何东西。这种关系意味着任何儿童的地位、规模和取向都将相对于其父母的地位、规模和取向。这将允许您使相机跟随播放器或有一个光源跟随手电筒物体。它还允许你制造类似太阳系的东西,你可以在这个系统中描述行星相对于太阳的位置,以及卫星相对于他们行星的位置,如果这就是你要做的。

另外,游戏/引擎中特定于某个系统的东西也可以存储在屏幕中。例如,作为物理引擎的一部分,您可能已经为实体对象定义了简单的碰撞网格,这些实体的几何形状太复杂,无法测试碰撞。您可以将这些碰撞网格(我肯定它们有另一个名称,但我忘记了:p)放在您的镜片中,并让它们跟随它们所建模的对象。

空间分割

另一种可能的数据结构是空间分割的某种形式,如其他答案所述。这将允许您在场景中执行快速查询,比如裁剪任何不在查看结果中的对象,或者有效地过滤掉需要冲突检查的对象。您还可以允许客户端代码(在编写引擎的情况下)为任何目的执行自定义查询。这样,客户端代码就不必维护自己的空间分区结构。

我希望我给你,和其他读者,一些想法,你可以如何使用一个镜片和你可以把它。我肯定还有很多其他的方法来使用显微镜,但这些都是我想出来的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5319282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档