使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试

  • 时间:
  • 浏览:2

版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,就说 承担相关法律责任。之后 您发现本社区带有涉嫌抄袭的内容,欢迎发送邮件至:

进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

Unity3D 引擎在 UnityEngine 名字空间下,提供了 Profiler 类(Unity 5.6 之后刚结束似乎改变了这名 名字空间),用于辅助对项目性能进行测试。以 Android 平台为例,在构建之后,不能了在 Unity 的 File/Build Settings 菜单项弹出的窗口中,勾选 Development Build 一项。后用 adb forward 的依据,将 Android 设备的 TCP 输出转发到电脑,实现和 Unity Profiler 的连接(网上很容易找到这名 过程的具体描述,如这里)。之后 Unity Profiler 默认只提供次责依据/函数,尤其是 Unity 内置依据/函数的性能采样,之后 想 Profile 所以人项目的代码段,就不能了在代码段入口和出口再加:

依据出口注入代码稍微所以麻烦。尽管 IL 级别的函数都是以兩个返回指令之后结束的,但直接在返回指令之后插入新的指令是匮乏的。之后 所以之后,返回指令是由跳转指令直接跳转过去的。而对于大家 在 C# 中获取的指令容器,跳转指令保存了其跳转目标的引用。之后 ,大家 不仅不能了在返回指令前插入大家 不能了的指令(对 Profiler.EndSample 包装依据的调用),不能了将跳转目标为该返回指令的跳转指令的目标,修改为大家 新增的指令。这里有详尽的关于 IL 指令的列表。对应 Cecil 中 OpCodes 类中的常量,大家 还不能了过滤出跳转指令,并用 Operand 属性获取或修改其跳转目标。

修改完成后,不能了对当前的模块对象 moduleDef 调用 moduleDef.Write(assemblyPath, new WriterParameters { WriteSymbols = true }) 来写回应用应用程序集文件。这名 调用中,第一个参数的含义,是把新增的符号也写入应用应用程序集(比如大家 调用的该应用应用程序集之外的依据)。

在注入完成后,继续 Android 平台的原生构建生成 apk 包,安装到去去设备,将设备连接电脑,即可在 Unity 的 Profiler 窗口中看到新增的性能采样信息。