5. 内存优化

内存优化目的是加快IO,防止卡主线程,防止频繁操作(创建/删除)内存,避免内存碎片化和占用过高。

5.1 缓存法

与CPU的缓存计算类似,思路是将需要重复创建的对象缓存起来,销毁时将它放入缓存列表,再次创建时优先从缓存列表中读取。实现伪代码:

Array<Object> _objectCache;Object CreateObject()
{// 先尝试从缓存中获取对象if (_objectCache.size() > 0){return _objectCache.pop_back();}return new Object();
}void DestroyObject(Object obj)
{_objectCache.push_back(obj); // 删除时将其放入缓存列表。
}

缓存法可以降低内存的创建/删除频率,避免碎片化。常用于数量多且创建频繁的物体,如小兵,NPC,血条,特效,道具,各类图标等等。

5.2 内存池

内存池技术是现代主流引擎的标配,目的是避免内存碎片化,加速内存分配和管理。实现思想通常是由引擎预先创建一块较大的内存(也可动态调整),这块内存通过有效的数据结构和算法策略,统一管理小块内存的分配和回收,并为逻辑层提供内存相关的操作接口。内存池实现的方式很多,各有优劣,不一而足。下图是其中的一种实现方式:

分配的内存分为四个部分:第1部分是内存池结构体信息;第2部分是内存映射表;第3部分是内存Chunk缓冲区;第4部分是可分配内存区。更多参看这里。

5.3 资源管理器

资源管理器是将所有需要用到的文件资源统一管理起来,统一创建,加载,释放,回收等,为的是提高复用率,减少资源冗余和内存开销,也是现代引擎必备的一个模块。假如没有资源管理器,势必会造成资源的冗余,同一份资源可能存在很多份内存数据(下图)。

上图所示中,每个模型(Model)引用了一份网格(Mesh)内存数据,3个模型实例就有3份Mesh内存数据,造成Mesh内存资源的冗余。而有了资源管理器的统一管理,所有引用到文件资源的实例都指向了同一份内存数据(下图),避免了内存资源冗余,降低内存和IO消耗。

资源管理器的实现比较简单,主要是运用模板将物体类型抽象出来,然后每个物体类型用一个map<filePath, objectData>的表存储。具体实现这里不累述。

5.4 控制GC

GC是Garbage Collect的简称,意为垃圾回收,是游戏引擎中采用一定策略回收内存池或托管堆里的无用内存和缓存区无用对象的一种技术。GC机制就是防止内存占用过多过久,是一种自动调节内存占用的常用技法。GC的触发一般分为两种:

  • 引擎触发。一般是时间间隔到了,或者内存占有量到了某个阈值,引擎便会触发GC。
  • 用户调用。通常引擎也提供了API给游戏应用,以便逻辑层可以控制GC的时机。例如Unity的GC.Collect()接口可以触发GC操作。

但是触发GC需要遍历内存池/托管堆/各类缓存表,还可能引发内存碎片整理操作,所以它需要耗费一定的CPU性能,是引起掉帧和卡顿的罪魁祸首之一。那么,我们就需要在逻辑层采用一些方法,避免触发GC,或者减少触发GC的处理时间。常用的方法:

  • 避免频繁创建/删除。这个好理解,频繁创建删除对象,会引起很多内存碎片和无用对象,增加触发GC的几率和时间。
  • 帧更新内尽量避免临时对象和创建内存。
  • for/while等循环内避免避免临时对象和创建内存。
  • 尽量避免申请大块内存。申请大块内存会导致内存暴涨,提升GC的几率。
  • 避免内存泄漏。这个需要每个技术人员的职业技能和觉悟,也可以通过一些辅助工具检查内存泄漏,详见1.3。
  • 主动调用GC。比如在进入战斗前后,切换场景前后,切换主要界面前后调用GC,可以一定程度上减少内存占用,避免掉帧/卡顿。

5.5 逻辑优化

逻辑优化的目标是尽量避免无用的内存操作,防止内存泄漏,尽快释放内存,减少全局变量的使用,关注第三方库的内存消耗。

