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

相关文章

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group