【Unity】图形渲染瓶颈与批处理优化
【Unity】图形渲染瓶颈与批处理优化
图形渲染
工作方式
显卡的工作方式并非连续的,一般分三步。
- 上传更新渲染数据至显存
- 设置显卡的渲染管线状态
- 启动绘制并等待绘制结果
性能瓶颈
由于显卡是大规模并行计算,绘制几个或几千个三角面在速度上基本没有区别,这时候瓶颈就容易出现在工作方式中第一第二点上。
内存到显存的传输是有代价的
如果对比过 Unity 的作业系统就会发现一点,对应一些数据量大但计算量小的任务,使用计算着色器的速度反而比作业系统要慢的多。
原因就是因为计算量小导致显卡的强大计算能力没法体现,结果时间全花在了大量数据的传输上,不如直接用 CPU 就地解决。
处理器与显卡的沟通是有代价的
此时数据已经传输到了显存中,但具体使用那些数据,哪种绘制方式,这些都需要进行设置,这就需要 CPU 与 GPU 进行沟通。
同第一点,这是两种不同的硬件,交流本就有延迟,再加上 GPU 因此切换内部状态的时间,那就更长了。
优化方案
由此可见我们应在两个方向上进行优化
- 减少显存中数据的更新频率
- 减少显卡中工作状态的切换
诸如网格,纹理,着色器,常量缓冲区等这些都是需要存储在显存中的,因此应仅可能减少其内容的修改。
如果可以,尽可能多物体共用这些资源,这不仅仅可以减少缓存的使用,还可以减少调整渲染状态的次数。
具体例子
最原始的渲染方案,我们可能每个物体都要单独渲染一次,即使不考虑显存大小的问题,我们每次也都要重新设置渲染用的目标数据和状态,还没正式让 GPU 工作,仅设置 GPU 的环境就花费了很多时间。
然后当我们正式启动 GPU,结果因为单个物体的计算量较小,GPU 瞬间就好了,这时又要进入缓慢的准备阶段,让 GPU 一直空等着。
这很类似早期的单道批处理操作系统的问题,IO 时间与处理速度不匹配,所以我们要增加处理速度的时间并减少 IO 的次数。
比如我们可以合并多个物体的渲染数据,并确保他们可以使用同样的着色器和渲染管线状态,从而将它们变成一个完整单一的大型物体。
此时渲染这一个物体依然可以变相实现渲染多个物体的效果,但每个物体间不再有准备时间,GPU 也能跑更长的时间了,CPU 不再需要动不动停下来指挥 GPU 做事,并行能力也大幅提高。
渲染批处理
渲染批处理即是上述优化方案的具体实现。它将有共通属性的多个物体看成同一组甚至同一个,以批为单位进行渲染。
在 Unity 中渲染模型需要两种图形资源,材质+网格:
- 材质包含了常量缓冲区,渲染状态,着色器的数据。
- 网格包含了顶点、索引缓冲区的数据。
物体能被一起渲染,说明他们用到的数据都一样,也因此如果希望物体能被识别为同一批,只要确保他们用到的材质和网格一样即可。
材质的共用
使用纹理图集功能
对于因纹理不同而导致材质差异的情况,可以尝试用该功能将纹理合并成一个,接着只要在网格的 UV 上进行特殊处理即可保留原功能的同时合并材质。
因为 UI 和 Sprite 是自动生成的网格,所以可以自动兼容 Unity 中的图集设置,简单设置就可轻松获得性能优势。
使用 GPU 实例化功能
GPU 实例化是一种特殊的渲染方式,由底层图形引擎提供,可以实现一次显卡调用但自动保留环境的同时多次绘制同一网格,同时会在着色器阶段传递这些网格的绘制编号。
利用这些编号做区分我们便可为不同的网格采取不同的绘制数据,从而实现一次调用却好像使用了不同材质多次绘制的效果。
网格的共用
静态批处理
提前自动将选择的多个网格合并成一个“大网格”,所有原本的模型将共享该网格中的顶点索引缓冲区等,这样绘制时只要直接绘制一次这个大网格即可。
当然该网格的渲染也不一定是完全正向的,因为共用一个大网格也意味着没法进行剔除等操作,过多看不见的三角面被渲染,可能导致得不偿失。
动态批处理
和静态批处理的原理一样,但区别是实时的,所以必须每帧都要考虑重新生成用于批处理的大网格,也因此存在性能问题:生成网格的消耗可能比渲染批处理节省的开销要大。
因此只能用于小型网格的合并,主要还是用于对过去旧低端设备进行优化,目前并不是太推荐。
【Unity】图形渲染瓶颈与批处理优化的更多相关文章
- Unity中的批处理优化与GPU Instancing【转】
我们都希望能够在场景中投入一百万个物体,不幸的是,渲染和管理大量的游戏对象是以牺牲CPU和GPU性能为代价的,因为有太多Draw Call的问题,最后我们必须找到其他的解决方案.在本文中,我们将讨论两 ...
- Unity中的GC以及优化
[简介] 常见的 Unity GC 知识点总结出来的思维导图 Unity 官方文档,正巧在博客园发现了已经有位大神(zblade)把原文翻译出来了,而且质量很高~,译文地址 在这里.下面我就可耻地把译 ...
- 面向 Unity* 软件和虚拟现实的优化:运行时生成内容
优化游戏以实现高性能一直是游戏开发过程中的一个重要因素.虽然开发人员一直尝试将硬件推向极致,但当移动游戏成为主流时,优化技术变得尤为突出.Unity* 软件.Unreal* 等常见引擎最初都是面向 P ...
- 浅谈Unity中的GC以及优化
介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据不在需要的时候,存储当前数据的内存就可以被回收再次使用.内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使 ...
- Unity技术支持团队性能优化经验分享
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247490321&idx=1&sn=f9f34407ee5c5d ...
- 【Unity游戏开发】性能优化之在真机上开启DeepProfile与踩坑
一.引子 最近马三入职了新公司,平时除了负责编辑器开发之外还要做一些游戏性能优化方面的工作.在这里首先给大家安利一下Unity官方的性能测试分析工具URP ,这个工具目前是免费,测试的过程中也不需要接 ...
- Unity教程之-UGUI一个优化效率小技巧
无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...
- unity postprocessing stack v2的优化
今天做到33ms了 从45ms 到33ms 后处理占20ms 优化后8ms 去掉两次blit fast mode layer 去掉UI camera 用overlay 层级用sortingorder ...
- 【Unity笔记】常用的优化小技巧
一.当通过GetComponent获取一个组件时,不在Update中每帧进行查找,可在Start中查找一次并用一个私有变量去保存这个组件. public class Test : MonoBehavi ...
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...
随机推荐
- C# 企业微信消息推送对接,实现天气预报推送
C# 企业微信消息推送对接,实现天气预报推送 迷恋自留地 准备工作 需要获取的东西1. 企业Id,2.应用secret 和 应用ID 获取企业id 注册完成后,在我的企业=>企业信息=>最 ...
- Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容
背景:进行程序部署,客户机上原有oracle客户端的版本为2.113.1.0(以下简称113),而数据库.开发机和其他客户机上均采用的2.112.1.0(以下简称112)客户端,所以进行了替换. 卸载 ...
- Redis原理—4.核心原理摘要
大纲 1.Redis服务器的Socket网络连接建立 2.Redis多路复用监听与文件事件模型 3.基于队列串行化的文件事件处理机制 4.完整的Redis Server网络通信流程 5.Redis串行 ...
- Git因换行符不一致导致反复有修改记录
前情 Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理,我公司目前都是基于Git来管理项目代码. 坑位 最近刚刚入职一家新公司,本地环境都配好 ...
- VMpwn总结
前言: 好久没有更新博客了,关于vm的学习也是断断续续的,只见识了几道题目,但是还是想总结一下,所谓vmpwn就是把出栈,进栈,寄存器,bss段等单独申请一块空闲实现相关的功能,也就是说一些汇编命令通 ...
- Windows修改电脑DNS
访问浏览器出现无法访问此页面,找不到DNS地址,则可以通过如下方式修改DNS 按下windows键+R键(两个键一起按) 出现下面窗口 输入control按回车键(Enter键)就会出现下面的窗口 D ...
- Netty系列之Netty安全性
1.1. 严峻的安全形势 1.1.1. OpenSSL Heart bleed漏洞 2014年上半年对网络安全影响最大的问题就是OpenSSL Heart bleed漏洞,来自Codenomicon和 ...
- python 根据中文表头标题抓取动态(表格)文档数据
思路 如图左侧表头标题,要获得右侧数据.网页数据提取成汉字,表格数据间会有空格,用split()分隔成list.用index()查找某个汉字表头位置,输出list下一个位置既是要得到值 text2 = ...
- MySQL数据库驱动mysql-connector-java与数据库版本的匹配
jar包的下载地址:https://dev.mysql.com/downloads/file/?id=477058 之前我的MySQL数据库驱动mysql-connector-java版本号为5.1. ...
- eclipse中汉字横着的问题解决
最近在eclipse中加上中午注释,出现那种汉字是横着的情况,解决方案如下: 方法一: 同一种字体有两种显示方式,比如Fixedsys Excelsior 3.01和@Fixedsys Excelsi ...