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下来
而目测也几乎每个方法都有记录,而且coroutine等 onTriggerEnter 官方效能大户也是会单独在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("");