当前位置: 首页 > news >正文

【unity小技巧】unity性能优化以及如何进行性能测试

文章目录

  • 前言
  • GPU性能优化
    • 打包素材
  • CPU性能优化
    • 代码执行优化
  • 性能测试
    • Vector2.Distance 和 sqrMagnitude哪个好?
    • 动画切换优化
    • shader属性优化
  • URP渲染器资产优化
  • 对象池优化
  • 删除没必要的空函数
  • 图片、音乐音效、贴图等素材压缩
  • ScriptableObject优化参数
  • 参考
  • 完结

前言

功能的实现必不可缺,当然也要注意程序性能的优化。随着项目越来越大,优化变得至关重要,它能确保你的游戏任然可以快速流畅地运行。如果想知道如何对unity进行性能优化以及如何进行性能测试,那就继续往下看吧。

GPU性能优化

打包素材

点击运行游戏,打开分析帧调试器
在这里插入图片描述
然后点击启用工具,逐步查看Unity如何将图像渲染到屏幕上,我们可以看到有五个绘制调用,分别是背景、地板、敌人、玩家和玩家的武器
在这里插入图片描述
如果我们可以使用更少的绘制调用来实现相同的结果,它肯定会更快,我们可以使用Sprite Atlas来做到这一点在这里插入图片描述
把所有的资源都拖入,进行打包(注意这里属性和图片差不多,如果你是像素素材同样可以选择点类型,无压缩进行优化)
在这里插入图片描述
打包效果
在这里插入图片描述
我们再回去分析帧调试器查看,你会看到我们只有三个绘制调用
在这里插入图片描述
既然前面打包了,那么为什么不是一个呢,你可以看到它没有将敌人与玩家进行批处理,因为它们具有不同的材质
在这里插入图片描述
如果我们没必要使用不同的材质,我们可以选择把所有的材质换成一样的
在这里插入图片描述
这样的话,可以看到就仅仅绘制了一次,这明显加快了GPU绘制
在这里插入图片描述

CPU性能优化

代码执行优化

我们经常会有书写这样的代码,比如新增EnemyBehavior.cs脚本挂载在敌人身上,这里在Update中每一帧都调用敌人面向玩家等操作,但是这完全是资源的浪费,在播放模式下没有必要在每帧上都这样做
在这里插入图片描述
运行状态下,打开Profiler 分析器
在这里插入图片描述
只需单击图表上的任意位置,我们的游戏就会暂停,以便我们可以对其进行分析,可以看到目前EnemyBehavior的更新占用了1.2%CPU使用率
在这里插入图片描述
这时候我们可以选择使用脚本委托和定时器控制它的更新频率,比如新增Ticker脚本,没过0.2秒调用TickEvent方法
在这里插入图片描述
逻辑不在Update中调用了,注册委托每0.2s调用一次
在这里插入图片描述
在这里插入图片描述
可以看到敌人是仍然总是面向玩家,但不是每帧都运行该逻辑,运行频率被降低了,但它并没有对游戏中敌人的行为产生明显的影响
在这里插入图片描述

性能测试

但是当涉及到某些代码片段时,仅用这些王具很难判断出什么实际上性能更高,有时您只需要自己测试一些东西,所以让我向您展示如何设置基准测试,来让您运行自己的测试

新增性能测试的类

using UnityEngine;
using System.Diagnostics;// 用于性能测试的类
public class BenchMarker : MonoBehaviour
{[Range(0, 1000000)][SerializeField] private float _iterations; // 迭代次数private BenchMarkTest _benchMarkTest; // 性能测试对象private Stopwatch sw; // 计时器// 在启动时获取BenchmarkTest组件private void Awake(){_benchMarkTest = GetComponent<BenchMarkTest>(); // 获取BenchmarkTest组件}// 执行测试的方法public void RunTest(){sw = Stopwatch.StartNew(); // 创建并启动计时器for (int i = 0; i < _iterations; i++){_benchMarkTest.PerformBenchmarkTest(); // 执行性能测试}sw.Stop(); // 停止计时器UnityEngine.Debug.Log(sw.ElapsedMilliseconds + "ms"); // 输出测试时间}
}

Vector2.Distance 和 sqrMagnitude哪个好?

在Unity中,Vector2.Distance 和 sqrMagnitude 都是用来计算向量之间距离的方法,但它们的性能特性略有不同。

