如何定位游戏发热问题

1)如何定位游戏发热问题

2)Unity获取指定脚本的引用对象

3)如何知道打包时的一个Shader有多少变体

4)如何优化Font.CacheFontForText频繁造成的耗时峰值


这是第300篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com

UWA QQ群2:793972859(原群已满员)

Performance

Q:目前项目的发热问题很头疼,2D游戏,基于TileMap、SpriteRenderer和UGUI的渲染,关闭了垂直同步,TargetFrameRate设置为60。Android和iOS上发热都很严重,而且在比较好的机型(比如iPhone 12这种),发热现象甚至更明显。

跟大部分情况不同,发热并没有怎么影响帧率,在大部分机型上,帧率都不是问题,连iPhone 8机型,都能60帧跑满。

在Unity Profile和Xcode都进行过性能分析,CPU最明显的热点函数就是Spine的骨骼动画更新计算。然而到一个没有骨骼动画的场景,发热现象稍好点,但还是比预期的要烫不少(场景中除了地面和一些静态贴图,基本就没有多少东西)。

另一个比较普遍的发热点是网络测试,在某场景关闭网络后,发热依然严重。甚至启动游戏,停留在登录界面一会儿,发热现象都比别的游戏更明显。

猜测是否由于每帧的顶点数量过多造成的,在游戏中Unity的Status面板,顶点数量Verts达到了40KB,三角形Tris也有几乎20KB。看起来很多,但我不太清楚当前主流游戏这个数值的级别大概是多少。而且,顶点和三角形的数量很难解释登录界面依然容易发热,毕竟登录界面这些数值不可能很高。

自己也做了很多测试了,实在搞不清楚问题究竟在哪儿,Unity是还有什么特别需要优化的,针对发热的点吗?

A1:可以用Xcode抓帧看看带宽,Load Store Action是否合理。

感谢littlesome@UWA问答社区提供了回答

A2:以下是我的建议:

1. iPhone 8上跑满60帧,证明CPU、GPU都没有到达瓶颈,消耗在较为合理的范围。推荐在Unity Profiler看一下CPU端的消耗,以及查看一下DrawCall数量。

2. 推荐使用FrameDebugger,看一下是否有冗余的物体或者后处理在渲染,尤其是你说的启动界面有发热。

3. 如果低级错误都排查过了,那么建议看一下是否用了原生的插件。

4. 渲染的分辨率是否调整过了,RenderScale的值和FrameDebugger可以查出来分辨率。

感谢张振东@UWA问答社区提供了回答

A3:关于发热的问题,通常要从几个角度排查:CPU压力(耗时)、GPU压力(耗时和带宽,可以考虑降低分辨率看看发热问题是否会有改善)和IO等几个角度。从题主的问题上看,耗时应该是没问题,都能跑满帧(当然60帧本身就是对发热影响比较大的一点,可以看看限制30帧会不会发热有下降),所以要看看一些隐形的东西是否有问题。比如带宽,可以用Snapdragon在高通手机上跑一跑。如果带宽较高,看看纹理的一些设置是否合理,比如是否压缩、是否开启Mipmap,这两项通常都是需要设置成开启的。还可以查看是否有不必要的BlitCopy操作,在URP项目中比较容易出现Copy Color和Copy Depth浪费。对于IO,需要看看是否存在子线程里面有频繁IO的现象。

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/62910e1ab87a457351669b0c

Script

Q:Unity获取指定脚本的引用对象:一个GameObject上挂载了一个Script,这个Script引用了很多资源。如何只获得这个Script引用的资源呢?AssetDatabase是会获取所有的引用,但是并没有做区分。

A1:有Guid可以使用以下代码加载:

var assetPath = AssetDatabase.GUIDToAssetPath(guid);

var texture2D = AssetDatabase.LoadAssetAtPath(assetPath);

感谢萧小俊@UWA问答社区提供了回答

A2:通过SerializedObject拿到了所有的ObjectReference,然后AssetDatabase.GetAssetPath获取对应路径:

感谢题主null@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/6291b10cb87a457351670c7e

Shader

Q:有什么方法可以知道打包的时候的一个Shader有多少变体?

A:直接使用Unity提供的回调函数,该函数会在Shader被打包(无论是打AssetBundle包还是Build的时候)时自动调用。

如图的三个参数:“shader”表示回调函数当前在处理的Shader资源,”data”是参与编译的变体列表。所以data.count()就是该Shader资源的(参与编译的)变体数量了。所以,只要在回调函数逻辑里把这两个参数Log输出就行了。

感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/629d6e39b87a4573517010b0

UGUI

Q:请问 Font.CacheFontForText频繁造成耗时峰值,该如何优化?

A:可以参考这篇文章:《Unity3D UGUI 优化:Font.CacheFontForText》

Font.CacheFontForText是在Text渲染时,当对应字体的FontTexture找不到需要渲染的字符时,就会重新生成FontTexture,FontTexture尺寸越大,重新生成这张FontTexture就越耗时。

因此为了减少运行过程中该函数造成的耗时峰值,可以事先渲染所需要的字符,避免在运行时出现重新生成FontTexture。

使用UWA的GOT Online工具验证了一下上面所提到的解决方案,结果对比如下所示:


优化前


优化后


优化后之所以还是存在部分Font.CacheFontForText的耗时峰值,是因为在测试后期又渲染了之前FontTexture中没有的字符。

感谢宗卉轩@UWA问答社区提供了回答,欢迎大家转至社区交流:

https://answer.uwa4d.com/question/629d6710b87a45735170097b

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com

官方技术博客:blog.uwa4d.com

官方问答社区:answer.uwa4d.com

UWA学堂:edu.uwa4d.com

官方技术QQ群:793972859(原群已满员)

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

推荐阅读更多精彩内容