游戏开发57课 性能优化14相关推荐

  1. 游戏开发51课 性能优化9

    4.5 光照模型(Lighting/Illumination Model) 4.5.1 Flat Shading(平面着色) 根据表面法向量计算光照,并应用到整个面片上.速度最快,效果最差,容易暴露物 ...

  2. 游戏开发48课 性能优化6

    3.7.2 算法优化 思路是找出最耗CPU的算法或逻辑,优化之. 空间换时间.利用预排序/预处理/缓存/动态规划等等思路换取CPU的性能. 选取更快的算法.属于数据结构和算法的范畴,思路是将O(n2) ...

  3. 游戏开发43课 移动游戏性能优化1

    1. 前言 很多年前就想将这些年工作中积累的优化经验撰写成文章,但懒癌缠身,迟迟未动手,近期总算潜下心写成文章. 涉及到具体优化技巧时,博主会尽量阐述原理和依据,让读者知其然也知其所以然.要完全读懂这 ...

  4. 游戏开发43课 移动游戏性能优化2

    2. 资源优化 病从口入,资源好比是入口,它们若出现问题,会引发一连串性能问题.相反,资源若是优化得好,后面所有章节的性能都可受益.这也是把资源优化的章节提到最前的原因. 2.1 纹理优化 纹理优化的 ...

  5. 游戏开发31课 cocoscreator 性能优化

    因为 iOS小游戏和微信共用同一个进程,而微信在连续两次收到系统内存警告的时候会关闭小游戏并释放小游戏占用的内存.如果你的小游戏有外网用户反馈"闪退",或者你自己测试的时候频繁出现 ...

  6. 游戏服务器架构与性能优化相关的一些问题

    问题一:游戏在线人数过多出现卡顿,是怎么造成的?服务器硬件还是网络或是其他原因? 答:原因有很多种,要根据不同情况进行分析: 1.手机或者电脑的性能不好,客户端自己卡顿,表现在fps很低: 2.网络本 ...

  7. 从GPU到3D渲染:游戏图形渲染技巧与性能优化

    :5月18日,Qualcomm在北京举行Qualcomm骁龙游戏与图形开发者研讨会.嘉宾们分享了GPU框架特性.移动游戏性能与功耗优化技巧,以及3D效果渲染技巧等话题. 5月18日,Qualcomm在 ...

  8. Android开发中的性能优化(摘录:陈彧堃演讲实录)

    大家好!我是陈彧堃,其实HTML5我之前也做过一些相关的研究,包括现在我们也在做一些调研.我个人一年前在G3上利用HTML5开发一些东西的时候,我发现原生的对HTML不支持,开始踏踏实实做Androi ...

  9. JavaFX战旗类游戏开发 第二课 游戏地图绘制

    在上一节课中,我们对即将要完成的战旗Demo有了一个大概的了解,本节课当中,我们将会学习绘制游戏地图. 自从在JavaFX 2.2中增加了Canvas相关的功能,我们就可以使用Canvas来实现游戏绘 ...

最新文章

  1. 用SAPI实现Speech Recognition(SR) - 命令控制模式
  2. RecyclerView列表控件漂亮时间线实现
  3. CoreData 从入门到精通(四)并发操作
  4. C#winform定时器的两种使用方法
  5. lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告
  6. windows中mysql添加环境变量_windows 下添加mysql到系统环境变量
  7. 阿里大鱼php发送短信,阿里大鱼短信发送PHP代码
  8. 直播强势来袭:Oracle nologgiing;数据库上云;国产数据库比对
  9. 暴雪机器人消防_油库发生大规模爆炸?暴雪机器人、移动水炮、举高喷射车,消防高科技现身现场!...
  10. HTML5 viewport 标签与 CSS3 background-size 属性 使图片完全适应区域内容
  11. CFFI - 简介及简单使用
  12. 拓端tecdat|R语言量化交易RSI策略:使用支持向量机SVM
  13. 关于Docker镜像再封装的详细文档
  14. 因子分解机(FM,FFM,DeepFM,libfm,xlearn)
  15. 邮箱收不到验证邮件怎么回事?为什么我的电子邮件收不到验证码的原因,无限容量邮箱开通
  16. HDU - 5773 - The All-purpose Zero 【必做题目之LIS+++贪贪贪贪心】
  17. 我的 2020 总结:Never Settle
  18. OFD文件怎么转PDF?ofd文件转换为pdf格式教程
  19. 《出版专业基础》2015年版(初级)思考与练习 第六章
  20. html日期控件默认设置为当天日期

热门文章

  1. 模拟黑洞图像_科学家模拟出克尔黑洞图像
  2. 0基础学计算机办公,零基础也能学电脑办公
  3. 01配置tigase使其支持http通讯
  4. Vue指令系统的常用指令
  5. Connected component
  6. 什么是TACACS?
  7. 曹洁 Spark编程Scala版本课后习题答案
  8. 在没学会用MySQL之前,我还是那个担心删库了就只能跑路的懵懂少年
  9. .在/tmp目录下,新建项目director新建3个TXT文件,分别命名file1 、fie2、fie3,用 vi编辑器分别在三个文件中输入内容
  10. python常用api_常用的Python接口,C语言也挡不住Python的强大