新增脚本,这里距离判断我们使用了Vector2.Distance,实际它的性能很差,因为它在内部计算中使用了开方运算 Mathf.Sqrt,开方运算通常比较昂贵,尤其是在大量计算时会消耗较多的计算资源。
在这里插入图片描述
点击测试
在这里插入图片描述
可以看到它平均需要执行390毫秒左右
在这里插入图片描述
我们现在换成性能更高的办法.sqrMagnitude进行距离判断,sqrMagnitude 属性返回向量的平方长度,与Vector2.Distance 方法不同,sqrMagnitude 不进行开方操作,因此它的计算代价更低。
在这里插入图片描述
重新测试发现,平均快了几毫秒左右
在这里插入图片描述
事实证明,我们可以继续使用Vector2.Distance 进行距离计算,因为它的可读性更高且对性能的影响似乎可以忽略不计

动画切换优化

通常我们都是这样进行动画切换
在这里插入图片描述
测试效果
在这里插入图片描述
但是其实有更好的办法,其实Unity获取这个动画字符串后会在幕后对其进行哈希处理,所以之后我们可以通过只做一次来节省时间,所以在这里我们可以提前对动画字符串进行哈希处理
在这里插入图片描述
可以看到,节约了近30毫秒的性能
在这里插入图片描述

shader属性优化

我们也想给改变shader属性来执行相同的操作,比如这里实现更改敌人的材质的颜色
在这里插入图片描述
改变颜色
在这里插入图片描述
测试结果,可以看到大概需要610ms左右
在这里插入图片描述
让我们尝试同样对字符串进行哈希处理
在这里插入图片描述
结果,发现速度加快了将近一半
在这里插入图片描述

URP渲染器资产优化

在URP渲染器资产中,如果你不需要深度纹理(Depth Texture)或不透明纹理(Opaque Texture )可以将其关闭,因为这些纹理最终会根据您的相机所看到的内容绘制纹理的深度或不透明度。如果你关闭它们,最终会优化大量不必要的内存
在这里插入图片描述

对象池优化

但如果您进行了大量实例化和销毁操作例如,如果您有一个带有大量子弹的游戏,那么您将需要实现个对象池系统,参考:【Unity小技巧】Unity探究自制对象池和官方内置对象池(ObjectPool)的使用

删除没必要的空函数

如果你的脚本中有空函数,请删除它们,每个函数也会有一点开销成本,即使它实际上没有执行任何内容
在这里插入图片描述

图片、音乐音效、贴图等素材压缩

合理压缩素材会很大的减低我们的内存

比如先看看我的背景没有压缩,它是6.8MB
在这里插入图片描述
低质量压缩它是1.1MB
在这里插入图片描述
ps:合理的使用压缩,确保它不会明显降低你的画面质量

ScriptableObject优化参数

不同的敌人实例之间更改这些变量,现在当我点击播放时,这些脚本中的每一个都将有自己的实例,并且在这些类实例中的每一个上这些变量将在内存中拥有自己的副本,并且对于这种情况完全是浪费
内存中拥有自己的副本,并且对于这种
这里我们可以使用ScriptableObject
在这里插入图片描述
配置
在这里插入图片描述
这样我们就不会为这些变量的创建数十几个副本存放在内存中,它只是位于ScriptableObject上的一个副本,每个敌人都只指向该ScriptableObject的对象

即使你想要实现不同的敌人配置,你也只需创建另一个ScriptableObject的对象资产,绑定它并修改参数即可
在这里插入图片描述

参考

https://www.youtube.com/watch?v=kJ5I9md9NG4

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

【unity小技巧】unity性能优化以及如何进行性能测试

文章目录 前言GPU性能优化打包素材 CPU性能优化代码执行优化 性能测试Vector2.Distance 和 sqrMagnitude哪个好&#xff1f;动画切换优化shader属性优化 URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结 前言 …...

算法参考改进点/知识点

1、clip文章中改进点 图像编码器image encoder&#xff1a; 将全局平均池化层替换为注意力池化机制。注意力池化机制&#xff1a;通过一个单层的“transformer式”多头QKV注意力&#xff0c;其中查询query是基于图像的全局平均池表示。改进VIT&#xff08;Vision Transformer…...

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题&#xff1a; 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题&#xff1a; 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个&#xff0c;然后再重新装依赖 1. 采用新的镜像地址 npm …...

基于STM32设计的智能鱼缸(华为云IOT)(200)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】ESP8266工作模式配置【3】自动换水原理1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位…...

Django与数据库

目录 创建项目app 路由子表 数据库 创建数据库 什么是ORM 定义数据库表 Django Admin 管理数据 过滤条件 代码直接生成HTML 使用模板 前后端分离架构 对资源的增删改查处理 列出客户 添加客户 临时取消 CSRF 校验 修改客户信息 删除客户 Django中ORM的处理 数据模…...

大数据系列之:CentOS7安装R详细步骤

