Unity常用的优化技巧集锦

Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

包体大小优化

  1. 图片能用jpg的尽量使用jpg, 用压缩率更大的算法。
  2. Jpg, png图片在满足游戏清晰度精度的情况下可以通过调节参数,压缩文件体积。
  3. 声音文件可以通过降低码率,采样率,多声道变单声道等方式降低体积大小。改变声音压缩算法,如.wav变成ogg来减少声音文件体积。
  4. 字体文件,可以通过去掉不用的字模来减少字库的体积。
  5. 3D模型文件体积, 可以通过减少模型的面数等来进行优化,通过细节增强技术减少模型面数达到同样的效果。
  6. 没有用的资源不要打包到包体里面,使用Resources, StreammingAssets时这些资源无论如何都会被打包进去,所以在这些文件夹中一些没有用的资源要移除或删除。
  7. 减少代码的体积,把不用的一些代码不编译打包进去。
  8. 可以把包体的全部或部分资源部署到服务器上,这样可以减少包体的体积大小。

内存大小/内存性能优化

游戏开发中运行的内存过大,是经常我们遇到的问题,内存包含了运行时候的内存以及资源所占的显存。如何优化内存所占的大小,我们也可以从几个方面去考虑。

  1. 内存大小与数据量是成直接关系的,平常写代码的时候,尽量的要用好内存,少用内存。
  2. 游戏开发中资源所在的内存占比是比较大的,资源所在的内存包括了模型顶点数据,模型纹理数据,UI纹理数据,声音数据,预制体数据,ab包数据等。这些和上面的文件体积不同,比如 1920x1080的jpg与png, 不论是哪个文件加载到显存的大小都为 1920x1080 * 每个像素的字节数(4字节)。所以我们要减低运行时的内存就是要即使的将不用的资源从内存中释放掉。有些资源的内存格式显卡时支持要锁的,比如Android支持ETC, IOS支持纹理压缩格式PVRTC。
  3. 写代码的时候尽量少产生垃圾对象,避免性能问题与内存碎片。比如字符串拼接,尽量用字符串的格式化来替代字符串加法。因为你很难说清楚

string a = “hello” + b + “hello” + 4;

所以写代码的时候要考虑到这些因素,写出内存占用低性能比较好的代码。

写代码影响帧率的一些不良习惯

接下来我们来列举一些写代码会影响帧率的不良习惯,希望能帮助大家避免掉一些帧率上不去的坑。

  1. 不要在update里面每帧的时候去调用查找组件这些函数,最好在初始化的时候先查好保存起来。
  2. 不要在游戏运行中同步的去加载一个资源,导致代码卡在了在原加载的函数上,比如加载一个资源要0.5s, 如果运行时同步去加载资源就会卡0.5秒,那么在0.5秒内游戏就卡住了,帧率就降到为1~2。
  3. 不要在游戏运行中做IO操作,比如游戏运行中同步的读写文件,这样就会导致main thread 去等IOS,导致帧率下降。
  4. 不要把耗时的纯算法的操作放main thread中,比如要计算某个NPC的一个结果,这个计算可能需要花1秒钟,但是1秒内其它的NPC或角色都可以正常的处理,我们不要在主线程上来计算这个算法,而是通过线程的方式,在其它线程计算不卡主线程影响其它的逻辑。等其它线程计算好后通知主线程。这样游戏帧率不会下降,同时又不会影响游戏,比如寻路算法等都可以用这种方式来做。
  5. 误以为协程不会帧率,很多开发者在写代码的时候把一些操作放协程,认为不会降低帧率,其实协程也在主线程执行,会影响帧率。

渲染相关的优化技巧

如何提升游戏物体的渲染性能也是很多开发者摸不清楚的,在这里给大家总结一下常用的思路和技巧,给大家在做渲染优化的时候做一个参考指南。

  1. 通过3D细节增强的技术(法线贴图,高度贴图等),来降低模型精度,让低模+细节增强来实现高模的效果。
  2. 尽量让美术以少的模型面数来制作效果好的模型。
  3. 做好场景的物体管理(四叉树场景管理),把那些不用绘制的物体隐藏起来,节约绘制的成本。
  4. 基于反画家算法从后向前渲染,尽量减少透明物体,尽量把背景的大物体分成多个小物体,做遮挡剔除的时候会更好。
  5. 可以考虑使用静态光照来做场景烘培, 代替实时光照。
  6. 可以考虑使用贴图来做物体的阴影,代替实时阴影。
  7. 如果要用实时光照,尽可能的用一种光源。
  8. 如果要用实时光照,又不会只有一种光源,尽可能的使用延时渲染或其它自定义的渲染管线(轻量级渲染)来代替向前渲染。因为向前渲染每个光源都要绘制一次,性能影响很大。
  9. 场景多光源的情况下,根据场景物体的位置,管理好有效光源,无效光源不参与物体计算,这里的策略可以通过定制渲染管线。
  10. Shader 相关的优化,空间换时间, 多光源光照计算优化与阴影计算优化等。
  11. 绘制同一批物体的时候,尽量用同一个shader, 减少Shader的切换, Shader切换又叫SetPassCall, SetPassCall非常消耗性能,同时把常用的Shader加载到内存常驻。

