内存

原文链接:https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity2.html

        内存消耗是一个关键的性能指标,对于有限内存资源的平台来说尤其重要,比如说低端移动设备。


内存消耗性能分析

        在Unity中诊断内存问题最好是通过Unity的Bitbucket中一款开源的可视化内存工具来进行。集成这款工具非常简单,下载链接库并且将包含的Editor文件放入一个项目中。

        这款工具可以在Unity5.3之后的所有版本中使用。当连接到使用IL2CPP构建的应用程序时,它可以捕捉到大量底层和托管代码内存消耗的信息。

        要使用这个工具,只需使用IL2CPP作为脚本后端构建一个项目,并且将其部署到适当的设备中。连接到Unity的常规编辑器内置CPU性能测试工具上,然后打开内存性能测试窗口(菜单: Window > MemoryProfilerWindow)并且选择Take Snapshot。

        设备上的应用程序会暂停一小段时间,此时数据正在生成并传输到Unity编辑器。接着,Unity编辑器会暂停并且解析收到的数据,这需要大量的时间。对于内存非常密集的应用程序来说,这些数据需要10-30分钟才能被解析出来。

        在此解析和加载操作期间,建议耐心等待。

(图片见原网页)

        这张截图来自于运行在IOS设备的标准资源场景,并且显示了超过四分之三的内存使用源于四个非常大的纹理,这些全都与飞机的机身有关。

        可视化的窗口可以被缩放,在应用程序中点击每个矩形来获取其更多信息。


识别重复纹理

        一个共同的内存问题是内存中的重复资源,在一个项目中由于纹理是最内存密集的资源,所以在Unity项目中纹理重复是最普遍的内存问题之一。

        重复的资源可以通过在同一个资源中加载的出现两个对象有同样的类型和同样的大小。在新的内存分析器的详情面板中,检查怀疑是完全相同字段的Name和InstanceID。

        Name字段是基于加载对象的资源文件,一般,它是不包含路径和扩展名的文件名。InstanceID字段表示在Unity运行时分配的内部识别码,这个数字在一个Unity游戏的单次运行中是独一无二的。

(图片见原网页)

        这张图展示了这个问题的一个简单例子。在这张图的左边和右边是从内存分析器5.4中详情面板的截图。显示在截图中的资源是在内存中单独加载的两个纹理。这个纹理有相同的名字和大小,暗示它们有可能是重复的。通过检查项目的Assets文件夹,可以确定其中只有一个名字叫wood-floorboards-texture的资源文件,这强烈指向了资源重复。

        每个独立的UnityEngine.Object在内存中有独一无二的InstanceID,这是当对象被创建时被分配的。由于这两个纹理有不同的InstanceID,这就通过确定表示有两组不同的纹理数据被加载到了内存中。

        由于文件名和资源大小是完全相同的,当InstanceID不一样时,就确定是这两个对象代表的一个纹理在内存中重复了(请注意:如果项目中有文件名完全相同的纹理,那么这个判断就不是绝对的,但是当它们的文件大小有完全相同的关系时就依然可以有力的指向这个判断)。


AssetBundle和资源重复

        造成内存中纹理和资源重复最普遍的原因是不正确的卸载AssetBundle。查看Unity的AssetBundle的最佳优化实践(已翻译)对于这个问题的描述。有关此问题的关键部分是“管理已经加载的资源”。


检查检查Image缓存,Image特效和RenderTexture内存使用

        在这个内存可视化界面中也可以可视化的看到Image特效和RenderTexture对象的渲染缓存。

(图片见原网页)

        上面的截图展示了一个应用了一些Unity的 Cinematic Image Effect的简单场景。Image Effect分配了临时渲染buffer以执行其计算。特别是Bloom效果分配了一些减小大小的buffer。由于IOS设备视网膜屏幕的高分辨率,这些临时buffer消耗了比项目其他部分多得多的内存。

        考虑到iPad Air2按照2048*1526来渲染,虽然在平板设备上运行,但是这超过了现代游戏机和PC常用的1080P分辨率。一个全屏的临时渲染buffer由于其格式不同会消耗一整个24或26MB的内存。这可以通过将渲染buffer的像素容积减少一半的方式降低75%的内存消耗。这通常不会显著的降低到结果的内存质量。

        优化Image Effect的临时渲染buffer和其他GPU资源的的一种方法是创建一个单独的“uber” Image Effect,它一次可以执行所有不同的计算。当使用Unity5.5或者更新版本时,可以使用新的UberFX(可以从GitHub上下载一个包,这个包提供了一个可配置的“uber” Image Effect,它可以执行Cinematic Image Effect需要的所有操作,并且比单独的Image Effect消耗更少)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 这是摘自Unity官方文档有关优化的部分,原文链接:https://docs.unity3d.com/Manual...
    Wenchao阅读 1,005评论 0 0
  • 问题 开发手机游戏时,常听到身边的人传授经验:“CPU和GPU是共享一份内存的”,但这句经验到底具体指的是什么,仿...
    DonaldW阅读 7,436评论 3 16
  • 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于unity3d对于内存的管理与优化...
    杨树叶的杨阅读 1,061评论 0 0
  • 在对应用进行优化时原生内存是非常关键的一部分,因为大部分的引擎代码是常驻内存的。当你把代码集成到原生控件时,你可以...
    Wenchao阅读 1,298评论 0 2
  • 10年了! 2008年10月份的某天,我接到舅舅的电话,让我第二天早上八点赶去报社报道,正式上班。 如今回想,想不...
    ld熊壮壮阅读 126评论 0 0