大数据系列之&#xff1a;CentOS7安装R详细步骤 一、下载R二、解压R三、创建安装目录四、指定安装目录五、安装编译依赖六、编译与编译安装七、设置环境变量八、激活环境变量九、执行R命令十、执行demo测试程序 一、下载R wget https://cran.r-project.org/src/base/R-4/R-4.4…...

Linux学习第57天:Linux PWM驱动实验

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章的思维导图如下&#xff1a; 一、PWM驱动简析 1、设备树下的PWM控制节点 8 路 PWM 都属于 I.MX6ULL 的 AIPS-1 域&#xff0c;分为了两部分&#xff0c; PWM1~P…...

git 远程拉取指定文件

指定操作 git init 创建一个空的文件 git remote add orgin 远程仓库地址链接 表示添加远程库的地址 git config core.sparsecheckout true 打开sparsecheckout功能 注意:如果需要分支内所有文件&#xff0c;这个指令可以直接过忽略&#xff0c;则会拉取对应分支所有的文件…...

【css】 CSS3+JS做一个酷炫的仪表进度条3d进度条

创建一个动态进度环组件 在现代网页设计中&#xff0c;进度环是一种常见的视觉元素&#xff0c;用于展示任务的完成度或加载状态。本文将介绍如何使用Vue.js和Less创建一个动态进度环组件&#xff0c;该组件不仅具有美观的视觉效果&#xff0c;还能够根据用户输入动态改变颜色…...

uniapp小程序全局配置分享到朋友和朋友圈功能的实现

文章目录 1.创建/mixins/share.js插件2.全局配置3.编写share.js4.调用5.分享成功 1.创建/mixins/share.js插件 直接创建 2.全局配置 &#xff08;1&#xff09;找到main.js在下面引入share.js文件 &#xff08;2&#xff09;使用mixins混入vue中&#xff0c;这样就相当于在每一…...

Java优化后台分页

第一种情况&#xff1a;先查询出所有记录&#xff0c;再进行分页处理&#xff08;分页中可以异步处理&#xff09; 优化前&#xff1a; List<String> list Arrays.asList("1","2","3","4","5","6","…...

<数据集>电梯内人车识别数据集<目标检测>

数据集格式&#xff1a;VOC格式 图片数量&#xff1a;97张 标注数量(xml文件个数)&#xff1a;97 标注类别数&#xff1a;3 标注类别名称&#xff1a; [person, motorcycle, bicycle] 序号类别名称图片数框数1person891322motorcycle78793bicycle2222 使用标注工具&#…...

二百五十三、OceanBase——Linux上安装OceanBase数据库(三):OBD页面上部署OceanBase数据库

一、目的 安装OceanBase后&#xff0c;启动obd web&#xff0c;需要在OBD页面上部署OceanBase数据库 二、参考文档 http://t.csdnimg.cn/Qeedq 三、实施步骤 1 在obadmin用户下&#xff0c;启动obd服务&#xff0c;登录页面访问 [obadminhurys23 oceanbase]$ obd web 2 登…...

Redis应用笔记

Redis应用笔记 一、 前言二、 Redis八种常用数据类型2.1 Redis的五种基本数据类型2.2 Redis的三种特殊数据类型 三、发现Redis热Key方案3.1 使用 Redis 自带的 --hotkeys 参数来查找3.2 使用MONITOR 命令3.3 借助开源项目 四、解决 hotkey五、Redis 内存碎片5.1 为何会有Redis …...

html实现好看的塔罗牌、十二星座运势网站源码

文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…...

万字长文带你入门shell编程(超详细)

一、概述 Shell 是计算机操作系统中用户与操作系统内核之间的接口层&#xff0c;它提供了一种方式让用户能够通过命令行界面&#xff08;CLI&#xff09;与操作系统交互。Shell 可以被视为一个命令解释器&#xff0c;它接收用户输入的命令&#xff0c;解析这些命令&#xff0c…...

音质提升秘籍:专业音频剪辑软件汇总

现在欣赏传输音频文件比以前简单多了&#xff0c;这些音频的质量也影响了听众的体验与感受。所以使用一些靠谱的音频剪辑工具处理音频能让你的音频文件呈现更好的效果。 1.福昕音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这是一款电脑端软件。别看…...

idea配置

在我们使用idea的时候会进行配置主要就idea编译器的下载&#xff0c;maven资源管理器&#xff0c;Tomcat服务器 在IntelliJ IDEA的官网进入http://www.jetbrains.com/idea/ 如图如果你是大学生的话一般学校会有相关的激活码直接选择左边的.exe文件下载&#xff0c;直接的就是企…...

将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素

要将 WinForms 中的 Panel 替换为 WPF 的 WindowsFormsHost 元素&#xff0c;你需要执行以下步骤&#xff1a;1. 添加对 WindowsFormsIntegration 的引用&#xff1a;确保你的项目引用了 WindowsFormsIntegration 和 PresentationCore、PresentationFramework 程序集&#xff0…...

