性能优化-卡牌项目渲染优化
优化的方向
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
相关文章:
性能优化-卡牌项目渲染优化
优化的方向 CPU 影响帧率 GPU 影响帧率 内存 超了会崩 显存 显存超了画面会异常,甚至可能导致游戏崩溃 带宽 影响耗电 分辨率 设备性能不行又要求流畅,降低目标渲染分辨率,立竿见影,但是会牺牲画质 场景 1 使用烘焙…...
STM32FreeRTOS任务通知(STM32cube高效开发)
文章目录 一、任务通知(一)任务通知概述1、任务通知可模拟队列和信号量2、任务通知优势和局限性 (二) 任务通知函数1、xTaskNotify()发送通知值不返回先前通知值的函数2、xTaskNotifyFromISR()发送通知函数ISR版本3、x…...
基于element-plus的Dialog选择控件
翻看之前工程师写的vue2的代码,很多都是复制、粘贴,也真是搞不懂,明明可以写一个控件,不就可以重复使用。很多前端总喜欢element搞一下,ant-design也搞一下,有啥意义,控件也不是自己写的&#x…...
手把手教使用静默 搭建Oracle 19c 一主一备ADG集群
一、环境搭建 主机IPora19192.168.134.239ora19std192.168.134.240 1.配置yum源 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包; rpm -qa|grep yum >oldyum.pkg 备份原信息rpm -qa|grep yum|xargs rpm -e --nodeps 不检查依赖,直接删除…...
使用协程库httpx并发请求
httpx和aiohttp都是比较常用的异步请求库,当然requests多线程或requestsgevent也是不错的选择。 一个使用httpx进行并发请求的脚本如下: import functools import sys import timeimport anyio import httpxasync def fetch(client, results, index) -…...
js的同步异步
JavaScript(JS)是一门单线程的编程语言,这意味着它一次只能处理一个任务。然而,JS 支持同步和异步操作。 同步操作是指代码按照顺序执行,每个操作必须在前一个操作完成后才能进行。这意味着当一个操作在执行时&#x…...
C# MG.CamCtrl 工业相机库(开源) 海康 大恒
C# MG.CamCtrl 相机库(开源) 海康 大恒 介绍工厂模式创建实例选取对应SN号的相机,初始化启动相机取图注销相机参数设置/获取接口 介绍 c# 相机库,含海康、大恒品牌2D相机的常用功能。 底层采用回调信号量模式封装 ,最…...
【Redis】redis的基本使用
📝个人主页:五敷有你 🔥系列专栏:Redis ⛺️稳中求进,晒太阳 Redis的概述 为什么要有redis? redis是数据库,mysql也是数据库,redis做缓存的意义就是为了减轻数据库压力 数据库为什么…...
植物病害识别:YOLO水稻病害识别数据集(3000多张,3个类别,yolo标注)
YOLO水稻病害识别数据集,包含细菌性枯萎病,水稻瘟疫,褐斑病3个常见病害类别,共3000多张图像,yolo标注完整,可直接训练。 适用于CV项目,毕设,科研,实验等 需要此数据集或…...
Java实现Tron(波场)区块链的开发实践(三)波场链水龙头、WEB3测试实战
上一节我们具体讲到Java实现Tron波场链的逻辑代码实现。 这一节我们通过部署和开发好的代码,针对测试链进行自测开发,准备测试环境。 1. 创建离线地址 首先我们需要一个离线地址,我们不需要在线进行创建,直接可以通过第一节的离…...
010-$nextTick
$nextTick 1、问题2、$nextTick3、应用场景 1、问题 Vue 实现响应式,在 data 更新后,一定时间内,没有继续操作DOM,然后会触发浏览器渲染引擎去更新DOM,更新DOM也是需要时间的,所以 data 更新引起的 DOM更新…...
[IAGC] Kafka消费者组的负载均衡策略
在Apache Kafka中,负载均衡是通过将主题的每个分区分配给消费者组中的一个消费者来实现的。Kafka的负载均衡算法会尽可能平均地将分区分配给每个消费者。 文章目录 分配策略Kafka的重新平衡扩展性参考资源 分配策略 在Kafka中,有两种内置的分区分配策略…...
2024年会声会影 迎接来了七大新功能
我喜欢Corel VideoStudio 会声会影2024旗舰版,因为它使用起来很有趣。它很容易使用,但仍然给你很多功能和力量。VideoStudio让我与世界分享我的想法!“这个产品的功能非常多,我几乎没有触及它的表面,我可以做大量的编辑…...
AIGC、3D模型、轻量化、格式转换、可视化、数字孪生引擎等(老子云三维模型可视化优化服务平台)
老子云概述 老子云3D可视化快速开发平台,集云压缩、云烘焙、云存储云展示于一体,使3D模型资源自动输出至移动端PC端、Web端,能在多设备、全平台进行展示和交互,是全球领先、自主可控的自动化3D云引擎。 平台架构 平台特性 基于 H…...
JMM(Java Memory Model)内存模型
Java内存模型,规范了计算机内存与java虚拟机之间的协调工作,即规定了 将java 虚拟机中的变量存储到内存中和从内从中取出来的内存细节。 Java内存模型中规定了所有的变量都存储在内存中,每条线程还有自己的工作内存,线程对变量的…...
.NET 简介:跨平台、开源、高性能的开发平台
.NET 简介 .NET 是微软开发的一个免费、开源、跨平台的开发人员平台,用于构建各种类型的应用程序。它可以运行使用多种语言编写的程序,其中 C# 是最常用的语言。.NET 依赖于许多大规模应用在生产中使用的高性能运行时。 .NET 平台具有以下特点…...
m序列生成器
function [m] mserial_generator(tap_set) % m序列产生器 % 输出为m序列,未进行极性变换。 L 2^(length(tap_set)-1)-1; x [zeros(1,(length(tap_set)-2)) 1]; for i 1:1:Lm(i)x(end);for j 1:1:length(tap_set)-1sum_vector(j)tap_set(j1)*x(j);endsum_x mod…...
go的数据类型看这一篇就够了
目录 一:类型分类 二:介绍 一:类型分类 go的数据类型包含11种,可以分为以下四类。 1:基础类型:布尔,数字和字符串: 2:复合类型:数组和结构体 3:引用类型: 指针,channel通道,切片,map字典,函数 4:接口类型 二:介绍 1:布尔 一个布尔类型的值只有两种:tr…...
【机器学习300问】28、什么是决策树?
〇、两个预测任务 (1)任务一:银行预测偿还能力 当前,某银行正致力于发掘潜在的放贷用户。他们掌握了每位用户的三个关键特征:房产状况、婚姻状况以及年收入。此外,银行还拥有过往这些用户的债务偿还能力的…...
嵌入式学习33-网络通信
网络: 数据传输,数据共享 1.网络协议模型: OSI协议模型 7 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&…...
ArcGIS JS 基础教程(1):地图初始化(含AMD/ESM两种引入方式)
ArcGIS JS 系列基础教程(100个项目常用热门功能) 一、地图基础操作 1. ArcGIS JS 基础教程(1):地图初始化(含AMD/ESM两种引入方式) 功能介绍:ArcGIS JS 开发的基础,实…...
2026奇点大会闭门报告首发(仅限首批200名工程负责人):AI原生测试的7层抽象架构与4类不可逆迁移陷阱
第一章:2026奇点智能技术大会:AI原生测试自动化 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,“AI原生测试自动化”不再是一个愿景,而是已落地的工程范式——它将大语言模型、多模态推理与测试生命周…...
EmojiOne Color彩色字体:终极免费表情解决方案
EmojiOne Color彩色字体:终极免费表情解决方案 【免费下载链接】emojione-color OpenType-SVG font of EmojiOne 2.3 项目地址: https://gitcode.com/gh_mirrors/em/emojione-color EmojiOne Color是一款开源的彩色表情字体,采用OpenType-SVG格式…...
从本地到云端:FastAPI服务器部署的5个必知要点(避坑指南)
从本地到云端:FastAPI服务器部署的5个必知要点(避坑指南) 当你兴奋地完成了一个FastAPI应用的开发,准备将它从本地环境迁移到云端服务器时,可能会遇到各种意想不到的问题。接口无法访问、性能突然下降、请求超时...这些…...
MMC-HVDC仿真模型及柔性直流输电相关基础模型集合
MMC-HVDC仿真模型,pscad柔性直流输电仿真mmc仿真模型,双端mmc模型,MMC为21电平NLM和均压控制,还有多端如张北直流电网以及基本mmc逆变器,自己为毕业网上收集的一些觉得有用的基础模型最近在折腾MMC-HVDC仿真࿰…...
绍兴GEO优化,亲测3家公司复盘
开篇:定下基调在AI生成式引擎重塑信息获取方式的今天,GEO(生成式引擎优化)已成为企业建立数字信任、抢占精准流量的核心战场。绍兴作为民营经济活跃的区域,企业对高效、落地的GEO优化服务需求日益迫切。本次测评旨在通…...
ros2中可视化topic数值命令
ros2 run plotjuggler plotjuggler...
Python数据可视化指南
Python数据可视化指南 后端转 Rust 的萌新,ID "第一程序员"——名字大,人很菜(暂时)。正在跟所有权和生命周期死磕,日常记录 Rust 学习路上的踩坑经验和"啊哈时刻",代码片段保证能跑。…...
lwIP 深度解析:TCP 错误回调函数 errf 的触发机制与实战应用
1. lwIP协议栈中的TCP错误处理机制 在嵌入式网络开发中,lwIP作为轻量级TCP/IP协议栈被广泛应用。理解其TCP错误处理机制对开发稳定可靠的网络应用至关重要。TCP协议通过错误回调函数(errf)向应用层报告连接异常,这就像是一个贴心的…...
HWA_19leetcode83删除链表中的重复元素
题目题解 class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:#从链表的头节点开始访问每一个节点cur head#在访问过程中,只要当前节点和当前节点的下一个节点有值,就不断地访问下去while cur and cur.nex…...
