当前位置: 首页 > 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;中的一个非常有用的容器。它是一个…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...