大地形加载考虑到现有的内存机制, 不可能一次性将其加入到内存中,这个问题是显而易见的,其实在游戏开发中经常遇到,比如我们常见的进度条,加载进度条的目的就是等待程序加载场景,进度条只是一个蒙板遮罩而已。大地形的加载,别无他法,只能用分块,这个是大方向,因此作为程序来说,要做的事情是如何分块?块的大小是多少?这些具体的问题我们要根据需求划分,比如飞行模拟器块大小可能就要大一些,因为俯瞰的视角比较大,场景漫游块可以小一些等等,下面我们就以游戏的经典之作——魔兽世界地形加载方案为例给读者先介绍一下它的实现原理,魔兽世界这款游戏实现的就是无缝地图的拼接,所以非常具有参考价值,先看下图所示:
魔兽世界是如何实现无限地图的?其实它也是很多的场景块拼接而成的,我们通过编辑器分析魔兽世界的地形块的大小划分,魔兽世界场景我们称为MapWorld是由一系列MapTile组成,这些MapTile的大小是1600/3 ≈ 53333m,而每个MapTile又是由 16x16 个MapChunk组成,由此可以计算出每个MapChunk≈3333m。再就是每个MapChunk又由9x9+8x8个地形顶点高度,法线,若干贴图层(一般为4层)组成的地表纹理。魔兽世界地形的大小,在这里我们就不讨论了,但它划分块的思想我们是可以借鉴的。
继续分析魔兽世界的分块方法:它们是根据矩阵的方式进行划分的,在XZ平面上进行的,每个块都会包含一定的信息数据的,比如:在XZ(3,3)位置的MapTile,每个MapTile都包含了该tile内使用的贴图、模型实例等等。所谓模型实例也就是我们的道具,可以理解成相同模型在tile内不同摆放位置、大小、角度的信息,它们都是被保存在二进制文件中的,为了节省文件尺寸,模式实例是通过index模型方式保存的,同顶点索引类似,在每个MapTile里面还有贴图信息比如贴图的名字和UV信息等等。本篇课程的分块思维方式跟魔兽世界的类似,会在后面的章节中详细介绍,块分好了以后,下面就是实现原理了。
实现原理:在任何时刻,程序总是保存着玩家所在的及其周围的3x3个MapTile,随着玩家的移动,这些MapTile会被动态更新,新的MapTile被加载以替换被卸载的旧MapTile。为了提高调度效率,魔兽引入了Cache机制,Cache中保存着最多16个MapTile数据。需要加载新的MapTile时,首先会在Cache中查找;卸载的旧MapTile也不会被立刻删除,而是保存在Cache中以备再次调用。由于一段时间内玩家的活动范围通常不会有太大变化,这一Cache策略在应用中表现的非常出色,这是无缝地图的基本原理。地形的动态加载卸载我们会使用多线程去实现,我们会整两个线程:一个线程专门用于加载地形,另一个线程专门用于卸载或隐藏地形MapTile。让我们再来回忆一下游戏的经典之作,游戏场景效果如下所示:
本篇课程实现的方法可以使用两种方式处理块的加载显示问题,一种是利用对象池的方式,预先加载分块地形,根据视距进行检测判断显示那些地块以及隐藏那些地块,在这里并不删掉它们。这样只需要一个线程就可以。另一种方式是利用多线程,起一个线程专门用于移除卸载不在视线范围内的地块,这样可以提升效率,下面介绍使用多线程的加载方案。
多线程实现大地形加载方案
多线程在PC端游戏中使用的比较多,比如可以起一个线程专门进行资源的加载,游戏服务器中同样也会有多线程的使用,下面给读者介绍多线程实现方案,多线程处理问题就是把所有的加载逻辑放到了新的进程中,和主线程做一些进程间的通信,接受主线程的加载建议,做按需加载,也会自主做一些提前预加载,放进分配的内存,就跟魔兽世界的处理方式一样,通过进程间的内存共享机制,把加载的地形数据,共享给主进程使用。主游戏进程,永远只要维护一个很小的内存即可,大量的内存数据,都在另一个进程中处理。这样就可以优化大地形块的加载,实现方式如下所示:
首先主线程会先加载九块地形,主线程只负责维护这九块地形,无论角色怎么移动,角色所在的整个区域永远是九块地形,如上图所示的,这九块可以直接使用主线程加载到内存中,剩下的16块我们通过另一个线程将其放到缓存中,角色的位置是在已经加载好的九块地形中间,也就是在A所在的位置。随着角色的移动,会有新的地形块加入进来,同时现有的地形块会被置换出去,这样一直显示九块地形,被置换的地形并不会马上卸载掉,会根据角色移动情况做预判,它会等主线程通知,按照一定的规则进行卸载地块和加载地块。其实这种实现方式就是我们通常所说的双缓存-多线程技术。实现的效果如下所示:
地形分块加载完事了后,下面就要考虑地形上面的纹理贴图问题了,地形的贴图资源也会占用大的内存,下面介绍如何加载海量贴图数据。
大地形海量的加载方案
大地形中的场景非常多,地形中的贴图至少会有四层,这么多贴图我们在加载时需要考虑的,我们分块时也需要考虑这些因素,另外场景中使用的LightMap烘培也是要考虑的问题,为了缓解内存压力,我们事先会将不同块中的地形材质以及建筑物材质进行打包,先介绍如何分块加载场景贴图?它实现方式如下所示:
该思路就是将场景中的贴图根据我们划分的块打成不同的图集,当然也可以将两个块中的贴图打成一个图集,图集大小对于PC端来说,最大是4096,在移动端最大是2048。这个也是为了避免内存频繁的加载卸载会导致很多内存碎片,不利于后面大内存的分配。在打图集之前我们需要做点事情就是需要将地形块中的纹理贴图与我们的打包图集之间建立一一对应关系,方便对号入座。因为我们打包的图集跟实际地形之间不会有任何关系,要确立二者之间的对应关系我们需要在它们中间再整一张索引文件表格,它是连接图集与实际地形纹理的桥梁,通过我们建的索引文件,我们可以找到实际地形中纹理与图集纹理之间的对应关系,我们建的索引表格是要加载到内存中的,而我们的图集是根据加载任务后期才加到内存中的,这就要求我们的索引文件尽可能的少,因为它们是常驻内存的,除了海量的加载,我们还需要处理密集建筑的加载。
- 密集建筑的加载方案
密集的建筑加载,大家试想一下,如果把场景中所有的建筑一次性加载到内存中,内存瞬间就会占满,帧数瞬间下降,这也是为什么大家在游戏场景中移动时,遇到密集的建筑就会卡顿一下的原因。以前处理方式是使用LOD处理,被遮挡的物体使用简模,这样也会加大内存的负载效果,如果角色一直在建筑物之间来回穿梭,这样不同LOD模型就需要来回切换,对内存也是一个负担,效果不理想。这些问题对于程序员面来说必须解决的问题,如何解决呢?很多人想到了合并大Mesh,这种方法行不通的,大网格并不适合做裁剪 *** 作,试想一下,我们合并的网格,如果摄像机只看其一小部分,因为它们是一个整体这样就需要把他们一起加载到内存中,而实际上我们并不需要这么多模型数据,在合并网格时,在这里也给读者一个建议,尽量把靠的很近的模型进行合并,避免上述问题发生。其实最有效解决方案还是划分块,这个划分块可以利用地形划分的思想进行,它是与地形块紧密相关的,每个地形块中的建筑物跟随地形块一起加载。如果块中的建筑非常密集,这种方法还不能够完全解决,还需要进一步的处理,就是要加入OC遮挡算法结合LOD算法,这样就可以完全解决我们当前的问题了,这也是本篇课程
要讲解的方法,再进一步的优化方法是可以将OC遮挡算法和LOD算法放到GPU中计算,这样效率还会提升,在Siggraph2015发表了一篇文章GPU-Driven Rendering Pipelines,它的思想就是使用GPU进行遮挡裁剪处理,主要分两个阶段,使用的是DX12图形API,如下图所示:
它的思想就是第一步先做一个初略的遮挡裁剪列表,而后在此基础上再根据视线距离或者射线检测做进一步的细化裁剪 *** 作,这个思想跟我们的碰撞检测算法类似,引擎中碰撞检测算法也是基于这个原理实现的,给读者介绍一下:实际可用的碰撞检测算法,一般要分2个阶段:
第一阶段,broad phase 快速找出潜在的碰撞物体对列表,不在这个列表里的是绝对没可能碰撞的。broad phase确定了一批需要进一步检查的物体对。
第二阶段,narrow phase 准确找出发生碰撞的物体对列表。因为上一个阶段的部分物体对实际上是没有碰撞的,需要在这个阶段剔除。
broad phase其中有一个简单算法叫sweep and prune(SAP),本质上是利用了排序算法。第一步是初始化排序列表,列表中的元素是包围盒,可以用任意排序算法完成,例如快排;之后的排序就不是用快排了,而是用冒泡排序,为什么用冒泡排序更好呢?是因为一个默认的前提:物体的运动有时间相关性(temporal coherence),即当前帧和下一帧的位置是相近的,所以在冒泡排序过程中,发生的位置交换预期都很靠近。
其实算法中有很多类似的地方,这里我们也要互相借鉴它们解决问题的思想用于解决我们的问题。笔者以前做的是端游,端游中很多优化思想同样适用于移动端,移动端跟PC端比,就是一台配置比较低的电脑而已。接着我们的遮挡裁剪继续给读者介绍,论文作者也做了一个效率测试,以250’000物体,1G的网格为例,测试效果如下所示:
是不是很酷啊!在项目开发中完全可以用它解决问题,下面我们再谈谈使用GPU去优化我们的大地形场景。
GPU大地形渲染优化解决方案
我们的大地形首先会有自己的地表贴图,常用的地表贴图是四张纹理融合,最多可以有八张贴图融合,地形纹理渲染会涉及到LOD算法,远处的地形网格可以简化一些,对应的贴图也是最低的,这就是MipMap的使用。另外肯定有草有花以及其他大量相同的物件渲染,先说说草和花的绘制,他们在游戏中会非常的多,常用的做法是引擎提供的面片或者是十字交叉,或者三张交叉,然后将带有Alpha通道的贴图映射在上面,如下图所示效果:
CPU绘制这些草或者花在PC端是可以的,因为现在的电脑都是多核的,在手机端就会影响到效率问题了。使用CPU绘制,DrawCall会非常的多,而且草或者花还需要摆动,计算量很大的,这严重影响了运行效率,CPU有难,GPU可以帮忙,我们可以将草或者花的绘制放到GPU中执行,效果如下所示:
首先渲云是支持效果图和影视渲染的平台。
云渲染平台哪个好应该如何判断,具体的方法如下:
一、平台的专业性及稳定性
比如渲云,研发实力雄厚,拥有江苏省GPU云集群3D渲染工程技术研究中心、江苏省博士后创新实践基地、江苏省企业研究生工作站。仅研发团队五十余人,专注于渲染集群调度及三维渲染技术方面的研发与运维,目前拥有授权发明专利及软件著作50余项,注册商标40余个。同时可针对项目需求提供定制化开发,不断完善云渲染业务支持范围,形成全领域覆盖。
二、性价比:性价比不仅体现在价格便宜,渲染的速度和服务也是重要的因素。渲云单张效果图低至066元每张,特惠模式32核8元封顶,很实惠。根据用户渲染量,还可以定制单张渲染参数和价格。
三、支持软件的全面性:渲云效果图产品提供超百余种插件支持,影视版已支持超3000余种插件,另渲染器及插件可根据需求定制安装。只有与用户的版本完全匹配才能保证稳定性,渲染才不会出问题。支持的软件如下(只罗列了一部分,具体详情到官网了解):
效果图 3ds max 2010 - 2020
SketchUp 2015-2017
影视版 3ds max 2012 - 2020
Maya 2013-2020
C4D R17-R20
Houdini 15 - 18
Clarisse 36 SP8 - 40 SP5
Terragen 4
CG HAGIC 3ds max 2012 - 2018
Unity云烘焙uni ty 55 - 201925f1
四、不排队:渲云有海量的服务器,无限制动态调动资源,永不排队。
五、渲云平台推出的cg模宝插件,针对广大客户群体免费使用
支持版本转化:支持3ds Max 文件版本转换,最低可转至3ds Max 2012版 一键转化,从此不求人
材质转换:实现标准材质、V-Ray材质与Corona材质相互转换 一键转换,不再出错
全面体验:全场景全方位体检,异常问题直观知晓 一键修复,不再崩溃
具体请到渲云官网了解。
一、速处理型、海量存储型和低价稳定型。像企业网站,普通个人网站等要求对存储要求不高,但对安全性和稳定性却是必须要考虑的因素,选择那一类型的网站服务器就需要结合网站的属性和预算以及各方面因素来加以考虑了,再对服务器的各项参数加以对比和分析。从硬件配置来看, *** 作系统、数据库、Web服务器、Web应用软件等的选择问题,要根据网站类型、网站规模、资金预算及站长经验众多因素从站长预备的方案中选出适宜的产品,还有服务器的中央处理器、内存、芯片组、I/O总线、I/O设备、电源、机箱和相关软件,这些应该是站长选择服务器所要关注的指标。
二、服务器的性能稳定性
站长们在日常的网站维护中,可不希望自己购买或者租凭的服务器出现问题,因为服务器属于比较复杂和高负荷运载的机器,服务器的维修通常要比处理一个网站的N多问题困难得多,一点小毛病就会带来一系列的问题,服务器的维护都是以预防为主的,当一出现问题,所造成用户的损失也是不可估量的,因此稳定型强的服务器对站长们是至关重要的。
三、服务器的安全性
选择服务器,安全因素也是站长朋友们必须要考虑的因素,安全系统方面是指服务器维护人员否能24小时进行全方位的机房监控。它主要要考虑两个方面:一是保护服务器机密信息;二是要防止黑客的攻击。
四、服务器的技术服务
服务器的良好服务也是作为服务器的最高宗旨,从服务器商的服务管理体系是否规范,技术实力是否到位,问题处理是否及时,产品使用说明讲解是否详细,IDC服务商的管理运营能力是否以从用户的角度出发,其次看IDC商是不是正规公司,是否拥有这方面的资深认证可以帮助站长朋友们免费备案,还要看IDC服务商背后是否有强大的资源支持等等。∞如果出了问题,不能得到服务商及时可靠的技术支持,将很可能影响到网站的正常运营。
五、服务器的应用指标
以Web服务器为例,如果站长的Web站点网页主要是ASP动态类型的,就不适宜选择Apache服务器系统,因为它对ASP不支持,同样,如果站长的数据库系统是SQL,也不适宜选择Apache,同样是因为它不支持。
六、服务器的内存性能
一款高内存的服务器,往往可以储存海量的信息和具备站长网站日常大量的会话和互动需求,如果条件允许,站长们尽量选择内存稍大点易扩展的服务器,对于日后网站的升级更新,访问量增大等提供支持。
想了解更多相关信息,可以咨询酷酷云,谢谢百度云(Baidu Cloud)是百度推出的一项云存储服务,首次注册即有机会获得2T的空间,已覆盖主流PC和手机 *** 作系统,包含Web版、Windows版、Mac版、Android版、iPhone版和Windows Phone版,用户将可以轻松将自己的文件上传到网盘上,并可跨终端随时随地查看和分享。
网盘
提供多元化数据存储服务,支持最大2T容量空间,用户可自由管理网盘存储文件。
个人主页
提供个性化分享功能和优质资源聚合服务,用户可通过关注功能获得好友分享动态,实现资源共享。
群组功能
百度云推出多人群组功能,既能够单纯点对点、更可以一对多、多对多的直接对话。这也是国内首个能够进行云存储社交的云服务平台。
相册
用户可以通过云相册来便利地存储、浏览、分享、管理自己的照片,用照片记录和分享生活中的美好。
人脸识别
百度云不仅能实现智能分类、自动去重等功能,还能以图搜图,在海量中精准定位目标。
通讯录备份
百度云手机APP功能,提供通讯录同步、短信备份功能。iPhone用户可实现通讯录同步;Android用户可同步通讯录,备份恢复手机短信。WP暂不支持此功能。
手机找回
百度云Android版独有功能。用户设置找回功能后,在手机遗失时,可通过百度云web版在线锁定手机避免信息泄露,同时可发出警报、追踪定位提升手机找回的可能性。
手机忘带
用户需要在Android手机上安装新版百度云APP,同时在PC端安装新版云管家。当百度云App和百度云管家中的“发现-手机忘带”功能同时处于开启状态时,手机上的通讯信息能自动同步到云管家。用户通过云管家发起需求,即可查询近三天手机上的通话记录、短信。
记事本
百度云网络笔记功能,可在线编辑文档,直接保存至百度云。支持文字、、语音三种类型记事
特色功能编辑
超大空间
百度云提供2T永久免费容量。可供用户存储海量数据。
文件预览
百度云支持常规格式的、音频、视频、文档文件的在线预览,无需下载文件到本地即可轻松查看文件。
视频播放
百度云支持主流格式视频在线播放。用户可根据自己的需求和网络情况选择“清晰”和“原画”两种模式。百度云Android版、iOS版同样支持视频播放功能,让用户随时随地观看视频。
离线下载
百度云Web版支持离线下载功能。已支持>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)