http://mp.weixin.qq.com/mp/homepage?__biz=MzAwMTUzOTczNQ==&hid=6&sn=44228b7260d7a5a3287a44994f1dbe75&scene=18#wechat_redirect

https://zhuanlan.zhihu.com/p/28159739  //GPU处理动画

Unity将来时:IL2CPP是什么?
http://inpla.net/thread-8197-1-1.html
https://zhuanlan.zhihu.com/p/19972689

Unity3D将来时:IL2CPP(下)
http://blog.csdn.net/qq168213001/article/details/46319219

Unity3D 降低IL2CPP编译可执行文件大小
http://www.cnblogs.com/mrblue/p/4979004.html
Suggestion for reducing the size of IL2CPP generated executable
http://forum.unity3d.com/threads/suggestion-for-reducing-the-size-of-il2cpp-generated-executable.338986/

用Unity制作游戏,你需要深入了解一下IL2CPP
http://blog.csdn.net/qq168213001/article/details/46319139

Unity开发-IL2CPP概述
http://blog.sina.com.cn/s/blog_7cbd10170102voxc.html

AN INTRODUCTION TO IL2CPP INTERNALS
https://blogs.unity3d.com/2015/05/06/an-introduction-to-ilcpp-internals/

IL2CPP 深入讲解:垃圾回收器的集成
http://www.jianshu.com/p/59d3ab1135b3

Unity3D Native 插件开发: IL2CPP 机制篇
http://tieba.baidu.com/p/4566737560

IL2CPP 深入讲解:P/Invoke封装(三)
http://blog.csdn.net/gz_huangzl/article/details/52485507

IOS平台Unity引擎的IL2CPP机制分析及安全性评估
http://gad.qq.com/article/detail/7166024

从Profile中窥探Unity的内存管理
http://blog.csdn.net/cxihu/article/details/51538542

(二)Unity5.0新特性------unity内部:内存 和 性能(以及Unity5的升级优化)
http://blog.csdn.net/u010019717/article/details/44758685?locationNum=6

IL2CPP 深入讲解:垃圾回收器的集成(六)
http://blog.csdn.net/gz_huangzl/article/details/52485545

技术干货|IL2CPP 深入讲解系列介绍之4:方法调用介绍
http://www.wtoutiao.com/p/Db8sho.html

Unity游戏项目常见性能问题 

[复制链接]

   

admin

  • 纹理没有压缩

在很多情况下,美术会觉得纹理压缩后效果不理想。我们建议的是:可以把原图的分辨率长宽都扩大一倍,保持原有压缩格式。这样压缩过后的文件还是比不压缩的文件要小,并且视觉效果可以得到较大的改善。

  • 纹理导入设置中的 Read/Write Enabled 处于勾选状态

开启纹理导入设置中 Read/Write Enabled,纹理在传到GPU之后,CPU端的数据也会一直保留在内存中。因为在移动端显存共享内存,会导致内存占用加倍。因此需要注意是否有需要在CPU端访问的纹理,比如:需要通过脚本获取纹理像素的情况下,就要开启纹理导入设置中的 Read/Write Enabled。

  • 模型文件导入设置中 Read/Write Enabled 处于勾选状态

除了需要脚本中访问的网格,作为网格碰撞器中的网格,脚本中用StaticBatchingUtility.Combine静态合批的网格,以及粒子系统发射的网格之外,其它模型建议不要勾选此项 ,否则会在内存也保留一份网格实例占用内存。

  • 模型导入设置[Rig]选项页中Optimize GameObject没有勾选

建议开启Optimize GameObject,这个选项可以把SceneManager中用于skinning的节点都去除,节省了场景节点树更新以及查询的CPU消耗,对于需要做挂点的节点可以添加到例外列表中。

  • 使用第三方音频插件时没有禁用Unity内置音频

不需要使用Unity内置音频模块的时候,建议Editor中通过勾选Edit->Project Settings->Audio->Disable Unity Audio来完全禁用FMOD模块,避免不必要的CPU消耗

CPU常见性能问题

  • 频繁调用的Camera.main

建议脚本做好Main Camera的Cache。Camera.main实际为GameObject.FindGameObjectsWithTag(“MainCamera”)调用,主要因为引擎无法得知用户通过脚本设置的MainCamera,CPU消耗较高。

  • 脚本中大量UnityEngine.Object的判等操作

