基于UE3的游戏客户端优化(IO)

发表于2017-03-10
评论0 1.6k浏览

  为什么需要优化使用了虚幻3引擎的游戏客户端?主要是考虑到资源的动态加载方面会出现问题,导致不好的结果出现,为此下面就给大家介绍下基于UE3的游戏客户端优化,一起来看看吧。
  虚幻3引擎是从单机引擎演变而来的,极少的考虑资源的动态加载,他会有如下问题:


  这个UE3引擎的动态加载模型:这是一个标准的游戏动态加载模型,采用单独一条I/O线程进行I/O读取,避免了由于多线程请求引发的争用问题。
  但他是有缺陷的:
1、首先针对于针对于资源包的加载,他是无优先级的队列。
2、再次他不支持包内单个对象的加载,比如我要加载一个武器模型,就需要把这个武器包加载出来。
3、他的加载流程是发起IO请求到IO线程,并使用IO线程加载完成的数据Cache进行队形序列化,对于关联包(如果武器包A关联贴图包B),对于包A他进行的异步非阻塞加载,对于关联包B进行的异步阻塞加载, 主线程需要等待加载线程的行为。
4、最后加载完成后对象的序列化过程是非常耗时的会引发卡顿。
  对于这个对于流畅性要求非常高的FPS游戏是难以忍受的。
 
重构动态加载框架
  针对于UE3引擎动态加载问题,我重构了其动态加载框架,如图:


1、首先我实现了对包内单个对象加载。
2、针对包内对象进行逻辑优先级排序,关心的内容优先加载,更灵活。
3、并且对底层IO进行重新排序,相同的文件读取、相邻文件偏移的IO请求首先排序,减少硬盘从当前磁道到目标扇区定位时间,优化IO速度。


 
1、我重构了加载模型,保证所有的加载都是异步非阻塞加载。
2、更重要的是,很多动态加载底层没有注意的是,对象序列化的耗时问题,针对于对象序列化我采用了分帧序列化,
  每帧只做4MS,防止卡顿。曾经考虑把序列化过程放进线程中去,但是由于UE3引擎的对象系统是非线程安全的进行改造风险太大所以放弃。
 
  对于I/O的优化我们还能做什么?
  资源包分包策略:
  良好资源包组织结构能优化IO的速度和由于加载引发的游戏内卡顿。
  良好的分包策略能优化游戏的内存占用。
  良好的分包策略能优化我们的游戏版本发布。
1、相同逻辑的资源作为一个包(Standalone ),如角色包,武器包。
2、每个游戏模式关卡都有一个自身相关的Content资源包。
3、游戏大厅UI资源打入一个包,只在大厅使用。
4、整个游戏运行过程都需要用到的数据Cache打入StartupPackage,启动时候加载。
  等。。。。。
  管理好各种资源包的加载时机,按需加载,优化内存。
  关于基于UE3的游戏客户端优化就介绍这么多了,这希望可以帮到大家。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引