视频链接:游戏开发入门(八)游戏中的场景管理(5节课 时常:约2小时07分钟) 授课者通过2D围棋的例子,逐步拓展成3D的虚拟游戏世界。这个3D游戏世界基本上就可以涵盖市面上所有类型的游戏了,我们通过各种手段去管理好这个游戏世界,就能快速的进行各种游戏逻辑的开发。
笔记与总结(请先学习视频内容): 1.什么是场景物体?什么是游戏场景?
游戏中所有具有空间属性的物体都是场景物体。
所有场景物体构成的集合成为游戏场景。 2.一般情况下哪些内容属于场景物体,哪些不属于场景物体?
场景物体:玩家,NPC,场景建筑,地形,粒子特效,场景中的道具(武器等),还有一些看不到的对象如volume、摄像机等
非场景物体: UI,UI上的道具,玩家(NPC)技能,玩家(NPC)状态,碰撞盒,物体的材质
个人觉得,非场景物体并没有什么严格意义的概念,刨除所有场景物体,其他的都是非场景物体。或者严格来说,他们并不是我们通常认识下的物体,只是单纯的游戏逻辑对象。比如说玩家的状态,他在场景中并没有实体,不过我们完全可以给状态创建一个类对象来表示某个角色的状态。 3.场景管理的意义 - a.便于玩家快速的定位场景里面的对象
- b.妥善处理巨大场景带来的内存开销问题
- c.处理巨大场景带来的渲染效率问题
- d.处理大量对象的碰撞检测的效率问题
4.2D游戏需要场景管理么?
我们接触的大部分游戏都有一个虚拟的游戏世界,玩家通过操作来改变这个世界。这个世界复杂一点,可以像各种大型MMO游戏一样(3D),这个世界简单一点,可能像视频中的围棋一样(2D,或者如超级玛丽的那种)。所以无论是哪种游戏,总是有那么一个场景空间(或者说一个游戏世界)去存放游戏对象,这个空间就需要我们去统一的管理。这样,我们才能在游戏进行时方便快速的找到我们需要的对象,再去做进一步的处理。如果2D空间内对象数量庞大的话,也可以采用一定策略进行优化。
所以,2D游戏也一样需要场景管理。 5.2D场景管理与3D场景管理的差别?
面临的问题不同:2D场景相比3D场景,一般来说无论是渲染开销还是内存开销都要小的多。 6.关于非物理碰撞检测的问题与优化方案
问题:对于一个非基于物理引擎的碰撞检测,我们一般需要遍历场景中所有对象的位置并判断二者间距离(假设对象都是球型的),才能检测二者是否发生碰撞。一旦对象数量多起来,CPU根本无法承受。
优化:实际上,我们知道距离很远的两个对象一定时间内是不会发生碰撞的。为了减小碰撞检测的开销,我们可以将场景划分成N*N块,然后将所有的对象规分到不同的块里面,不同块(且不相邻)之间的对象不会发生碰撞,这样就减小了碰撞检测的开销。
注:其实一般的物理引擎的逻辑开销比我们没有优化的也还要复杂的多,因为他可能会有更多更详细的检测逻辑,不过像physX引擎在检测时还会借助GPU来提高效率。 7.四叉树与八叉树
二维空间的管理与对象检测可以使用四叉树进行处理。
三维空间的管理与对象检测可以使用八叉树进行处理。
不过八叉树的相对开销相比四叉树要高不少。
这两个概念其实并没有那么高深,和我们平常学习的数据结构没什么差别,只不过他的每个节点下面有四/八个子树。这样的处理完全是因为这两种结构符合我们逻辑检测的思路。 8.关于碰撞检测的优化思路
其实这与我们处理搜索,排序的思路是类似的,N^2肯定不是最优解,起码我们会想到类似二叉树,二叉堆的的数据结构。如果再去结合我们游戏中空间分布的实际情况,也就不难想到四叉树这样的处理办法。当然,理论上还应该有其他的优化思路,效率如何博主暂时没有深入去研究过。 9.关于视野渲染的优化
与现实世界相似,我们无法看到无线远的东西,或者是无限远的东西几乎是看不清的。所以,游戏世界里面的玩家也类似,每个玩家的视野限制在一个视锥里面。这对于游戏的优化是非常重要的 - a.渲染上,因为不在视野内的东西,我们完全就可以不去渲染,即渲染剔除
- b.游戏逻辑上,因为玩家的视野有限,过于远的场景数据可以完全不去加载,即场景动态加载
- c.在视野范围但是又很远的东西,我们可以给他换一个精度比较低的模型,即LOD
10.入口管理
对于一些房间内(场景比较小)的游戏,玩家的视野只局限在一个房间里面。这时候其实房间外的任何东西都不需要加载与处理(假如与当前游戏逻辑无关)
这样,我们就可以在玩家切换房间(如开门)的时候再去加载其他房间场景,这对于游戏的优化是很有帮助的。 11.游戏天空的实现
天空盒:用一个完整的封闭的空间来包围整个游戏场景,在这个空间表面贴上天空效果的贴图。一般来说非常大,要比实际游戏场大,接近玩家视野的极限。
天空盒组成: 12.LOD
前面提到过,视野远处的东西玩家是看不到细节的,所以也就不需要给其渲染那么复杂的模型(贴图等)。LOD就是基于这个原理根据与相机位置的距离动态切换资源(高精度资源与低精度资源),是游戏中常用的渲染优化方式 13.地形的处理
游戏场景中的地形可以说仅次于天空盒大小的存在了,与天空盒不同,玩家与地形的距离非常近,所以一般来说地形的表现细节应该足够丰富才行。但是问题是如果给所有的地形都赋予足够的精度,就需要占用大量的内存,这是不现实的,所以地形也要有LOD处理,远处的地形不需要太精细的效果。另外,在游戏中的大地形是不存在球形的。其实地形只是一个面片,玩家只在面片的上面进行移动。
地形制作:一般由美术在客户端进行刷,构建完毕后会以高度图的形式存储在地图数据信息里面。
高度图:其实就是一个二维表,记录每个坐标的高度值(Z值)
地形LOD的处理方法: 按照距离大小,视觉贡献度(斜面的贡献度比平面高)来分配不同精度的LOD模型 14.地表纹理处理
由于地形面积过大,正常情况下需要提供大量的贴图来表现不同位置的不同效果。为了节省贴图资源所占用的内存空间,同时还想表示出丰富的地貌效果,就需要用到多层纹理混合技术。只需要几个贴图,按照不同权重的混合就能达到多种不同的效果。 15.水
前面渲染的课简单说到了水的渲染一般是通过UV动画(法线贴图)来实现的,但是更逼真的水还需要考虑到反射与折射,甚至是与玩家
的互动。这就需要进一步添加反射贴图等更深层次的处理。 16.植被
实现方式1:记录每株草的位置、贴图、材质等信息,运行时生成草的模型,将使用同样贴图的草合并为若干组。
实现方式2:记录植被区域,记录区域内植被贴图、材质等信息,设定区域植被的密度、变异因子等信息,运行是生成若干组随机植被。
|