建议改为用InstanceID来判断即Object. GetInstanceID,运行期间保证唯一。 因为Object的判等还有额外的耗时操作,而Int类型的判等就非常快速了。同理,使用Object作为key的数据结构也建议改用InstanceID做key。

  • 用于查询操作的数据使用list数据结构

List线性结构Contains的耗时非常高,建议改为hashset,hashtable之类的查询操作效率高的数据结构。

  • 加载资源时每帧从Assetbundle加载的Asset数量没有限制

在场景内每帧从Assetbundle加载的Asset数建议限制在2到5个,数量高时耗时过长容易造成卡顿。

内存常见问题

  • 加载场景的时候有 一段内存尖峰

常见的情况是有无索引的资源被加载进来,然后因为UnloadUnusedAssets被卸载掉。内存尖峰基本都是对游戏本身无用的内存,但是可能会因此造成游戏在内存紧张的机器上被强制关闭。

  • 静态索引导致的内存泄漏

一些内存占用较大的资源如纹理,因为有静态索引而无法在切换场景或者调用UnloadUnusedAssets时被卸载掉,因此内存的泄漏量会随着用户切换场景的次数而增加。

  • Mono内存池总大小与当前使用大小的差值较大

这个值越大说明有越多的不必要内存池扩展,比如说在同一帧内有加载大量资源,实例化大量对象等,可能让内存池瞬间膨胀的操作。

  • GC分配量较大

项目Review过程中,除了CPU时间占用和内存分配量,我们还会留意脚本函数的GC分配。GC分配越频繁,量越大,由于Mono内存池可用内存不足导致的GC.Collect(造成卡顿原因之一)调用就越频繁,并且可能引起mono内存池不必要的扩展,因此脚本函数的GC分配量是既影响CPU也影响内存的重要参数。对于GC分配量。

我们建议的参考数值为:
对于基本每帧都会分配GC的函数,GC分配量大于2KB的建议都确认下是否有可能把临时变量抽取出来。
对于偶尔分配GC的函数,GC分配量大于10KB的建议都确认下分配的数据结构是否有优化空间。

GPU常见性能问题

  • 特效渲染的Pass数量较多

一些特效的渲染可以合并到同一个Pass以节省GPU开销,另外RenderTexture在可以共用的情况下尽量共用

  • 同屏面数过多

同屏面数建议在20W以下,较优情况是控制在10W以内

  • UI元素在需要隐藏的时候使用了设置Alpha为0的方式

实际上GPU依然需要对UI mesh进行渲染,建议不要通过设置Alpha为0的方式来隐藏UI。

  • 当使用网格作为地形时,适当切分地形网格

在网格顶点数很高情况下需要依靠硬件裁剪来剔除顶点,比较消耗GPU性能,建议按照大概的同屏可见范围来切分地形网格。

  • UI元素过多依赖多层元素的混合来达到美术效果

这样会造成较多的Overdraw,建议尽量通过预制纹理来做到想要的效果。

资源导入设置检查

Project Review开始阶段,Unity技术支持工程师一般会先同开发团队沟通整个项目的情况,了解目前已知的性能问题,然后开始进入资源导入设置检查环节。最常见的检查项包括以下内容。

模型导入设置

  • 检查Read/Write Enabled是否开启

开启Read/Write Enabled一般是用于运行时修改Mesh的顶点数据,开启这个选项会导致Mesh的内存占用翻倍。因此如果项目中不需要在运行时修改这些Mesh数据的话,我们建议把这个选项关闭。

  • 检查Animation Type 有没有设置成None

Unity默认的Animation Type是Generic,对包含动画数据的FBX文件是适用这个选项的。但是如果FBX文件中没有包含动画数据,而只是普通静态Mesh的话,设置为Generic会导致引擎自动为这个Mesh的GameObject添加一个Animator组件,导致不必要的消耗。因此对于不包含动画数据的模型文件,我们建议把这个选项设置为None。

纹理导入设置

  • 检查Generate Mipmaps选项有没有开启

对3D物体,关闭Mipmap会导致远处的纹理有闪烁感,而且渲染性能较低,因此建议开启3D物体上纹理的Mipmap。开启Mipmap的缺点是会导致纹理的内存占用更大。对2D物体,Mipmap并不会导致闪烁和性能问题,所以建议关闭2D以及UI纹理上的Mipmap选项。

音频导入设置

  • 音频压缩格式

