Unity性能优化-DrawCall

1. DrawCall是啥?其实就是对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西。所以,是谁去调用这些接口呢?CPU。比如有上千个物体,每一个的渲染都需要去调用一次底层接口,而每一次的调用CPU都需要做很多工作,那么CPU必然不堪重负。但是对于GPU来说,图形处理的工作量是一样的。所以对DrawCall的优化,主要就是为了尽量解放CPU在调用图形接口上的开销。所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。

2. 优化方式

(1)Draw Call Batching

采用批处理方式,Unity在运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们。

  • 静态批处理:物体不移动,并且拥有相同的材质,静态批处理就允许引擎对任意大小的几何物体进行批处理操作来降低描绘调用。例如:在一个3D场景中,有Cube、Capsule、Cylinder、Sphere这个4个GameObject,注意之间不要有遮挡,另外还有Camera和Direction Light,它的处理前后的统计数据如下:

  • 动态批处理

在这里使用时,遇到了坑,很多资料都没有提及到,在默认情况下,Unity是没有打开的,需要在Player Settings中进行设置的:

用了一个不错的例子来看,

for(int i = 0; i < 500; i++)
{
    GameObject cube;
    cube = GameObject.Instantiate(prefab) as GameObject;
}

动态批处理的结果是非常明显的(塔防游戏中估计能提高不少效率)

DrawCall的动态批处理存在着很多约束,所以默认是关闭的

a.  需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体;

b.着色器使用顶点位置,法线和UV值三种属性,那么你只能批处理300顶点以下的物体;如果你的着色器需要使用顶点位置,法线,UV0,UV1和切向量,那你只能批处理180顶点以下的物体(这个地方不懂);

c.不要使用缩放。分别拥有缩放大小(1,1,1) 和(2,2,2)的两个物体将不会进行批处理

d.统一缩放的物体不会与非统一缩放的物体进行批处理

e.用缩放尺度(1,1,1) 和 (1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1) 和(1,3,1)的两个物体将可以进行批处理

f.使用不同材质的实例化物体(instance)将会导致批处理失败;

g.拥有lightmap的物体含有额外(隐藏)的材质属性,比如:lightmap的偏移和缩放系数等。所以,拥有lightmap的物体将不会进行批处理(除非他们指向lightmap的同一部分)。(什么是lightmap)

h.多通道的shader会妨碍批处理操作。比如,几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道。

i. 预设体的实例会自动地使用相同的网格模型和材质。

原文地址:https://www.cnblogs.com/bearhb/p/11221122.html

时间: 2024-10-07 08:00:04

Unity性能优化-DrawCall的相关文章

Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage collection in Uni

Unity性能优化(2)-官方文档简译

本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 简介 如果游戏运行缓慢,卡顿,我们知道游戏存在性能问题.在我们尝试解决问题前,需要先知道引起问题的原因.不同问题需要不同的解决方案.如果我们靠猜测或者其他项目的经验去解决问题,那么我们可能会浪费很多时间,甚至使得问题更严重. 这时我们需要性能分析,性能分析程序测量游戏运行时的各个方面性能.通过性能分析工具,我们能够透过

Unity性能优化(1)-官方文档简译

本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 简介 性能分析工具可以给我们提供游戏性能表现的详细信息.如果我们的游戏存在性能问题,如低帧率或者高内存占用,性能分析工具可以帮助我们发现问题的起因,并协助我们解决问题. Profiler工具是Unity内置的强大的性能分析工具,本文介绍如何使用它.当我们阅读完本文,并且熟悉Profiler的界面和功能时,我们可以继续学习怎么使用它对不同类型的性能问题进行诊断. Profiler可以给我们提供,

Unity性能优化专题—腾讯牛人分享经验 (难度1 推荐3)

原文地址: 腾讯游戏开发者平台 之前因为老大要求,要把unity最终发布的包压缩到至少之前大小的一半,这可难倒我了,不过最终还是在问了很多大神后解决了,主要是在本文章中讲的"二". tag: unity素材压缩.unity资源压缩.unity压缩包大小.unity怎么节省空间 这里从三个纬度来分享下内存的优化经验:代码层面.贴图层面.框架设计层面. 一.代码层面. 1.foreach. Mono下的foreach使用需谨慎.频繁调用容易触及堆上限,导致GC过早触发,出现卡顿现象. 特别

unity性能优化

1. CPU Usage A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 B. Overhead: Profiler总体时间-所有单项的记录时间总和.用于记录尚不明确的时间消耗,以帮助进一步完善Profiler的统计. C. Physics.Simulate: 当前帧物理模拟的CPU占用时间. D. Camera.Render: 相机渲染准备工作的CPU占用量 E. RenderTexture.SetActive: 设置RenderTextu

Unity性能优化之 Draw Call原理&lt;转&gt;

Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如何组成三角形),变换(就是物体的位置.旋转.缩放.以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像. 在Unity中

Unity性能优化——LOD技术

LOD,中文名多层次细节,是游戏中最常用的技术,它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.今天我们来实现使用它来做一个简单的优化例子. 我们没有模型(程序员的悲哀)就用Particle粒子特效来做试验吧.在场景中建立一个空物体,取名LODEffects,在空物体下面建立一个Particle并复制两份都做为子物体.这们用这三个Particle可以当作不同细节的模型,分别调整它们的ParticleSystem组件下Emission的Ra

Unity内存优化

对项目优化有很多,如:mesh合并,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等. 优化: 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式. 2.对于透明贴图,我们只能选择RGBA 16bit 或者RGBA 32bit. 3.减少FPS 在ProjectSetting-> Quality中的VSync Count 参数会影响你的FPS,EveryVBlank相当于FPS

Unity内存优化(贴图层面)

聊聊近况: 距离上一篇文章已经过了好久,主要原因是我懒了.公司项目也到了开始优化的阶段,上网找的资料,看过了就忘.还是想把它整理一下,写出来.其实我说的东西,网上都有,我只是搬运工而已. 贴图压缩: Android平台使用ETC1格式压缩. 目前主流的Android机型基本都支持ETC1格式压缩.但ETC1只能支持非Alpha通道的图片压缩. 所以一般把RGB和ALPHA分离出来,r值,g值,b值从RGB图获取,a值从Alpha图里获取. 随着OPENGL ES 3.0的发布,etc2也出了,支