避免Shader不断重复交叉切换。

  1. 尽量把一些物体合并到一个材质里面,比如玩家手里的枪,可能有很多支,但是我们把所有枪的纹理合并到一个纹理里面,就可以使用一个材质来渲染任意枪的类型,这样可以合并一些枪的drawcall。比如可以把地图里面的物体贴图合并到一个忒图里面用一个材质。
  2. 可以考虑使用 静态合批,动态合批,GPU Instancing合批来节约DrawCall。UGUI可以通过做图集来节约DrawCall。
  3. 通过预先采样将顶点保存起来优化动画播放组件。

物理引擎相关优化技巧

物理引擎也是性能开销很大的一个点,很多物理刚体比较多的游戏帧率下降的比较厉害,如何优化物理引擎可以从一下方面来考虑:

  1. 尽可能的减少的刚体数目,刚体的数目决定了物理引擎的计算成本。
  2. 尽可能的使用性能高的物理形状捧起,避免复杂的物理形状碰撞器。球型碰撞器的性能就要大于刚体碰撞器。
  3. 调整一些物理参数,减少物体的迭代次数来提升物理引擎的性能。
  4. 更换性能更好的物理引擎,或者更换某个方面更好的物理引擎。
  5. 自己根据游戏的需求自己实现一个性能高的阉割版“物理引擎”。

今天的性能优化技巧总结与分享就到这里,希望大家在工作中 对Unity性能优化提供一些帮助。

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

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

相关文章

电脑pdf如何转换成word格式?用它实现pdf文件一键转换

pdf转word格式可以用于提取和重用pdf文档中的内容,有时候,我们可能需要引用或引用pdf文档中的一些段落、表格或数据,通过将pdf转换为可编辑的Word文档,可以轻松地复制和粘贴所需内容,节省我们的时间,那么如…

【守护工地安全】YOLOv8实现安全帽检测

学习《OpenCV应用开发:入门、进阶与工程化实践》一书 做真正的OpenCV开发者,从入门到入职,一步到位! 数据集 该图像数据集包含8000张图像,两个类别分别是安全帽与人、以其中200多张图像为验证集,其余为训…

谁说知识库都是英文的 今天就来一个中文版的

1.安装 1.1创建目录 mkdir -p /opt/trilium-cn cd /opt/trilium-cn 1.2.编写docker-compose.yml文件 version: 3 services:trilium-cn:image: nriver/trilium-cnrestart: alwaysports:- "10012:8080"volumes:# 把同文件夹下的 trilium-data 目录映射到容器内- /opt…

基于JavaWeb+SSM+Vue基于微信小程序生鲜云订单零售系统的设计和实现

基于JavaWebSSMVue基于微信小程序生鲜云订单零售系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计…

6.4.4释放音频

6.4.4释放音频 许多Flash动画里的音乐或歌曲非常好听,能不能在没有源文件的情况下把里面的声音文件取出来呢?利用Swf2VideoConverter2可以轻松做到这一点。 1.单击“添加”按钮,在弹出的下拉菜单中选择“添加文件”,…

java小项目:简单的收入明细记事本,超级简单(不涉及数据库,通过字符串来记录)