对IOS平台,建议采用mp3格式压缩音频文件,安卓平台建议使用Vorbis格式,因为这两种格式分别在这两个平台上有硬件解码的支持。

  • Force to Mono

手机游戏往往对声音质量要求不高,如果不需要立体声效果,可以把这个选项打开,将音频文件导入为单声道音频。

动画导入设置

  • 动画帧率

在Animation页面检查动画的帧率,一般30FPS足够满足大部分游戏的效果,如果发现有制作成60FPS的,建议美术重新制作成30FPS。

Project Review常用性能分析工具

Project Review最主要的工作是使用各种工具来分析项目中存在的性能问题,最长用的工具包括Unity Profiler,Unity Memory Profiler, XCode Instrument. XCode Instrument内又包含了很多工具,其中最常用的有Time Profiler,Allocation以及Capture GPU Frame。

Unity Profiler

Unity Profiler中最常检查的内容是CPU Usage,其中GC Alloc和Time ms最为重要。GC Alloc展示了每帧在Mono堆上进行内存分配的代码,过于频繁的在堆上分配内存会导致Mono定期触发GC.Collect操作,进而导致游戏卡顿。因此我们建议对单帧2K以上的内存分配,以及每帧20B以上的内存分配进行排查。如果能把堆内存的分配降到最低是最好的。Time ms展示了每一帧CPU耗时最高的函数,通过这项可以找到耗时不合理的代码,然后进一步最代码进行优化。
  
Unity Memory Profiler

Unity为5.3以上的版本提供了一个新的Memory Profiler工具,这个工具目前还是以外部插件方式提供的。这个工具通过图形的方式展示了工程中占用内存最高的资源类型,因此可以很方便的进行资源内存的优化。另外还可以在游戏的不同时间点抓取多个快照,通过比较内存占用的不同,来发现某些资源内存泄漏的情况。

XCode Instrument – Time Profiler

左上角是Instrument的Time Profiler工具,右下角是Unity Profiler,可以发现它们非常想像。区别在于Time Profiler可以分析一段时间范围内不同函数的时间消耗,而Unity Profiler只能分析一帧内代码的时间消耗。另外Time Profiler可以显示引擎底层耗时高的代码堆栈,非常方便从底层去理解性能问题的原因。Unity Profiler只能显示引擎代码中添加标签的函数耗时,因此往往在Instrument Time Profiler中可以看到更多有用的数据。

XCode Instrument – Allocation

Allocation是用于分析内存分配的工具。默认情况下,它会开启Created & Persistent选项,这代表它会记录一段时间内分配出来但是没有释放的内存。因为有了这个功能,我们可以很方便的检查游戏中存在的内存泄露。一般的使用方法是在游戏主菜单界面开启Allocation检测,进入战斗场景测试一段时间再回到主菜单界面,然后检查有哪些内存分配但是没有被释放。这部分内存就可能包含存在泄漏的内存。

Capture GPU Frame

从XCode内启动游戏在真机运行,通过XCode内的Capture按钮可以抓取当前渲染帧的全部数据。界面左边展示了所有的Drawcall列表,中间上方是当前Drawcall渲染出的画面,下方是当前Drawcall的相关数据,右上方是当前Drawcall用到的纹理数据。这个工具可以显示每个Drawcall的耗时,因此可以用来检查哪些对象渲染耗时太高。进而分析是Shader原因,还是网格体太复杂等等。

其他

在安卓平台下并没有XCode中这么全面的性能分析工具。最常用的工具有Adreno Profiler和Mali Graphics Debugger,这两个工具都是用来进行GPU性能分析的。

三、游戏优化步骤:

1.从美术资源,面片,顶点,骨骼数,Mipmaps,Animation,材质

2.逻辑方面,不用的资源释放,加载时是否一直在消耗内存,该缓存的缓存

3.GPU  shader 是否shader比较耗

4.drawCall   动态 :材质一致时,整体优化   静态:unity中标志static,或者代码编程合并优化 材质一直,并且都有meshfilter且不能时static

批处理优化  .DrawCallBatching批处理
  1.首先理解为什么两个没有使用相同材质的物体计时使用批处理,也无法实现DrawCall数量的下降和性能提升?

因为:被批处理的两个物体使用相同材质的目的,是在于纹理要相同,这样才能达到同时渲染的目的,故才打包图集,使纹理相同。

2.动态批处理注意点?

(1)动态批处理仅支持肖于900顶点的网格物体。

3. 对物理组件的优化:

能少用,则少用

