Unity3D中使用Profiler精确定位性能热点的优化技巧
本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/BeginProfiler.html
简介
在使用Profiler定位代码的性能热点时,很多同学往往忽略Profiler的提供接口,当发现某个Update函数特别耗时时,没有有效的手段进一步定位热点出自该Update函数的哪一个模块或哪一段代码。
使用Profiler评估客户端性能时,推荐使用Profiler提供的性能采样接口,来更精确地分析定位客户端存在的性能问题。
using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class TestProfiler : MonoBehaviour {
int t = ; // 每帧Update都会进行校验和运行
void Update () {
Check(t); // 校验
Run(); // 运行
} void Check(int n) {
ProfilerSample.BeginSample("Check");
CheckA(); // 校验模块A ProfilerSample.BeginSample("Calculate b");
// 数值运算
int b = n - ;
if (b < )
b = ;
ProfilerSample.EndSample(); CheckB(b); // 校验模块B
ProfilerSample.EndSample();
} void CheckA() {
ProfilerSample.BeginSample("CheckA");
Debug.Log("校验模块A");
ProfilerSample.EndSample();
} void CheckB(int loopCount) {
ProfilerSample.BeginSample("CheckB(loopCount={0})", loopCount);
Debug.Log("校验模块B"); ProfilerSample.BeginSample("new List<string>");
List<string> strList = new List<string>();
ProfilerSample.EndSample(); for (int i = ; i < loopCount; ++i) {
ProfilerSample.BeginSample("Add str to list");
string str = string.Format("CheckB:{0}", i);
strList.Add(str);
ProfilerSample.EndSample();
} Debug.Log(string.Format("list count: {0}", strList.Count));
ProfilerSample.EndSample();
} void Run() {
ProfilerSample.BeginSample("Run");
Debug.Log("开始运行");
DoSomething();
ProfilerSample.EndSample();
} void DoSomething() {
} void OnGUI() {
GUILayout.BeginVertical();
if (GUILayout.Button("Enable/Disable ProfierSample.")) {
ProfilerSample.EnableProfilerSample = !ProfilerSample.EnableProfilerSample;
} if (GUILayout.Button("Enable/Disable Profier sting format.")) {
ProfilerSample.EnableFormatStringOutput = !ProfilerSample.EnableFormatStringOutput;
}
}
}
关闭和开启Profiler性能采样接口的对比截图:


using UnityEngine;
using System; public class ProfilerSample { // by SunboyL
public static bool EnableProfilerSample = true;
public static bool EnableFormatStringOutput = true;// 是否允许BeginSample的代码段名字使用格式化字符串(格式化字符串本身会带来内存开销) public static void BeginSample(string name) {
#if ENABLE_PROFILER
if (EnableProfilerSample){
Profiler.BeginSample(name);
}
#endif
} public static void BeginSample(string formatName, params object[] args) {
#if ENABLE_PROFILER
if (EnableProfilerSample) {
// 必要时很有用,但string.Format本身会产生GC Alloc,需要慎用
if (EnableFormatStringOutput)
Profiler.BeginSample(string.Format(formatName, args));
else
Profiler.BeginSample(formatName);
}
#endif
} public static void EndSample() {
#if ENABLE_PROFILER
if (EnableProfilerSample) {
Profiler.EndSample();
}
#endif
}
}
Unity3D中使用Profiler精确定位性能热点的优化技巧的更多相关文章
- ASP.NET 性能监控工具和优化技巧
转载自:http://blog.haoitsoft.com/index.php/archives/657 ASP.NET 性能监控工具和优化技巧 发表回复 为了阐明准确甄别性能问题的重要性,下面列举了 ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- 使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码 (jvm性能调优)
技术交流群:233513714 本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 ...
- ifeve.com 南方《JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码》
https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,发现很多线程处于这个状态: at jrockit/vm/Al ...
- 15 个有用的 MySQL/MariaDB 性能调整和优化技巧(转载的一篇好文)
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- 【MySQL】15个有用的MySQL/MariaDB性能调整和优化技巧
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- 15 个有用的 MySQL/MariaDB 性能调整和优化技巧
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- NDK(20)JNI的5大性能缺陷及优化技巧
转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html JNI 编程缺陷可以分为两类: 性能:代码能执行所设计的功能,但运行缓慢 ...
- 提高Web性能的前端优化技巧总结
随机推荐
- iOS开发--关闭ARC
对整个项目关闭ARC project -> Build settings -> Apple LLVM complier 3.0 - Language -> objective-C A ...
- Android开发-- Genymotion模拟器
模拟器安装 http://blog.csdn.net/beiminglei/article/details/13776013 连接ADB http://android3g.diandian.com/p ...
- [NodeJS] Node.js 编码转换
Node.js 自带的 toString() 方法不支持 gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite 和 encoding. iconv, iconv-l ...
- [转]logging使用
来源:https://www.cnblogs.com/nancyzhu/p/8551506.html日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事 ...
- 【Java并发编程一】线程安全和共享对象
一.什么是线程安全 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的 ...
- 《转》win7 安装ujson 出现的“error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27”
本文转载自http://blog.csdn.net/Tilyp/article/details/72842800?locationNum=2&fps=1 我的python环境是 D:\work ...
- linux中根目录下各个目录的作用
/bin 二进制可执行命令.该目录下存放着普通用户的命令 /dev 系统的设备文件,即设备的驱动程序 /home 用户主目录的基点 /lost-found 这个目录平时是空的,当系统非正常关机而留下的 ...
- CSS3 渐变效果
CSS3 渐变效果 background-image: -moz-linear-gradient(top, #8fa1ff, #3757fa); /* Firefox */ background-im ...
- Sencha Touch 实战开发培训 电子书 基础篇
本期课程基于Sencha Touch 2.4.1,属于新手实战入门课程,侧重于实用性. 课程目录: 开源Demo:https://bitbucket.org/moLangZaiShi/demo 本课程 ...
- jenkins部署war包到远程服务器的tomcat
一.目的 jenkins上将war包,部署到远程服务器的tomcat上. 这边tomcat在windows 主机A上,版本apache-tomcat-8.5.23. jenkins在主机B上,cent ...