Unity亚洲开发者大会会议简录之技术篇,Profiler的一些参数的意思
2014Unity亚洲开发者大会会议简录之技术篇
拖公司的福,有幸去了一趟北京参加了一场Unity3D的交流盛宴,在为期两天的时间内,不仅有着技术上收获,也有心灵上的震撼。现在先来说说技术方面的一些比较重要的知识,但是会跳过Unity3D后续版本的一些新功能介绍,比如新的GUI、动画系统的加强、以及新的AssetBundle打包工具。因为等之后版本出来后,自然会有更加详细的文档以及说明出来。
项目开发、管理和发布策略
四大准则
- 准则一:美术资源量对于程序发布包大小、性能优化、内存占用量的影响,往往超过其他各种因素
- 技术美术和关卡设计师对于游戏性能承担着非常重要的责任
- 程序员往往无法补救由于滥用美术资源而造成的性能问题
- 准则二:项目团队应该通过编写工具来保证美术资源的合法性
- 美术规范文档无法在实际上保证美术资源的合法性
- 程序员应该通过Unity编辑器扩展技术,为美术师实现完整的美术资源合法性检查工具
- 准则三:对渲染效率和内存占用的优化应该在项目实施过程中反复进行
- 针对CPU端/游戏逻辑的优化往往能够比针过GPU端/Shader的优化取得更大的作用
- GPU/Shader的性能优化应该放在最后进行
- 善用Unity Profilers (这点非常重要,后面会有对这个功能的详细讲解)
- 准则四:从反向工程的角度理解项目开发,以最终需要达到的目的来决定程序的架构设计以及关键技术的方案选择
- 是否需要进行代码的增量更新
- 是否需要严格控制程序发布包的大小
- 是否需要支持低端移动设备等等
Mipmaps
凡是3D场景,都应该尽可能启用MipMaps
耗费内存,提升CPU
硬件分级策略
- 为什么进行分级
- 移动GPU之间的性能差距可能高达10倍以上
- 效率和效果之间永远存在着矛盾
- 怎么分级
- Resolution分辨率
- Post-processing 后期特效
- MSAA 反锯齿
- Anisotropy 异向纹理
- Shaders
- Fx/particles density, on/off 粒子发射器的数量、密度。单人和多人的不同处理
初级内存管理策略
一个游戏可以使用的内存容量简单的可以理解为:可用内存为整个内存的%50。比如512M的内在可以使用256M。
- 控制贴图大小
- 选择合适的压缩格式
- PVRTC,DXT,ATC,ETC
- 使用Prefabs
- 用好AssetBundles
- 编写自己的ObjectPool和LoadManager
- 通过对象池来避免内存的频繁操作,从而避免内存碎片影响到大内存块的申请;切换场景时不释放公共的UI资源
- 通过LoadManager,保证在同一时间段内公载入一个www对象,实现顺序加载
AssetBundle
老的AssetBundle打包的时候有比较多的弊端,依赖打包的时候很麻烦。一个包改变了,相关联的包都要重新打一次包,这个过程会严重的影响开发效率。这个问题在Unity 5.0会得到解决
AssetBundle的效率比Resources效率要低。这是没办法的事
Profiler 性能分析器
Unity3D提供了一个非常强大、非常易于使用的性能分析器,在平常的使用过程中或多或少都会碰到一些搞不明白的地方,这一次官方给了一个比较详细的解答。一些简单的功能就不在此介绍了,一看就懂。
重要的参数指标:
GC Alloc
记录了游戏运行时代码产生的堆内存分配,这是一个非常重要的参数,甚至比Time更加重要。ManagedHeap的增大,会加速GC回收的到过。如果这个参数有一个比较高的值或者出现在每一帧中,那么就要引起重视。以下是一些不太引起注意的地方引起的GC分配:
- GameObject.GetComponet()会引起GC的分配
- 尽量缓存组件
- Object.get_name()
- 如果每一帧都需要比较,可以缓存名字
- foreach循环
- 每次foreach会产生一个enumerator
- 尽可能避免使用LINQ
- 部分功能无法在某些平台上使用
- 会分配大量GC Alloc
- 协程Coroutine
- 开启一个协程,至少分配373的内存
String连接
- 使用StringBuilder或String.Format来代替而不是用”+”来进行连接
关注原则:
检测任何一次性内存分配大于2KB的选项
- 检测每帧都具有20B以上内存分配的选项
- GameObject.GetComponet()会引起GC的分配
Time
记录了游戏运行时的每帧cpu战胜。当然是越小越好,如果占用过大那就找原因吧。
CPU Usage
- WaitForTargetFPS
- vSync功能所致或者帧数限制
- Overhead
- 所有无法统计的时间总和,理论值应该为0.
- Physics.Simulate
- 物理模拟占用的CPU
- Camera.Render
- 相机渲染准备工作的CPU占用量
- RenderTexture.SetActive 设置RenderTexture操作(和相机数一致)
- 比对当前帧与前一帧的ColorSurface和DepthSurface
- 如果一致则不生成新的RT, 否则则生成新的RT,并设置与之相对应的Viewport和空间转换矩阵
- GUI.Repaint
- GUI的重绘,使用的Unity3D自带的GUI,极度不推荐使用
Cleanup Unused Cached Data
清空无用的缓存数据,主要包括RenderBuffer的垃圾回收和TextRendering的垃圾回收
RenderTexture.GarbageCollectTemporary
存在于RenderBuffer的垃圾回收中,清楚临时的FreeTexture
TextRendering.Cleanup
TextMesh的垃圾回收操作
Application.Integrate Assets in Background
遍历预加载的线程队列并完成加载,同时,完成纹理的加载、Substance的Update等。主要是加载场景的时候会用到,多线程加载
AssetBundle.LoadAsyncIntegrate
多线程加载AssetBundle的资源
Loading.AwakeFromLoad
在资源加载时会用到,对每种资源进行处理
- WaitForTargetFPS
GPU Usage
Mesh.DrawVBO
GPU中关于Mesh的Vertex Buffer Object的渲染耗时
Shader.Parse
资源加入后引擎对Shader的解析过程
Shader.CreateGPUProgram
根据当前设备支持的图开库信息来建立GPU工程
Profiler需要时刻关注的参数
- CPU—GC Alloc
- CPU—Time
MemoryProfiler—Other
ManagedHeap.UsedSize
移动游戏建议不超过20M
WebStream
通过WWW加载留下的东西,一般会比SerializedFile大得多。包括压缩和解压的东西
SerializedFile
通过WWW等方式加载本地的AssetBundle的留下的序列化文件,看是否被卸载掉
- MemoryProfiler—Assets
- 查看是否有重复的资源
- Device.Present
- GPU的Presentdevice确实非常耗时,一般出现在使用了非常复杂的Shader等;
- GPU运行的非常快,而由于Vsync的原因,使得它需要等待较长时间;
- 同样是VSync的原因,但其他线程非常耗时,所以导致该项等待时间很长,比如过量的assetbundle加载时容易出现该问题
- Shader.CreateGPUProgram
StackTraceUtility.PostprocessStackTrace() StackTraceUtility.ExtractStackTrace()
Debug.Log()调试信息造成,这是一个很耗时间的操作。发布的时候尽量去掉
GarbageCollectAssetsProfile
引擎在执行UnloadUnusedAssets操作
总结
授人以鱼,不如授人以渔。技术的进步是无止境的,大部分的时候都需要我们自己去解决问题,只有方法才是真正的解决问题之道。
善用、活用Profiler!
- 经常使用Profiler为项目来进行体验
- 通过Profiler.BeginSample和Profiler.EndSample来自定义检查范围
关注CPU & Memory Profiler
- GC Alloc、 Time、 Assets、WebStream…
Unity亚洲开发者大会会议简录之技术篇,Profiler的一些参数的意思的更多相关文章
- [生活日记]参与unity非游戏行业开发者大会小结
今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国, ...
- WGDC2019第八届全球地理信息开发者大会(北京)
WGDC2019第八届全球地理信息开发者大会 会议召开时间:2019-07-09 08:00至 2019-07-10 18:00结束 会议召开地点:北京 北京国际会议中心 朝阳区北辰东路8号 会议 ...
- XBox 开发者大会
今天参加了微软的Xbox开发者大会,虽然没我什么事情,不过还是有不少的收获,随便说说自己的一点感受吧. 先上几张图,附带妹子一个,不过手机不清楚哈,~~ 1 ID@XBOX开发者计划与独立游戏开发者 ...
- 2013eoe移动开发者大会圆满落幕
(国内知名Android开发论坛.安卓开发社区推荐:http://www.eoeandroid.com/) 2013eoe移动开发者大会9月14号于国家会议中心盛大召开并圆满结束,超过2000个开发者 ...
- [2013 eoe移动开发者大会]靳岩:从码农到极客的升级之路
(国内知名Android开发论坛 eoe开发者社区推荐:http://www.eoeandroid.com/) 前天,2013 eoe 移动开发者大会在国家会议中心召开,eoe 开发者社区创始人靳岩在 ...
- 6月24日AppCan移动开发者大会礼品清单遭泄露
6月24日,第一届AppCan移动开发者大会将在北京国际会议中心举办,大会以”平台之上,应用无限”为主题,全景展现移动应用发展趋势.AppCan 移动技术蓝图及80万开发者的技术实践成果. 大会现场礼 ...
- 【6.24-北京】AppCan移动开发者大会:最新议程曝光
6.24,首届AppCan移动开发者大会将在北京国际会议中心召开. 大会以“平台之上,应用无限”为主题,旨在探讨在“互联网+双创”的大潮下,通过移动互联网技术.思维.模式,帮助开发者/创业者实现创新创 ...
- 一起看看2016中国第三届CSS开发者大会有哪些大咖演讲
中国第三届CSS开发者大会于2016年12月17日在广州举办.由W3C.w3ctech.前端圈主办.本次大会我们将邀请行业内知名讲师,与大家共聚广州,畅聊CSS. 快捷报名通道:http://www. ...
- SDCC 2016中国软件开发者大会十三大主题
SDCC中国软件开发者嘉年华(Software Developer Carnival China),是由全球最大中文IT社区CSDN于2007年创办的软件技术领域顶级盛会,将如约于2016年11月18 ...
随机推荐
- [Phoenix] 六、MR在Ali-Phoenix上的使用
摘要: 在云HBASE上利用MR BULKLOAD入库PHOENIX表或通过MR构建PHOENIX索引表. 一.MR在Phoenix上的用途 利用MR对Phoenix表(可带有二级索引表)进行Bulk ...
- types of transfrmations
http://math.wallawalla.edu/~duncjo/courses/math113/winter08/notes/9-1_math113.pdf Name What Changes ...
- ajax json html 结合
<table id="datas" border="1" cellspacing="0" style="border-col ...
- Refusing to install package with name “XXXX”
我的执行步骤 我创建了一个名叫express的文件夹,想在这个工程中学习express 进入该文件夹,执行npm init来初始化package.json文件,一直回车. 我们会发现当前文件夹多了一个 ...
- LeetCode(83)Remove Duplicates from Sorted List
题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For ex ...
- react-native填坑--react-navigation
Navigator已经被React Native废弃了.也许你可以在另外的一个依赖库里react-native-deprecated-custom-components里找到.不过既然官方推荐的是re ...
- linux应用之openssh server安装及配置(centos)
安装OpenSSH Server 首先,我们搜索一下CentOS的软件库里面有没有已经定义好的SSH服务器包: $ yum search ssh ... ... openssh.x86_64 : An ...
- Android Studio 使用Gradle多渠道打包
第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name ...
- CodeForces960F:Pathwalks (主席树+DP)
You are given a directed graph with n nodes and m edges, with all edges having a certain weight. The ...
- nginx开发_ngx_palloc源码解析
功能简介 ngx_pool_t是nginx开发中最经常使用到的内存容器.对动态内存的封装,由框架进行创建与释放,模块开发过程中仅需要进行内存申请,不需要关注何时释放.常见的pool对象有: 1. ng ...