ui分离的进程 如何查找窗口句柄_谁动了我的UI 批处理?!Unity UI优化

1737f48721bc86e3dd00c33af55a4940.png

Unity的UI优化有分为好几个原则,其中一个重要的原则就是 “动静分离”。大家可能或多或少地听说过这个概念,我前几天看到一个帖子:

Unity: How dare you break my Batches?​thegamedev.guru
c7a871e77410d3f93109578732c66d0c.png

说这个问题的,我这里就集中精力把这问题在说的透一些把。

3D 引擎如何工作?(最简版本)

while(game_loop == true)
{
    上层:给我在a0点、b0点画两个三角形
    引擎:记录a0点、b0点坐标,组织数据,传给显卡
    显卡:画
}

引擎想,每次我的都要记录a0、b0点的位置,还有组织三角形的数据,实在太麻烦,我把数据保存起来不就行了么?

于是新的方式变成了:

while(game_loop == true)
{
    上层:给我在a0点、b0点画两个三角形
    引擎:
    {
        if(a0 == a1 && b0 == b1)
            取出保存数据,传给显卡
        else
            记录a0点(为a1)、b0点坐标(为b1),组织数据并保存,传给显卡
    }
    显卡:画
}

一般来说,引擎不会这么傻地判断所有条件,他一般会有多个接口给上层调用,如果调用了,那么就会重新组织数据。

有什么问题么?如何优化?

这里的组织数据,就是可以优化的地方,如果组织成千上万个三角形的话,就会很麻烦,很耗时,那么在Unity UI这里就会出现一个叫“动静分离”的优化方法。

如果有一千个三角形,其中九百九十九个都是不会动的(位置不会改变),那么,你一旦组织数据,那么一千个三角形一起组织,实在得不偿失。于是,在UI的组织上,最好是吧那些经常改变的三角形和不动三角形分开处理。引擎是不知道你上层是如何组织你的显示给玩家的,所以他无法区分什么是动的,什么静态的。这里的“组织数据”就是所谓的“动态合批”(Dynamic Batches),动态组合批处理。

Unity UI 的渲染单位,也就是批处理单位是 Canvas,你只要把你的UI里面的静止的界面放到一个Canvas里面,另外动态的界面放到一个界面里面就可以最大话的优化“动态合批”的过程。一般来说,动的界面包括位置(rectTransform)、材质(materials)、颜色(color)等等。

(这里大家可以脑部一下截图,我就不截图了)

这就优化完了?

事情远没有结束。因为,大部分项目的大多数性能问题都不是能够一开始定好一个方案,之后就能高枕无忧的,问题往往是一直会出现,一直需要人去修改的。于是这里牵涉出两个问题:一个是如何监控的问题,一个是如何查找的问题。

什么时候我们的项目中的UI效率变得低下了?是哪个地方出的问题了?如果我们能够及时的发现问题,修复起来就会得心应手的多。我在一些开发者分享的大会上听过一些大的公司使用机器的做法叫“持续优化”(Continous Optimizing)使用自动化的方法去把游戏的FPS啊,drawcall啊之类的一些东西每天跑下来,生成报告发出来,如果有问题,就会报警,然后才会有工程师去修复。

我们不谈“监控问题”,以后有时间我在聊聊。我们现在专注查找问题——如何发现UI里面的效率问题。其实也就是我开头提到的那篇文章所集中讨论的问题:我的项目接近完成,UI效率实在太差,怎么找出问题?怎么优化?

三步确定问题所在

我就直接翻译了:

1. Keep the Unity UI Profiler recording
Filter the metrics so you can focus on what is important: Rendering, Scripts and UI.
Keep an eye on the baseline to have a visual cue of your current baseline cost, which should include the expensive Canvas Rebuilds.

1、保持 Unity UI Profiler 记录着

过滤出一些测量的数据,只保持 Rendering,Scripts,UI 三个数据

盯着性能基数,这里面应该有Canvas 的组合数据高消耗(在 Timeline 的window里面,就是那个UGUI.Rendering.UpdateBatches)

2. Deactivate UI Game Objects and compare
Select a group of game objects and deactivate it.
Compare the performance baseline.
If the baseline didn't improve much, continue deactivating game objects till you see a significant improvement.

2、关闭(Disable、Deactivate) UI GameObject 比较他们

选择一组UI gameObject 然后逐一禁用他们

比较Profiler里面的情况,如果没有太大改善,就继续禁用下去,直到你看到大的提示为止。

3. Find out who is modifying its properties
Now you managed to isolate which object is triggering your Canvas Rebuilds. But, who's actually causing those?
Is it a script scaling it? Or maybe an animation changing its position?
It helps to do a right-click on the RectTransform and press "Find References in Scene"
Once you know who's causing the UI canvas rebuilds, do something about it, such as disabling animations or transforms.

3、找出谁在修改属性

现在你可以确定是哪一个 gameObject 触发了Canvas的重新批处理了,但是是谁真正引起的呢?

是脚本么?还是修改位置的动画组件?

你可以邮件点击这个GameObject 的RectTransform,然后选择 “Find Reference in Scene”

一旦你知道了是哪个引起的Canvas 重建,那就做些什么把~~~

步骤说的那么细了,应该懂了吧?你想要视频步骤?你敢比我再懒一点么?

----

知乎专栏——游戏开发知识搬运工 https://zhuanlan.zhihu.com/c_1168158504975216640

十多年游戏开发人员,带你快速而有深度解析最新的游戏开发技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值