真Unity3d_Profiler如何调试DeepProfiling和3个实战案例

Unity Profiler 入门

从《游戏编程精粹之一》这本书我们知道,实时的的游戏内建剖析,很重要

而 Unity Profiler也就是这么一个东西,可以实时监控【游戏“运行”】(代码执行)情况

虽然很久没更新了,Profiler一直是unity3.x时候的样子啊

虽然连真机几乎连不了

虽然很不“事实”,很多监控数值毫无作用

虽然新出的memory,新的统计图,不知所云

虽然官方文档很少,写文章的博主几乎没有

 

而另外2个重点,更让Profiler成为鸡肋

1)

开发环境始终不是真机环境,没有程序员想犯错,可事实就是没有程序员能不犯错

测试工具本身也是程序,并不是说程序错或不好用,但极其容易出现平时开发中的问题:你会真的以为你的以为就是你的以为

** 关键还是在于程序员本身的能力,和工具没啥关系

2)

其实很多公司都在做一些实践,也是有益的,但是很多为了做而做的“优化”工作就未必那么有效,或使程序员能力不能发挥

而最终你会发现你需要这种程序员,阅读代码能力的

** 很多公司,团队或者工作室,就是连基础的“研”发能力都没有啊,就是靠经验,怎么了?

 

下面这里只是说说一些代码案例,需要程序员对阅读代码有一些“理解”

之前我分享了不少可视化工具,但这不是

这下面的案例需要有一些代码级别的“阅读理解”

 

Profiler 的 DeepProfiling的作用

不开deepprofiling的情况

上图是不开Deep的截图,是不是感觉无法阅读?

根本都不知道 PhysX.CcScene.ccdBroadPhase什么意思,一大堆英文都没见过的,和自己开发出入很大

但是等等.......

PhysX  看上难道不是c#的包名

ScScene 不像类名吗?还是很臭名昭著的驼峰式命名哦

ccdBroadPhaseAABB

clothPreprocessing

colliderStep 这几个方法名没觉得命名的很好的吗??

如下这么写,会不会比较容易“阅读”??

using UnityEngine;
using System.Collections;
namespace PhysX
{
    public class ScScene
    {
        void ccdBroadPhaseAABB() { }
        void clothPreprocessing() { }
        void colliderStep() { }
    }
}

当然Unity内部并不用C#实现,但Unity确实,明显地告诉你这些内部方法的"效能“

使用DeepProfiling的情况

如上图,明显的,开了DeepProfiling,会显示(监测)一些我们自己写的方法名,如上图

当然也有一些方法看上去也还是云里雾里,但至少说明了LuaTable,Dictionary 这些“高效”的我们熟悉的“效能”大户出现了

这个截图也是随便的,但Unity确实如他官方上说的,开了DeepProfiling就会把每个方法(日常开发,非官方)Record下来

而目测也几乎每个方法都有记录,而且coroutineonTriggerEnter 官方效能大户也是会单独在Profiler显示

可以说开Deep帮助很大了

用Profiler分析一些代码案例

下面只写3个案例,代码逻辑,代码流程,代码框架就没法具体展开讲了,请自行脑补

案例一:子弹射出,受击怪物受到伤害,碰撞体响应

  public void OnTriggerEnter(Collider other)
    {
        if (owner == null)
            return;

        var otherUnit = other.GetComponent<NTGBattleUnitController>();
        if (otherUnit != null && otherUnit.alive && otherUnit.group != owner.group && (mask & otherUnit.mask) != 0)
        {
            otherUnit.Hit(shooter, this);
            //Debugger.LogError("减速");

            //otherUnit.AddPassive(pBehaviour., owner, p: new[] { this.param[1] });
            otherUnit.AddPassive(pBehaviour.passiveName, owner, skillController);

            FXHit(otherUnit);
        }
    }

流程图如上:这么做有什么Profiler的“效能”问题呢??

Animator.SetTrigger(keyName) 名字不对,则有一个Warning,

上图没能清楚的表达清楚,虽只是一个流程,但是所有碰撞都会通过OnTrigger触发,即使能保证只是受击怪物,那可能也是十几个怪物,会触发十几遍这个流程,是十几遍

(如果你以为WARNING不算什么,那么真心建议放弃你以为的以为就是真相,的这种想法)

(又一个程序员比犯错误之一,你以为不是多线程,但却承受多线程的坏处)

你会收到一堆莫名的错误,而这又恰恰非常占“效能”

 

所以,日志要注意“没红色ERROR"是不足够了,Warning也要注意。。。。

案例二:3D绘制时的卡顿

添加了一些“优化”代码,所以原来顺滑的绘制,变得卡顿,下图能正确的定位到Raycast 物理碰撞事件(画笔碰画纸嘛),但或者用了“协程”或者用了“事件”又或者用了Action回调,所以暂时没法知道具体的代码端

是不是就没法细分定位呢,当然我们也只能寄希望于

 Profiler.BeginSample("");

扩展阅读

性能优化之在真机上开启DeepProfile与踩坑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值