Untiy文档总结(1)-Profiling
这段时间上班了,不是什么大公司,虽说很闲但是不能断了学习,就开始看优化有关的文档,虽说自己英语渣的要死,但也要读下去,逼着自己翻译完了,里面有抄Unity圣典的,但自己是看Unity5.5文档写的,只是给你看的,也许哪天小伙伴会看见吧,凑活着看吧,有总比没有强.
unity优化的部分
CPU:蒙皮、批处理、物理模拟、用户的脚本、例子系统等等。
GPU:着色器、DrawCall,图片。
内存优化
一共有两部分内存,一部分是Mono内存,一部分是unity内存。
Mono内存
Mono内存为Unity对象(游戏对象,资源,组件等等)控制脚本对象和封装器。当资源分配和可用内存不相配或者在调用 System.GC.Collect()时,清理器就会清理空间。
内存被分配在堆块中。如果要分配的资源和已分配块不相符时,就会分配更多的内存。堆块将会保留在Mono里,直到app关闭。也就是说,Mono不会释放任何OS使用的内存(Unity 3.x)。一旦你分配了一定数量的内存,它就会被mono保留,并对于OS来说不再是可用的。即使当你释放它,它也仅仅变为是对Mono可用的,而不是对于OS可用。分析器中的堆内存值仅会增加,而永远不会减少。
使用System.GC.GetTotalMemory()来得到已使用的所有Mono内存。
Unity内存
Unity内存控制资源数据(贴图,网格,音频,动画等等),游戏对象,引擎内部(渲染,粒子系统,物理等等)。使用Profiler.usedHeapSize()来得到已使用的所有Unity内存的数量。
内存映射
目前没有任何工具但是你可以使用下列方法。
·unity分析器-不完美,跳过了一些东西,但是你可以得到一个概览。
·内置分析器-
·显示已使用的堆和已分配的堆
·显示每一帧Mono资源分配的情况
·可以制作自己的工具根据这些API:
● FindObjectsOfTypeAll (type : Type) : Object[]//返回所有给定的类型的对象
● FindObjectsOfType (type : Type): Object[] //返回指定类型的所有处于激活状态的对象
● GetRuntimeMemorySize (o : Object) : int //返回运行时资源所占的内存的大小
● GetMonoHeapSize //返回Mono对内存的大小
● GetMonoUsedSize //返回Mono使用的内存大小
● Profiler.BeginSample/EndSample - profile your own code //分析自己的代码
○ UnloadUnusedAssets () : AsyncOperation //卸载没有使用的资源--异步操作
● System.GC.GetTotalMemory/Profiler.usedHeapSize
对已加载对象的引用——没有方法可以得到它。一个变通的方案是找到场景为公有变量在场景中找到引用。
垃圾回收器(Garbage Collector)
·当系统无法把新数据分配到已分配的堆块中,就会开始工作。
·不要在移动设备上使用OnGUI()。
·每一帧会被绘制多次
·完全重绘视图
·创建大量的内存分配调用,并需要垃圾回收器来清理
过快地创建/移除过多的对象?
·这可能会导致碎片。
·使用编辑器分析器来跟踪内存活动。
·内置分析器可以被用于跟踪mono内存活动。
·当它可以有一个间隔时,你可以使用System.GC.Collect() 这个.Net函数。
分配小技巧
·预先分配一个列表,可以重复使用物体,例如自己创建一个内存管理。
·不要在每一帧分配大量的人内存,使用预先分配和缓存来代替。
·内存碎片问题?
预先分配一个内存池
使用一个列表来存储那些当前不用的,但是会重新使用的游戏对象,来代替重复的销毁创建。
Mono内存溢出
·分析内存的活动-第一张内存页什么时候被填满的。
·你真的需要如此多的一张内存页都不够的游戏对象?
·对于局部数据使用结构体而不是类。类被分配在堆区,结构体被分配到栈区。
·阅读Understanding Automatic Memory Management(https://docs.unity3d.com/Manual/UnderstandingAutomaticMemoryManagement.html)页面。
内存不足崩溃
在某些是时候,游戏会因为“内存溢出”而崩溃,尽管在理论上是合乎情理的。当这种情况发生时,对比正常游戏的内存足迹和已分配的内存大小。如果两个值不相似,说明这发生了一个内存峰值。这可能是由于:
·同一时间加载了两个比较大的场景 --解决方法是在两个场景之间使用一个空场景。
·附加的场景加载--移除不用的部分来维持内存的大小
·巨大的资源包被加载到内存
·纹理没有被适当压缩(对移动设备是无用的)
·纹理被启用了获取/设置像素贴图,这钟操作需要在内存中创建一个贴图的未压缩的复制品。
·动态加载JPEG/ PNG实质上是没有被压缩的
·加载时时巨大的mp3文件被标记为未被压缩的
·在怪异的缓存中存在没有使用的资源,像静态MonoBehavior区域,当场景变换时他不会被清理。
Untiy文档总结(1)-Profiling的更多相关文章
- MongoDb 创建、更新以及删除文档常用命令
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, o ...
- 31 Godoc: documenting Go code 编写良好的文档关于godoc
Godoc: documenting Go code 编写良好的文档关于godoc 31 March 2011 The Go project takes documentation seriousl ...
- Go文档:go命令
目录 go go bug--启动bug报告 go build--编译包及其依赖包 go clean--删除对象文件和缓存文件 go doc--查看包或符号的文档 go env--打印环境变量 go f ...
- 文档翻译第001篇:Process Monitor帮助文档(Part 1)
[译者注] Process Monitor是一款非常著名的系统进程监视软件.总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统中所有文件的 ...
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
随机推荐
- python爆破定长密码脚本
def get_pwd(str, num):#str为可选字符集,num为密码长度 if(num == 1): for x in str: yield x else: for x in str: fo ...
- 快速实现python c扩展模块
1 python扩展模块的组成 在python中,对于一些和系统相关的模块或者对性能要求很高的模块,通常会把这个模块C化.扩展模块中主要包含下面几个部分: init函数,函数名为:init+模块名, ...
- Professional C# 6 and .NET Core 1.0 - 37 ADO.NET
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET -------- ...
- Quartz_理解3
什么是Quartz Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作. Quartz能干什么/应用场景 如网页游戏中 ...
- Sass与Compass——回顾
compass 是sass的一个工具库 compass在sass 的基础上封装了一系列有用的模块,用来补充和丰富sass的工能, 安装: compass是用 ruby语言开发的,所以安装它之前必须安装 ...
- 初识servlet--未完成
servlet到底是什么呢?今天我们一起看一下. 首先说下servlet是干啥的.servlet主要干这么一个事情:创建动态的问页面. servlet主要的功能是,访问外网,连接外部接口.它可以做如下 ...
- Java ArrayList小程序理解
package Collection; import java.util.ArrayList; import java.util.Iterator; //import javax.xml.crypto ...
- 内存管理 (C++)
转:http://hi.baidu.com/%D0%A1%B0%FC%D7%D349/blog/item/de1a8e4fa5eeafc3d0c86a68.html1.进程地址空间 Window ...
- 使用国内docker镜像源
在国内,通过Docker的pull和push命令访问hub.docker时,网络十分慢,而且会出现各种各样的网络连接问题.因此这里介绍下如何使用国内的镜像源,这里以DaoCloud为例. 注册DaoC ...
- masm32V11配置
本文写给学汇编语言程序设计刚起步的吧友.适用Windows操作系统.已入门的吧友请绕道. (1)masm32开发包的下载 要用汇编语言编程,首先得有个开发工具,汇编语言开发工具有多种,但本文仅介绍ma ...