C++ ---- vector的底层原理剖析及其实现

vector 一、定义二、常用接口及模拟实现三、vector迭代器失效问题四、使用memcpy拷贝会出现的问题五、二维数组vector<vector< T >> vv 一、定义 vector 是 C 标准模板库&#xff08;Standard Template Library, STL&#xff09;中的一个非常有用的容器。它是一个…...

PP-DocLayoutV3惊艳案例:印章(seal)+ 页眉图片(header_image)+ 视觉脚注(vision_footnote)联合定位

PP-DocLayoutV3惊艳案例&#xff1a;印章&#xff08;seal&#xff09; 页眉图片&#xff08;header_image&#xff09; 视觉脚注&#xff08;vision_footnote&#xff09;联合定位 1. 引言&#xff1a;当文档布局分析遇到“硬骨头” 想象一下这个场景&#xff1a;你拿到一份…...

Nano-Banana在工业检测中的应用:产品缺陷自动识别与标注

Nano-Banana在工业检测中的应用&#xff1a;产品缺陷自动识别与标注 1. 引言 想象一下&#xff0c;在繁忙的生产线上&#xff0c;质检员需要每天检查成千上万的零件表面是否有划痕、凹陷或瑕疵。这种重复性工作不仅容易让人疲劳&#xff0c;还可能出现漏检误检的情况。传统的…...

技术判断力之AI三问

回答老板关于是否投资AI创新项目的三个问题当下AI热度居高不下&#xff0c;企业该如何抉择&#xff1f;是大举投入布局&#xff0c;还是保持观望&#xff1f;我们借以下三个问题来展开思考。一、AI当下处在什么阶段&#xff1f;属于谁的机会&#xff1f;AI技术扩散曲线&#xf…...

SiameseUIE在CSDN社区的应用:技术文章智能分析

SiameseUIE在CSDN社区的应用&#xff1a;技术文章智能分析 1. 引言 CSDN社区每天都有成千上万的技术文章发布&#xff0c;涵盖了从编程语言到人工智能的各个领域。面对如此庞大的内容量&#xff0c;如何快速准确地理解每篇文章的核心内容、自动生成标签、进行智能分类&#x…...

C++的std--ranges内存效率

C的std::ranges内存效率探析 在现代C编程中&#xff0c;std::ranges作为C20引入的重要特性&#xff0c;不仅简化了范围操作&#xff0c;还在内存效率方面展现出显著优势。对于需要高性能和低资源消耗的应用场景&#xff0c;理解std::ranges如何优化内存使用至关重要。本文将深…...

C++的std--ranges代码生成

C20引入的std::ranges库彻底改变了代码生成的范式&#xff0c;它将函数式编程与现代C特性结合&#xff0c;让开发者能以声明式语法高效生成和处理数据流。这一特性不仅提升了代码可读性&#xff0c;还通过编译期优化显著提升性能。下面从三个关键角度解析其代码生成能力。范围适…...

OpenClaw成本优化方案:GLM-4.7-Flash自建接口对比OpenAI API实测

OpenClaw成本优化方案&#xff1a;GLM-4.7-Flash自建接口对比OpenAI API实测 1. 为什么需要关注OpenClaw的Token消耗 上周我让OpenClaw帮我整理一个200页PDF的技术文档&#xff0c;第二天查看账单时发现OpenAI API调用费用高达37美元——这个数字让我意识到必须重新审视自动化…...

浅谈:区块链存在的三点隐患问题

上文我们讲了区块链这个话题&#xff0c;有读者可能会有疑问&#xff1a;如果说区块链技术如此完美&#xff0c;为什么我们现在还没有广泛地用上它呢&#xff1f;实际上&#xff0c;区块链技术还处于发展早期&#xff0c;还在讨论和推进当中&#xff0c;而区块链的技术发展也较…...

BetterGI完整指南:原神自动化助手的功能解析与使用教程

BetterGI完整指南&#xff1a;原神自动化助手的功能解析与使用教程 【免费下载链接】better-genshin-impact &#x1f368;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动派遣 | 一键强化 - UI Automation Testing Tools Fo…...

DanKoe 视频笔记:《百万美元创意者》:如何将你的兴趣货币化 [特殊字符]

在本节课中&#xff0c;我们将学习如何将个人兴趣转化为可持续的收入来源。我们将探讨传统职业路径的局限性&#xff0c;并介绍一种通过创造力和杠杆式工作来实现财务自由与生活满足感的新方法。课程的核心在于理解如何成为一个“价值创造者”&#xff0c;而不仅仅是出售时间。…...