当前位置: 首页 > news >正文

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

优化的方向

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 平台具有以下特点&#xf…...

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 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...