性能优化-卡牌项目渲染优化

优化的方向

CPU

影响帧率

GPU

影响帧率

内存

超了会崩

显存

显存超了画面会异常,甚至可能导致游戏崩溃

带宽

影响耗电

分辨率

设备性能不行又要求流畅,降低目标渲染分辨率,立竿见影,但是会牺牲画质

场景

1 使用烘焙,减少实时渲染

2 静态合批,不动的做出Static的物体

剔除

1 遮挡剔除:被挡住看不见的就不渲染

2 视椎体剔除:设置合理的视椎体大小

3 小对象的剔除:将小对象放入单独一层,并使用 Camera.layerCullDistances 脚本函数设置每层剔除距离

4 LOD:根据距离显示不同的模型渲染

角色

阴影

1 使用投影做假的阴影

2 如果是实时阴影,如果不是重点角色,降低阴影质量

光照

1 能用光照贴图的地方用贴图,减少计算

2 反射环境不用实时的,使用环境贴图

3 非重点角色使用低功耗光照算法

模型

减少数据量级

减少顶点数量、三角面、材质、renderer

避免接缝

避免重合的顶点,重合的边

贴图

缩小贴图分辨率

减少贴图数量,小的贴图合并到大的贴图里面。这减少材质数量,可以合批

质量分级

根据设备性能加载不同质量的模型

光照

减少引起像素光照的光源

贴图

1 降低分辨率

2 使用mipmap,降低带宽和显存占用,但是会增加内存占用

3 尽可能使用压缩纹理格式,并使用 16 位纹理而非 32 位纹理

特效

1 限制粒子数量

用更少的粒子

2 质量分级

根据设备性能使用不同质量的特效,低端机减少氛围粒子,比如火焰爆炸的小火星、烟尘

3 降低Overdraw

减小粒子的面积,越大的粒子重叠的越厉害,导致的Overdraw越多

4 隐藏不必要的特效

特效数量大的时候距离相机远的受击效果隐藏

5 尝试使用GPU粒子特效

有的平台不支持,没有CPU粒子特效稳,但是效率高

带宽

1 减少纹理分辨率

2 减少目标分辨率

3 使用目标平台最适宜的压缩格式

4 使用mipmap,如果选择了小分辨率则会降低带宽

5 使用合适的采样方式,越简单的采样方式性能越好,关注项目中各向异性采样和三线性插值采样,纹理采样会读缓存,如果没读到会往CPU更远的地方读SystemMemory,采样点增加导致cache miss,导致带宽上升

各向异性采样次数在Unity中设置有1-16,应尽量设置为1;三线性采样采8个顶点,相对于双线性采样是翻倍的

6 优化顶点带宽,顶点带宽占用比较小,读顶点的带宽值应该占总带宽的10%-20%较为合理

UI

1 全屏UI互斥,降低OverDraw

2 不需要Mask的UI,移除UI中不必要的模板测试代码,需要Mask的UI尽量使用RectMask2D

3 动静分离解决UI合批问题

4 使用图集,某个UI界面使用的图片放到一个图集

5 UI上去掉不必要的Raycast Target

shader代码

结构优化

减少pass,避免使用多pass的shader

质量分级

根据设备性能使用不同的算法

在顶点着色器计算代替在像素着色器计算
shader lod技术

只有shader的LOD值小于某个设定的值,这个shader才会被使用,而使用了那些超过设定值的shader的物体将不会被渲染

减少耗时的运算

三角函数,指数

精度优化

float/highp:顶点坐标

half/mediump:标量、纹理坐标

fixed/lowp:颜色和归一化后端方向矢量

插值优化

uv1, uv2打包到一个half4进行插值

vec2 a, vec2 b打包到一个vec4中进行插值

移动平台敏感操作

Alpha 测试、颜色遮罩 (Color Mask)可能是资源密集型的操作,能不用就不用

后处理

取舍,减少后处理

合并后处理,在一个shader里完成多个后处理效果

合批

SRP Batch:合并相同shader变体,把数据一次性传入gpu,减少对属性的设置,只需要绑定已经传进gpu的数据

Static batching:将静态物体合并为一个大网格,从而以更快的速度渲染它们。不会减少DrawCall,但是会让CPU在“设置渲染状态-提交Draw Call”上更高效

GPU Instancing:同一Mesh和同一Material

Dynamic Batching:是为过去的低端设备设计的。在如今的电子设备上,动态批处理产生的CPU开销反而有可能大于DrawCall的开销,影响性能。