4. 对CPU的优化:

5. 代码优化:

代码善于使用ref来传值,而不是复制传值,比如mat矩阵,复制显的笨重

Unity内存优化(贴图层面)https://www.cnblogs.com/joeshifu/p/5489906.html

Unity游戏开发中的内存管理_资料相关推荐

  1. 游戏开发中的道具管理

    前言 在开发游戏的时候,我们肯定会处理道具,不论是多大的游戏都有道具.道具的管理方式也是多种多样.下面记录一下我个人在游戏开发中的道具管理方式. 道具的定义 道具的属性基本分为: ID.类型.数量.图 ...

  2. 拒绝内存泄露,谈一些纯代码iPhone开发中的内存管理

    笔者刚从学校出来,算上实习期,接触iPhone开发已有半载,也算是对iPhone(iOS)开发中的内存管理有了些认识,由于开发中一直没有用Interface Builder,本文就谈谈纯代码iPhon ...

  3. Unity游戏开发中的向量运算-点乘和叉乘

    Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...

  4. PureMVC在Unity游戏开发中的应用

    作为开发人员,我们都想写出优雅的代码,可又苦于自身能力不知该如何下手,而框架的作用正在与能够让你规范的去开发. 之前写Web的时候,总被要求采用MVC架构,的确非常好用,也从来没有质疑过这种架构的好与 ...

  5. java opencv bytearray转mat_OpenCV开发中的内存管理问题

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 引子 2020年第二篇技术文章,最近比较忙,事情比较多,搞了一个新的系列技术文章,还没有完整的搞好,抽空写一篇 ...

  6. Unity游戏开发中ECS思想介绍

    ECS是啥? ECS是一种编程思想,和传统的面向对象有区别 有一篇文章说的挺好,大家可以看看,这里只简要概括一下! 浅谈<守望先锋>中的ECS架构 ECS: E(Entity)实体 C(C ...

  7. confluence 编辑器这次没有加载_喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:喵的Unity游戏开发之路 - 多场景:场景加载 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏 ...

  8. 喵的Unity游戏开发之路 - 对象持久化

    原文: https://mp.weixin.qq.com/s/NNLHFLEBJE_UIksBtDcglA 前言         很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此 ...

  9. Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法 4 ...

最新文章

  1. 3DSlicer24:Module-Create Scripted
  2. Spring/SpingMVC常见问题总结
  3. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (7) - 流水线前端/译码后指令缓存
  4. Android RecyclerView拖放
  5. mcafee杀死oracle,【搬运】跟客服要来的迈克菲卸载工具,拯救你的笔记本
  6. 人工智能(12)大数据
  7. 爬取网易云音乐评论,破解网易云加密算法
  8. Total Commander的SFTP插件安装
  9. 【机器学习】机器学习之决策树(基于ID3、CART挑选西瓜)
  10. 马建威android视频,5.25春季班高级班第三期第五节课课堂总结
  11. python培训班大概多少钱
  12. 美团因拖欠骑手工资被约谈;传苹果6月6日举办全球开发者大会;Linux 5.18开始启动停止支持ReiserFS|极客头条
  13. html导出带页码的word,使用js把html导出word,并配置样式和分页功能
  14. linux locale设置
  15. ajax 提交form表单,上传文件
  16. 基于javaweb+mysql的校园招聘平台招聘管理系统(平台、企业、用户)
  17. 数据库----------唯一约束、默认约束、零填充约束
  18. 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析
  19. 全球与中国IHE XDS.B(跨企业文档共享)市场现状及未来发展趋势
  20. 微人事 star 数超 10k 啦!聊聊如何打造一个 star 数超 10k 的开源项目

热门文章

  1. 那些年,我熟知的影视明星(1)
  2. 【观察】新华三:智慧计算“再进化”,算力创新“再升级”
  3. 解决数据库 修改表属性时报错:1138-Invalid use of NULL value
  4. 机房志 | 一篇中二的文章
  5. vfp python_python foxpro数据聚合和分组运算——分组级运算和转换(3)
  6. python如何往oracle写入数据_python3向oracle插入数据
  7. 个人开发STDF文件解析软件 STDF BASE TOOL
  8. day1:如何利用SQL查找表中数据类型
  9. ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好
  10. R语言使用epiDisplay包的roc.from.table函数可视化临床诊断表格数据对应的ROC曲线并输出新的诊断表、设置cex参数指定AUC值及其文本标签字体的大小