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

这篇具有很好参考价值的文章主要介绍了unity 性能优化之GPU和资源优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Shader相关优化

众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那种只生成的一个Shader,这也是为了提高运行速度。
如果你要查看实际运行的代码,可以使用RenderDoc等工具截帧查看实际运行的代码。
unity 性能优化之GPU和资源优化
可以在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. 减少寄存器的数量
    unity 性能优化之GPU和资源优化
    一般是在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在打包时,会将格式转换成其它格式进行存储。
unity 性能优化之GPU和资源优化
上图展示了图片打包后的占用,前面则表面了当前的图片使用了何种压缩。
unity 性能优化之GPU和资源优化
所以,不要在乎图片导入时的大小和尺寸,要在图片上进行设置,比如设置其最大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. 各向异性过滤,建议不开启或者只单独处理
unity 性能优化之GPU和资源优化
它是默认开启的,一般设置Per Texture,然后需要在图片上开启。
unity 性能优化之GPU和资源优化
开启以后会增加采样,会降低纹理mipmap过渡时的锯齿。
5. 如果ui图片的尺寸不符合标准,会采用无损压缩,会造成浪费。

Mesh

  1. 注意写入的开启,开启状态内存占用会翻倍
    unity 性能优化之GPU和资源优化
  2. 骨骼模型要着重注意面数,比较影响性能,因为它的动画需要每帧计算顶点位置

资源相关检查工具

  1. 纹理和Mesh的检查工具,可以一键查看相关占用
    unity 性能优化之GPU和资源优化
    可以一键检查出对应的大文件。
    unity 性能优化之GPU和资源优化
    Mesh统计了使用次数的总占用,可以清晰的查看当前Mesh在场景的总占用。红色为未合并网格。

  2. 贴图相关检测
    unity 性能优化之GPU和资源优化
    可以检测贴图的尺寸是否规范
    unity 性能优化之GPU和资源优化
    可以检测贴图尺寸是否过大
    unity 性能优化之GPU和资源优化
    会将非4的倍数的图片导出到相应文件夹,然后美术同学可以修改完成图片后,对资源进行替换。

  3. shader相关检查
    unity 性能优化之GPU和资源优化
    可以查看所有shader变体数量
    unity 性能优化之GPU和资源优化
    可以打印出项目中shader的所有变体数量。
    变体减少的办法就是减少宏的使用,如果没办法,就少用multi_compile,使用shader_feature
    变体的相关使用 点击此处看官网

  4. 资源引用查找
    unity 性能优化之GPU和资源优化
    可以查看资源之间的互相引用,Uses可查看使用的资源,Used By可以查看被引用,Unused Assets查看没有被使用的资源
    可以选中物体进行查看相关引用,或者向上查找

  5. Prebe资源分析
    unity 性能优化之GPU和资源优化
    查找一个Prefab的资源引用分析,以及占用。

蒙皮动画

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

资源的加载

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

Shader的加载

默认情况下,Shader会在首次渲染几何体是进行加载,这也是我们减少变体的原因之一。如果使用了相同的变体和Shader,渲染新的几何体时,将不会在重新加载Shader。
有时会运行卡顿,我们可以使用预加载的形式进行Shader加载。
unity 性能优化之GPU和资源优化

UI的优化

优化unity UI,这是先备份一下,需要时再看。文章来源地址https://www.toymoban.com/news/detail-432172.html

到了这里,关于unity 性能优化之GPU和资源优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 性能优化四:UI耗时函数、资源加载、卸载API

    1.1 Canvas.SendWillRenderCanvases 这个函数是由于自身UI的更新,产生的耗时 1. 这里更新的是vertex 属性,比如 color、tangent、position、uv,修改recttransform的position、scale,rotation并不会导致顶点属性改变,因为顶点的position是根据pivot的偏移决定的,而改变其size、pivot、anchor,则会修改

    2024年02月14日
    浏览(32)
  • Unity 性能优化的手段(对象池、静/动态批处理、GPU实例化、垃圾回收、LOD、LightMap)【更新中】

    目录 对象池 扩容策略 收缩策略 DrawCall DrawCall的过程 为什么减少DrawCall可以实现性能优化? 减少Draw Call的方法 静态批处理(Static Batching) 动态批处理(Dynamic Batching) GPU Instancing(GPU实例化)​​​​​​​ 贴图集 垃圾回收的优化 垃圾回收的性能影响 延迟垃圾回收 避免

    2024年02月04日
    浏览(26)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(30)
  • Unity中Shader指令优化

    上一篇文章中,我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化 Unity中Shader指令优化(编译后指令解析) 在DirectX平台,常数运算是不占指令数的。但是,稳妥起见我们最好自己计算好常数计算的结果。防止其他平台认为常数运算需要占指令。

    2024年02月03日
    浏览(27)
  • Unity中Shader变体优化

    在Shader中,一般有两个方面的优化:一方面是内存优化(即变体优化);一方面是渲染优化(即Shader中计算的优化)。我们这篇文章来了解一下Shader变体的优化。 创建一个UnlitShader,里面有一个默认的Shader #pragma multi_compile_fog 选择Shader后,点击Compile and show code 右边的小箭头可

    2024年02月04日
    浏览(27)
  • Unity Shader相关的ZTest,ZWrite,Blend

    画家算法: 以一个画布为背景,从远到近画一个画面,先画最远的背景,也就是天空 然后假如是雪山, 然后再画上树木,树木在雪山上 然后山下是若干个居民的房屋,以及若干条道路 其次房屋门前可能有树木又当道部分房屋 其中某片区域一定会进行若干次上色,这样在

    2024年02月03日
    浏览(31)
  • 【Unity Shader 中Pass相关介绍_第四篇】

    故事的开始在前一篇 a.结构体语法 结构体允许储存多个不同类型的变量,并将多个变量包装成为一个整体进行输入或者输出。 结构体如下: struct:定义结构体的。 Type:给当前结构体定义一种类型,着色器函数定义输入和输出数据类型时会用到,结构体内包含的变量

    2024年02月07日
    浏览(31)
  • CPU和GPU性能优化

    在Unity游戏开发中,优化CPU和GPU的性能是非常重要的,可以提高游戏的运行效率、降低功耗和延迟,并提高用户体验。以下是一些优化CPU和GPU性能的方法: 1.优化游戏逻辑和算法 减少不必要的计算和内存操作,例如避免频繁的分配和释放内存,减少不必要的数据结构和循环。

    2024年02月09日
    浏览(35)
  • 前端面试:【性能优化】页面加载性能、渲染性能、资源优化

    嗨,亲爱的前端开发者!在今天的Web世界中,用户期望页面加载速度快、交互流畅。因此,前端性能优化成为了至关重要的任务。本文将探讨三个关键方面的性能优化:页面加载性能、渲染性能以及资源优化,以帮助你构建更快速、响应更快的Web应用程序。 1. 页面加载性能:

    2024年02月11日
    浏览(39)
  • Unity中Shader指令优化(编译后指令解析)

    我们先读懂Shader编译后代码,才能对Shader进行合理的优化 我们目前先只编译到 D3D 平台 这是编译后的代码(我们来逐步分析):

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包