一、效果 二、代码 2.1 Acount类 package com.demo1;public class Acount {public static void main(String[] args) {String details "收支\t账户金额\t收支金额\t说 明\n"; //通过字符串来记录收入明细int balance 10000;boolean loopFlag true;//控制循…

iOS中的视频播放

引言 在数字时代,视频已成为我们日常沟通和娱乐不可或缺的一部分。从简短的社交媒体剪辑到全长电影,我们对流畅、高质量视频播放的需求从未如此强烈。对于开发者来说,为iOS用户提供无瑕疵的视频体验是一项挑战,也是一种艺术。本篇…

数据结构之list类

前言 list是列表类。从list 类开始,我们就要接触独属于 Python 的数据类型了。Python 简单、易用,很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说,让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输…

手把手教你使用 VS Code 运行和调试 Python 程序

本文以 Ubuntu 系统为例,介绍如何在 VS Code 上配置 Python 的编程环境,并把 Python 程序运行、调试起来。由于 Python 是解释型语言,并且 VS Code 中提供了内置的调试器可用于调试 Python 代码,因此配置和操作流程比调试 C/C 代码…

SpringSecurity+JWT前后端分离架构登录认证

目录 1. 数据库设计 2. 代码设计 登录认证过滤器 认证成功处理器AuthenticationSuccessHandler 认证失败处理器AuthenticationFailureHandler AuthenticationEntryPoint配置 AccessDeniedHandler配置 UserDetailsService配置 Token校验过滤器 登录认证过滤器接口配置…

C++将信息输入到文件内

第一步检查文件是否打开&#xff0c;用到头文件&#xff1a; #include <fstream> #include <sstream> 文件打开的函数为 file.isopen() 信息输入到文件应该为 file << "" << value; 注意是file<< 如图 定义file ofstream f…

计算机组成原理 第一弹

ps&#xff1a;本文章的图片来源都是来自于湖科大教书匠高老师的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1-2 计算机的发展_哔哩哔哩_bilibili ​​ 目录 &#x1f680;计算机系统 &#x1f680;计…

UI测试脚本录制器已上线,RunnerGo :UI自动化测试平台

想快速配置可视化UI自动化测试脚本&#xff1f;RunnerGo近期上线脚本录制器&#xff0c;根据你的测试操作直接生成UI自动化测试脚本&#xff0c;下面是使用方法 Step1:下载录制器 点击RunnerGo上方插件按钮下载录制器 Step2:录制器使用 将插件文件拖入浏览器扩展程序 点击打…

Zabbix 系统监控详解

1 介绍 1.1 摘要 本文深入浅出&#xff0c;切近实际运维应用&#xff0c;由 zabbix 3.4 版本入手&#xff0c;学习 zabbix 监控告警实现方式&#xff0c;由 zabbix 5.0 浅出实现快速部署、快速应用。本人从业多年&#xff0c;关注 zabbix 开源社区&#xff0c;以及 zabbix 官…

【计算机网络】3、IPv6、网络三层模型、网络的规划与设计、网络的规划与设计、网络存储技术、网络地址翻译NAT、默认网关、虚拟局域网VLAN、虚拟专用网VPN、URL

文章目录 IPv6IPv6的特点IPv4和IPv6的过渡期间主要采用三种基本技术双协议栈隧道技术翻译技术 网络三层模型核心层汇聚层接入层 网络的规划与设计工作区子系统水平布线子系统管理子系统垂直干线子系统设备间子系统建筑群子系统总结 廉价磁盘网络存储技术直接附加存储(DAS)网络附…

Git学习笔记(第1章):Git概述

目录 1.1 版本控制 1.1.1 何为版本控制 1.1.2 为什么需要版本控制 1.1.3 版本控制工具 1.2 发展历史 1.3 工作机制 1.4 代码托管中心&#xff08;远程库&#xff09; Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。…

LeetCode19:删除链表的倒数第N个结点

力扣题目链接 思路&#xff1a;由于本题有可能删除头结点&#xff0c;为保证删除头结点和其他结点的操作一致&#xff0c;因此首先创建一个虚拟头结点dummy。 其次&#xff0c;本题需要删除倒数第N个结点&#xff0c;由于单链表只有next指针&#xff0c;因此需要找到倒数第N1…

事件驱动架构

请求驱动 服务注册&#xff0c;服务发现&#xff0c;虽然调用地址隐藏了&#xff0c;但是调用stub必须相同。 rpc通信&#xff0c;远程调用。 生产者和消费者要有相同的stub存根。 消费者和生产者的调用接口是耦合的。 事件驱动 核心&#xff1a;上下游不进行通信 中间通过M…

AP5101C 高压线性 LED恒流驱动器 DFN2*2 LED灯汽车雾灯转向灯

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为 130 …

「Kafka」Broker篇

「Kafka」Broker篇 主要讲解的是在 Kafka 中是怎么存储数据的&#xff0c;以及 Kafka 和 Zookeeper 之间如何进行数据沟通的。 Kafka Broker 总体工作流程 Zookeeper 存储的 Kafka 信息 启动 Zookeeper 客户端&#xff1a; [atguiguhadoop102 zookeeper-3.5.7]$ bin/zkCli.sh通…