合批优化项冲突时生效优先级

优先级冲突:SRP Batcher|Static Batching > GPU Instancing > Dynamic Batching(4)

工具

Statistics窗口,查看性能指标和耗时

Profile窗口,查看耗时

FrameDebuger,查看渲染过场

小结

卡牌项目渲染方面优化的重点在场景、角色、特效。需要烘焙场景,使用烘焙好的光照贴图,优化模型制作、特效制作。

角色模型的面部、影响身材的网格、影响气质的衣服可以做的精细,不重要的地方可以降低质量,达成好钢用在刀刃上的目的。

每个项目要求不同,灵活应对。

参考资料

https://docs.unity3d.com/cn/2020.2/Manual/OptimizingGraphicsPerformance.html

https://zhuanlan.zhihu.com/p/523702434

https://imgtec.eetrend.com/blog/2020/100050575.html

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

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

相关文章

Vue:自动按需导入element-plus图标,动态导入

在 Vue3 中,component 动态组件的 is 属性必须绑定的是组件实例,而不是组件名字 所以需要在JS里面导入组件,创建一个对象存储,利用键值对,返回组件 如何配置自动导入看上一篇:https://blog.csdn.net/ruanc…

Java网络编程详解

目录 网络编程 1、概述 2、网络通信的要素 3、IP 4、端口 5、通信协议 6、TCP 文件上传 Tomcat 7、UDP 单方发送单方接受 双方发送接收 8、URL URL测试 URL下载网络资源 网络编程 1、概述 信件: 计算机网络: 计算机网络是指将地理位置不…

WPF —— TextBlock、LineBreak RadioButton控件详解

一:TextBlock 1&#xff1a;TextBlock 简介 <LineBreak/> 换行 显示文本 标签内容和content属性共存 2、TextBlock 常用的属性 Foreground&#xff1a;TextBlock的文本内容的颜色。 Background&#xff1a;背景&#xff0c;获取或设置要用于填充内容区域背景的 Brush…

冒泡排序的理解与实现【C语言、C++、java】

冒泡排序介绍 冒泡排序(Bubble Sort)&#xff0c;又被称为气泡排序或泡沫排序。 它是一种较简单的排序算法。它会遍历若干次要排序的数列&#xff0c;每次遍历时&#xff0c;它都会从前往后依次的比较相邻两个数的大小&#xff1b;如果前者比后者大&#xff0c;则交换它们的位…

一体机电脑辐射超标整改

电脑一体机是目前台式机和笔记本电脑之间的一个新型的市场产物&#xff0c;它将主机部分、显示器部分整合到一起的新形态电脑&#xff0c;该产品的创新在于内部元件的高度集成。随着无线技术的发展&#xff0c;电脑一体机的键盘、鼠标与显示器可实现无线链接&#xff0c;机器只…

美国站群服务器使用技巧与注意事项

美国站群服务器使用技巧与注意事项有哪些?RAKsmart小编为您整理发布美国站群服务器使用技巧与注意事项&#xff0c;希望对您有帮助。 美国站群服务器的使用技巧主要包括远程管理、灵活配置和备份还原&#xff0c;具体如下&#xff1a; 1. **远程管理**&#xff1a;用户可以通过…

洛谷 P1036 [NOIP2002 普及组] 选数

题目描述 已知 nn 个整数 x_1,x_2,\cdots,x_nx1​,x2​,⋯,xn​&#xff0c;以及 11 个整数 kk&#xff08;k<nk<n&#xff09;。从 nn 个整数中任选 kk 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4n4&#xff0c;k3k3&#xff0c;44 个整数分别为 3,7,12,1…

计算机网络-第5章 运输层(2)

5.6 TCP可靠传输实现 以字节为单位的滑动窗口。 发送窗口已满&#xff0c;停止发送。 发送和接收的数据都来自缓存。 超时重传时间RTO选择&#xff1a;自适应算法&#xff0c; 选择确认SACK&#xff1a;只传送缺少的数据。大多数实现还是重传所有未被确认的数据块。 5.7 TCP的…

Spring 初学者遇到的问题

TagLibraryValidator Spring 实战 5.2 中有个表单需要在 jsp 中遍历数组&#xff0c;添加&#xff1a;<% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c" %>&#xff0c;访问时发现有些问题&#xff1a; java.lang.NoClassDefFoundError…

