Unity3D美术特效分析工具

2024-03-23 09:38

本文主要是介绍Unity3D美术特效分析工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在游戏性能优化阶段,对美术性能的优化是必不可少的。

为了给美术一个比较直观的分析结果,故此编写了一个分析工具脚本,只需要将需要分析的特效拖入其中即可。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;/// <summary>
/// 循环创建获得特效的数据
/// 设计:每个特效跑10遍,取中间值
/// </summary>
public class ArParticlesTool : MonoBehaviour
{/// <summary>/// 特效参数/// </summary>class Particles{public float loadTime;//加载时间public float creatTime;//创建时间public int maxBatches;//最大渲染批次public int averageBatches;//平均渲染批次public float maxBatchesTime;//最大渲染批次时间public int maxTris;//最大顶点数public int averageTris;//平均顶点数public int maxVerts;//最大面数public int averageVerts;//平均面数}public List<GameObject> objPool;// Start is called before the first frame updatevoid Start(){StartCoroutine(CreatParticles());}   List<Particles> parList = new List<Particles>();int creatID = 0;//创建特效的IDstring str = "";List<int> startStats = new List<int>();bool isDebug = false;float startTime = 0;float maxTime = 0;int maxB = 0;int maxT = 0;int maxV = 0;List<int> batches = new List<int>();List<int> tris = new List<int>();List<int> verts = new List<int>();/// <summary>/// 创建特效/// </summary>/// <returns></returns>IEnumerator CreatParticles(){yield return new WaitForSeconds(5f);if (startStats.Count == 0){//初始化str += "特效名,(Win)初次加载时间(微秒),(Win)创建时间(微秒),最大渲染批次,平均渲染批次,最大渲染批次时间,最大顶点数,平均顶点数,最大面数,平均面数\n";startStats.Add(UnityStats.triangles);startStats.Add(UnityStats.vertices);startStats.Add(UnityStats.batches);}if (creatID < objPool.Count){isDebug = true;startTime = Time.time; maxTime = 0; maxB = 0; maxT = 0; maxV = 0;batches.Clear();tris.Clear();verts.Clear();var _startT = TimeStampLongTicks();//创建下一个预制体var _obj = Instantiate(objPool[creatID]);var _f = GetTimestamp(TimeStampLongTicks() - _startT);Particles _p = new Particles();if (parList.Count == 0) _p.loadTime = _f;else _p.creatTime = _f;StartCoroutine(EndCreat(_obj, _p));StartCoroutine(CreatParticles());}else{SaveStats();}}// Update is called once per framevoid FixedUpdate(){if (isDebug){var _dis = UnityStats.batches - startStats[2];if (_dis > 0){batches.Add(_dis);var _t = UnityStats.triangles - startStats[0];tris.Add(_t);var _v = UnityStats.vertices - startStats[1];verts.Add(_v);if (_dis > maxB){maxB = _dis;maxTime = Time.time - startTime;}if (_t > maxT) maxT = _t;if (_v > maxV) maxV = _v;}           }}/// <summary>/// 结束创建/// </summary>/// <returns></returns>IEnumerator EndCreat(GameObject _obj,Particles _p){       yield return new WaitForSeconds(3f);isDebug = false;DestroyImmediate(_obj);_p.maxTris = maxT; _p.maxVerts = maxV;_p.averageBatches = GetAverage(batches);_p.averageTris = GetAverage(tris);_p.averageVerts = GetAverage(verts);_p.maxBatches = maxB;_p.maxBatchesTime = maxTime;parList.Add(_p);Debug.Log("结束记录" + maxB + "  " + maxTime + "  " + maxT + "  " + maxV);var _max = 10;if (parList.Count >= _max){var _l = 0f; var _c = 0f;var _mB = 0; var _aB = 0; var _mBf = 0f;var _mT = 0; var _aT = 0;var _mV = 0; var _aV = 0;var _a = 0;//总结foreach (var idx in parList){if (idx.loadTime > 0) _l = idx.loadTime;_c += idx.creatTime;if (idx.maxBatches > 0){_a++;_mB += idx.maxBatches;_aB += idx.averageBatches;_mBf += idx.maxBatchesTime;_mT += idx.maxTris;_aT += idx.averageTris;_mV += idx.maxVerts;_aV += idx.averageVerts;}               }_a = Mathf.Clamp(_a, 1, _max);str += objPool[creatID].name + ","+ _l + "," + (int)(_c / (parList.Count - 1) * 100) / 100 + ","+ _mB / _a + "," + _aB / _a + "," + _mBf / _a + "," ++_mT / _a + "," + _aT / _a + "," ++_mV / _a + "," + _aV / _a + "," +"\n";parList.Clear();creatID++;Debug.LogError(str);}}int GetAverage(List<int> _list){var _t = 0;foreach (var _i in _list) _t += _i;var _f = Mathf.Clamp(_list.Count, 1, 10000);return _t / _f;}void SaveStats(){AssetDatabase.Refresh();Directory.CreateDirectory("Assets/TablesOther");using (StreamWriter writer = File.CreateText("Assets/TablesOther/表格.csv"))writer.Write(str);AssetDatabase.Refresh();Debug.Log(gameObject.name + "转表完毕");}/// <summary>/// 转换时间戳 /// </summary>/// <returns></returns>public long TimeStampLongTicks(){DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));return (DateTime.Now.Ticks - startTime.Ticks);}/// <summary>/// 获得纳秒/// </summary>/// <returns></returns>public int GetTimestamp(long _t){        return (int)_t/10;}}

为了比较准确的结果,建议在跑分的过程中,不要开关其他软件,以保证比较稳定的运行环境。

打印结果如下图所示:

 

这篇关于Unity3D美术特效分析工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837900

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断