Unity 如何查看编译的耗时?

Unity 如何查看编译的耗时?

关键词:
编译、脚本、编辑器、静态类、程序集、函数、命名空间、构造函数、回调方法、注册时间、注册方法

文字记录:

hello,大家好,今天和大家分享一下Unity项目如何查看编译的时间,或者说是编译的耗时。这里我提前准备了一个空的项目工程,因为接下来我们要写的脚本,它仅在编程器的环境中被使用,所以我提前创建好了一个 Editor 文件夹。
我们在文件夹里面新建一个 C# 脚本,就取名为 CompileTimer。等待编译一下,双击打开这个脚本。这个类它是不需要 start 和 update 两个方法的,它也不需要继承值目录 behavior。
我们首先将 Unity Editor 命名空间给引入进来,然后我们将这个类修改为静态类,写一个静态的构造函数。

在构造函数里面,我们需要先注册两个事件,一个为编译开始的事件,另一个即为编译结束的事件。
注册时间相关的代码我们暂时先不写,我们先为这个静态类加上一个标签,也就是属性,我们加上 InitializeOnLoad 这个属性之后,这也就表示当 Unity 编辑器运行时,该类的静态构造函数会自动被调用。
接下来我们再引入 UnityEditor.Compilation 这个命名空间,它提供了访问和操作 Unity 编辑器中脚本编译流程的功能和事件。

回到静态构成函数里面,当编译开始的时候,我们注册一下 compilationStarted 方法,这里我们可以看到这个方法,它需要一个 object 类型的参数,这里我就不使用快捷键来创建这个方法了。
回到静态构的函数下面,我们手动把这个方法给补上,就将其命名为 OnCompilationStarted。不要忘记它的参数,上面我们已经提到了它的类型为 object。

到这里,编译开始时注册方法相关的代码,我们就写完复制一下这行代码。紧接着我们来注册一下编译结束时的方法。我们将方法命名为 OnCompilationFinished,它的参数和上面的方法是一致的。

在编译开始的回调方法里面,我们需要先记录一下编译开始的时间,所以我们先在上面声明一个时间戳,它的类型为double,将其命名为 start time。
回到方法里面,我们使用编辑器启动到当前时刻所经过的时间来对这个编译开始的时间进行赋值,它的单位为秒。
在编译结束的回调方法里面,我们首先计算一下编译结束的时间,将其命名为 end time。然后我们再计算下时差,也就是编译说花费的时间。

最后我们再把计算出来的时间输出到控制台上面,也就是打印条log。

在这里将 duration 只保留两位小数。

okay,至此脚本我们算是写完了。接下来我们把多余的命名空间给删了,回到Unity里面去测试一下。

using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;

namespace Editor
{
    [InitializeOnLoad]
    public static class CompileTimer
    {
        private static double _startTime;
        
        static CompileTimer()
        {
            CompilationPipeline.compilationStarted += OnCompilationStarted;
            CompilationPipeline.compilationFinished += OnCompilationFinished;
        }

        private static void OnCompilationStarted(object obj)
        {
            _startTime = EditorApplication.timeSinceStartup;
        }

        private static void OnCompilationFinished(object obj)
        {
            double endTime = EditorApplication.timeSinceStartup;
            double duration = endTime - _startTime;
            Debug.Log($"编译耗时:{duration:F2} 秒");
        }
    }
}

我们随便新建个脚本,那就写个 test 吧,非常的nice。在这里我们已经可以看到本次编译所耗费的时间了。到这里有的小可爱肯定有疑问了,我们查看这个项目的编译时间具体有什么用,那它的用途或者说好处可就多了去了。
我给大家举几个简单的例子。首先就是在性能方面,随着我们的项目开发周期变长,也就是说随着项目的增长,编译的时间可能会逐渐的增加。
我们有了这个工具之后,我们可以实时了解项目编译时间的变化,如果突然发现编译的时间显著的增加了,这可能是一个不好的迹象,那表明我们在项目中加入了一些影响性能的东西。

另外一点可能说的比较现实,过长的编译时间会影响开发者的心情,也会影响我们的效率。尤其在大型团队中,不同的团队成员可能会影响整体的编译时间。
有了具体的编译时间的数据,我们可以更有针对性的讨论哪些项目的变动导致了编译时间的变化,从而采取相应的优化策略。

最后我们再和前面几集视频做一个简单的互动。在前面的视频里面,我们聊到了 Unity 的程序集。我们今天写的这个工具类,它对于我们合并程序集来说特别的有帮助。
这个类其实还有一些不完美的地方,比如我们可以使用更加详细的日志输出,例如当别人的时间超过 5 秒钟之后,我们可以打印一条警告的日志。
再比如,我们还可以为编译时间添加上平均值和最大值。实际上要不要加上这些功能取决于项目的具体需求与项目的规模。我们目前这个脚本已经完成了它最主要的功能。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/124971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习_day08_finalnativeabstract接口

文章目录 final关键字注意 native关键字abstract关键字抽象类定义继承 接口定义实现 final关键字 final关键字表示常量,其值在程序运行期间不会改变。 final用来修饰变量,可以是静态变量,也可以是成员变量,也可以是局部变量&…