Java线程锁之Lock的使用

Lock 的使用 Lock 是java 1.5 中引入的线程同步工具&#xff0c;它主要用于多线程下共享资源的控制。本质上Lock 仅仅是一个接口&#xff0c; 可以通过显式定义同步锁对象来实现同步&#xff0c;能够提供比synchronized 更广泛的锁定操作&#xff0c;并支持多个相关的 Lock接…

LLM 推理优化

LLM 推理服务重点关注两个指标&#xff1a;吞吐量和时延&#xff1a; 吞吐量&#xff1a;主要从系统的角度来看&#xff0c;即系统在单位时间内能处理的 tokens 数量。计算方法为系统处理完成的 tokens个数除以对应耗时&#xff0c;其中 tokens 个数一般指输入序列和输出序列长…

掌握Mongodb,看完这篇文章就够了

目录 1.概念 2.操作 2.1数据库操作 2.2集合操作 2.3数据操作 3.查询 4.常用技术 5.python与MongoDB 1.概念 MongoDB是一种非关系型数据库&#xff08;NoSQL&#xff09;&#xff0c;它以灵活的文档存储格式&#xff08;BSON&#xff09;和强大的查询能…

MinGW-w64的下载与安装

文章目录 1 下载2 安装3 配置环境变量4 验证 1 下载 官网地址&#xff1a;https://www.mingw-w64.org/github地址&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases windows下载 跳转github下载 版本号选择&#xff1a;13.2.0是GCC的版本号&#xff1b…

如何避免MYSQL主从延迟带来的读写问题?

在MYSQL 部署架构选型上&#xff0c;许多公司都会用到主从读写分离的架构&#xff0c;如下是一个一主一从的架构&#xff0c;主库master负责写入&#xff0c;从库slave进行读取。 但是既然是读写分离&#xff0c;必然会面临这样一个问题&#xff0c;当在主库上进行更新后&#…

010-$nextTick

$nextTick 1、问题2、$nextTick3、应用场景 1、问题 Vue 实现响应式&#xff0c;在 data 更新后&#xff0c;一定时间内&#xff0c;没有继续操作DOM&#xff0c;然后会触发浏览器渲染引擎去更新DOM&#xff0c;更新DOM也是需要时间的&#xff0c;所以 data 更新引起的 DOM更新…

FreeRTOS学习第9篇--队列介绍

目录 FreeRTOS学习第9篇--队列介绍1. 数据传输的方法1.1 任务之间如何传输数据1.2 队列的本质 2. 队列的工作原理和实现2.1 创建队列2.2 向队列发送数据2.3 从队列接收数据 3. 使用队列进行任务间的通信3.1 通信示例3.2 同步示例 结论 FreeRTOS学习第9篇–队列介绍 本文目标&a…

《C++游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune

《C游戏编程入门》第1章 类型、变量与标准I/O: Lost Fortune 1.1.1 使用C编写游戏1.1.2 生成可执行文件1.1.3 错误处理 1.2 第一个C程序01.game_over.cpp01.game_over2.cpp01.game_over3.cpp 1.4 使用算术运算符01.expensive_calculator.cpp 1.5 声明和初始化变量01.game_stats…

minimap2参数设置+解释【全网最详细】

Indexing -H: 使用同源聚合的k-mer(适用于PacBio数据) -k INT: k-mer的大小(不超过28)【默认值:15】 -W INT: minimizer窗口大小【默认值:10】 -I NUM: 每个~NUM输入碱基分割索引【默认值:4G】 -d FILE: 将索引转储到文件中 Mapping: -f FLOAT: 过滤掉顶部FLOAT比例的重…

【设计模式】概述及七大设计原则

设计模式 什么是设计模式 设计模式是前辈们对代码开发经验的总结&#xff0c;是解决一些特定问题的一系列套路。不是语法规定&#xff0c;也是一套用来提高代码复用性、可维护性、可读性、健壮性和安全性的解决方案。 学习设计模式的意义 设计模式的本质是面向对象设计原则…

QML | 在QML中导入JavaScript资源、导入JavaScript资源、包含一个JavaScript 资源

01 在QML中导入JavaScript资源 JavaScript资源可以被QML文档和其他JavaScript通过相对或者绝对路径进行导入。如果使用相对路径,位置解析需要相对于包含import语句的QML文档或JavaScript资源的位置。如果JavaScript需要从网络资源中进行获取,组件的status属性会被设置为Loadi…