当前位置:网站首页>UnityShader入门精要——Unity中的渲染优化技术(四)
UnityShader入门精要——Unity中的渲染优化技术(四)
2022-06-23 03:54:00 【果冻喜之郎】
节省带宽
1 减少纹理大小
- 所有纹理的长宽比最好是正方形,且长宽值最好是2的整数幂。
- 使用多级渐远纹理技术。
通过把纹理类型设置为Advanced, 就可以自定义许多选项,例如,是否生成多级渐远纹理(mipmaps), 当勾选了Generate Mip Maps选项后,Unity就会为同一张纹理创建出很多不同大小的小纹理,构成一个纹理金字塔。而在游戏运行中就可以根据距离物体的远近,来动态选择使用哪一个纹理。
- 纹理压缩。
纹理压缩
http://t.csdn.cn/zK5632 利用分辨率缩放
过高的屏幕分辨率也是造成性能下降的原因之一,尤其是对于很多低端手机,除了分辨率高其他硬件条件并不尽如人意,而这恰恰是游戏性能的两个瓶颈:过大的屏幕分辨率和糟糕的GPU。因此,我们可能需要对于特定机器进行分辨率的放缩。当然,这样可能会造成游戏效果的下降,但性能和画面之间永远是个需要权衡的话题。
在Unity中设置屏幕分辨率可以直接调用Screen. SetResolution。
减少计算复杂度
1 shader的LOD技术
和模型的LOD技术类似,Shader 的LOD技术可以控制使用的Shader等级。它的原理是,只有Shader的LOD值小于某个设定的值,这个Shader才会被使用,而使用了那些超过设定值的Shader的物体将不会被渲染。
SubShader {
Tags { 个"RenderType "="Opaque" }
LOD 200
}我们也可以在Unity Shader 的导入面板上看到该Shader使用的LOD值。在默认情况下,允许的LOD等级是无限大的。这意味着,任何被当前显卡支持的Shader都可以被使用。但是,在某些情况下我们可能需要去掉一些使用了复杂计算的Shader 渲染。这时,我们可以使用Shader.maximumLOD或Shader.globalMaximumLOD来设置允许的最大LOD值。Unity内置的Shader使用了不同的LOD值,例如,Diffuse的LOD为200,而Bumped Specular的LOD为400。
2 代码优化
在实现游戏效果时,我们可以选择在哪里进行某些特定的运算。通常来讲,游戏需要计算的对象、顶点和像素的数目排序是对象数<顶点数<像素数。因此,我们应该尽可能地把计算放在每个对象或逐顶点上。
- 尽量使用低精度浮点值运算
最高精度的floathighp 适用于存储诸如顶点坐标等变量,但它的计算速度是最慢的,我们应该尽量避免在片元着色器中使用这种精度进行计算。
half/mediump适用于一些标量、纹理坐标等变量,它的计算速度大约是float的两倍。
fixed/lowp 适用于绝大多数颜色变量和归一化后的方向矢量,在进行一些对精度要求不高的计算时,我们应该尽量使用这种精度的变量。它的计算速度大约是float 的4倍,但要避免对这些低精度变量进行频繁的swizzle操作( 如color.xwxw)。
还需要注意的是,我们应当尽量避免在不同精度之间的转换,这有可能会造成一定的性能下降。
- 对于绝大多数GPU来说,在使用插值寄存器把数据从顶点着色器传递给下一个阶段时,我们
应该使用尽可能少的插值变量。
如果需要对两个纹理坐标进行插值,我们通常会把它们打包在同一个float4类型的变量中,两个纹理坐标分别对应了xy分量和zw分量。
然而,对于PowerVR平台来说,这种插值变量是非常廉价的,直接把不同的纹理坐标存储在不同的插值变量中,有时反而性能更好。尤其是,如果在PowerVR上使用类似 tex2D( MainTex, uv.zw)这样的语句来进行纹理采样,GPU就无法进行一些纹理的预读取,因为它会认为这些纹理采样是需要依赖其他数据的。因此,如果我们特别关心游戏在PowerVR上的性能,就不应该把两个纹理坐标打包在同一个四维变量中。
- 尽可能不使用全屏的屏幕后处理效果。
如果美术风格实在是需要使用类似Bloom、热扰动这样的屏幕特效,我们应该尽量使用fixed/lowp. 进行低精度运算(纹理坐标除外,可以使用half/mediump)。那些高精度的运算可以使用查找表(LUT)或者转移到顶点着色器中进行处理。
- 尽量把多个特效合并到一个Shader中。
- 尽可能不要使用分支语句和循环语句。
- 尽可能避免使用类似sin、tan、pow、log 等较为复杂的数学运算。我们可以使用查找表来
作为替代。 - 尽可能不要使用discard 操作,因为这会影响硬件的某些优化。
3 根据硬件条件进行缩放
我们首先保证游戏最基本的配置可以在所有的平台上运行良好,而对于一些具有更高表现能力的设备,我们可以开启一些更“养眼”的效果,比如使用更高的分辨率,开启屏幕后处理特效,开启粒子效果等。
优化图像性能
https://docs.unity3d.com/Manual/OptimizingGraphicsPerformance.html
边栏推荐
- Implementation of the rotation chart
- HCIP 重发布实验
- PHP move_uploaded_file上传移动图片失败
- Separate use of alertmanager alarms and use of Prometheus configuration alarm rules
- Install and run mongodb under win10
- OSPF分流实验
- dolphinscheduler海豚调度升级代码改造-UpgradeDolphinScheduler
- Shadertoy basic teaching 02. Drawing smiling faces
- The technological advance of new employees? Journey
- 《微信小程序-基础篇》带你了解小程序的路由系统(二)
猜你喜欢

微信小程序:微信也可以发闪照了闪照制作生成微信小程序源码下载,自定义闪照时间

PRCS-1016 : Failed to resolve Single Client Access Name

【Mac】安全性与隐私中没有任何来源选项

go学习记录二(Window)

985 test engineer is hanged. Who is more important in terms of education and experience?

Brief ideas and simple cases of JVM tuning - why do you need JVM tuning?

当SBAS遇上rtklib

dolphinscheduler 1.2.1 数据迁移到 dolphinscheduler 2.0.5方法及迁移后数据测试记录

掌握 Shell,一篇就够了!

2022-06-22:golang选择题,以下golang代码输出什么?A:3;B:1;C:4;D:编译失败。 package main import ( “fmt“ ) func mai
随机推荐
Dolphin scheduler 2.0.5 spark task test summary (source code optimization)
HCIP第五次作业
teqc进行GNSS数据质量分析时生成的s文件介绍
Banner banner
dolphinscheduler 1.2.1 数据迁移到 dolphinscheduler 2.0.5方法及迁移后数据测试记录
JDBC调用存储过程、MySQL触发器
SwiftUI 2.0 课程笔记 Chapter 4
apache atlas 快速入门
MVC三層架構
[graph theory] - bipartite graph
Cookie-Session讲解
【Mac】安全性与隐私中没有任何来源选项
VGg Chinese herbal medicine identification
396. mine site construction
Apache atlas quick start
insert into... where not exists插入避免重复的使用
Dolphin scheduler 2.0.5 task test (spark task) reported an error: container exited with a non zero exit code 1
QT elidedtext only works for Chinese conformity, but not for English
3 天完成小学期项目,手把手教你完成天气播报系统!
Metadata management Apache Atlas Compilation (embedded) deployment and various error records encountered