5G-DFS最新动态-产品不在需要走FCC官方测试

添加图片注释,不超过 140 字(可选) 最近,FCC公布了最新版本的PAG(Product Acceptance Group)清单,即388624 D02 Pre-Approval Guidance List v18r04。这个清单的主要改变是将带有雷达侦测功能的…

51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

51单片机的篮球计分器液晶LCD1602显示 📑1.主要功能:📑讲解视频:📑2.仿真📑3. 程序代码📑4. 原理图📑5. PCB图📑6. 设计报告📑7. 设计资料内容清单&&…

jenkins2

构建docker镜像 jenkins插件管理安装:docker-build jenkins安装了docker 配置docke builder 添加 unix:///var/run/docker.sock rootubuntu20:~# usermod -G docker jenkins 测试失败 修改docker中service文件添加 -H tcp://0.0.0.0:2376 jenkins中系统管理…

了解高防服务器的工作原理

在当今互联网时代,网络安全问题日益突出,各种网络攻击层出不穷。为了保护企业的网络安全,高防服务器应运而生。那么,你是否了解高防服务器的工作原理呢?下面就让我们一起来探索一下。 高防服务器是一种能够有效抵御各种网络攻击的…

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker:您要如何确保应用能够在不同环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?而这个就是使用容器。Docker解决了运行环境和配置问题…

【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示 鼠标观察/键盘控制移动飞行/行走/碰撞检测 Unity版本:2019.4.23f1c1 注意脚本名称和组件添加,不在文章中一一强调场景模型都是在资源商店选择的免费下载(选…

vue-router路由守卫进阶

vue-router路由守卫进阶 路由守卫,可以想象为古代御前侍卫,路由守卫,则是对路由进行权限控制 分类:全局守卫、独享守卫、组件内守卫 全局前置-路由守卫 作用:主要用来鉴权 用户点击导航区,随后引起路径的…

Flink ON Yarn 模式 --- per job mode 与application mode的区别

1、per job mode: 对于yarn-per-job模式调度的过程: 1、资源调度: 1、因为是yarn模式,所以客户端会向ResourceManager申请资源,申请容器负责来启动ApplicationManager 2、此时ResourceManager接受到客户端的请求&#…

文件上传 [GXYCTF2019]BabyUpload1

打开题目 传个是jpg文件后缀的一句话木马上去 代码如下 <script languagephp>eval($_POST[v]);</script> 发现上传成功 因此我们需要先上传 .htaccess 文件&#xff0c;然后再上传 2.jpg文件 .htaccess作用&#xff1a;文件将别的后缀名文件内容解析为php程序…

CSS特效001:鼠标放div上,实现旋转、放大、移动等效果

GPT能够很好的应用到我们的代码开发中&#xff0c;能够提高开发速度。你可以利用其代码&#xff0c;做出一定的更改&#xff0c;然后实现效能。 css实战中&#xff0c;经常会看到这样的场景&#xff0c;鼠标放到一个图片或者一个div块状时候&#xff0c;会出现旋转、放大、移动…

Linux 本地Yearning SQL审核平台远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

如何设值固定ip地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 如何设值固定ip地址 一、找到网络和Internet选项二、选择更改适配器选项2.双击&#xff0c;选择属性3.选择ipv4&#xff0c;点击属性4.选择使用下面的IP地 总结 一、找到网络…

阿里云99元服务器40G ESSD Entry云盘、2核2G3M带宽配置

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

05-MySQL-进阶-存储引擎索引SQL优化

一、存储引擎 涉及资料 链接&#xff1a;https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码&#xff1a;Coke ①&#xff1a;MySQL体系结构 1.连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 T…

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换&#xff0c;进程地址空间等等的概念进行了说明&#xff0c;本篇博客会基于这些知识点来 实现一个简单的 shell &#xff0c;如有疑问&#xff0c;可以参考下述博客&#xff1a;Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计&#xff0c;我想在读者阅读本文之前应该已经有所了解&#xff0c;所以本文的重点是代码的分享和分析。至于具体的原理&#xff0c;我觉得读者不必阅读长篇大论的文章&#xff0c;只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

【STM32】STM32的Cube和HAL生态

1.单片机软件开发的时代变化 1.单片机的演进过程 (1)第1代&#xff1a;4004、8008、Zilog那个年代&#xff08;大约1980年代之前&#xff09; (2)第2代&#xff1a;51、PIC8/16、AVR那个年代&#xff08;大约2005年前&#xff09; (3)第3代&#xff1a;51、PIC32、Cortex-M0、…

QT事件循环和事件队列的理解

Qt的事件循环机制_qt事件循环流程-CSDN博客 QT-事件循环机制_qt线程事件循环-CSDN博客 一、事件处理流程如图所示&#xff1a; 1.QCoreApplication::postEvent(QObject *receiver,QEvent *event)&#xff1a; QCoreApplication::postEvent()函数用于将事件异步地发送到目标对…