首页 > 其他分享 >【Unity】DrawCall 研究随记

【Unity】DrawCall 研究随记

时间:2024-11-29 18:33:03浏览次数:4  
标签:合批 渲染 物体 Batch Unity 调用 DrawCall 随记

参考文档:1. BatchBatchBatch.PDF

参考文档:2. DrawCall,Batches,SetPass calls是什么?原理?【匠】

DrawCall (绘制调用) 是什么

DrawCall就是CPU调用图像编程接口,比如 DirectX 的 DrawPrimitive/DrawIndexedPrimitive ,OpenGL 的 glDrawElement/glDrawArrays,以命令 GPU 进行渲染的操作

简单来讲,就是指 CPU 向 GPU 发送一条指令,用于进行渲染操作。即:DrawCall 就是一次渲染指令调用

Batches (批处理)又是什么

把数据加载到显存,设置渲染状态及数据,CPU 调用 DrawCall 的这一整个过程就是一个 Batch。

这个过程当中主要性能消耗点在于上传物体数据(加载到显存)和设置渲染状态及数据这一块,而不是DrawCall命令本身。

所以我们将多个 DrawCall 合并为一个 DrawCall 来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置)

这个操作就是 Batches 批处理。

什么会造成DrawCall增加

1.无法合批/打断合批

1.Batch Breaker: Texture Change

纹理的更改会造成合批被打断,即:会增加 Batches 的数量,而 Sprite 的更改不会。

解决方法:若要降低 DrawCall ,可使用打包图集的方法。

RawImage 的图片更换则一定会打断合批。

2.Batch Breaker: Transform Change

位置、旋转、缩放、等空间变化的更改会打断合批。

解决方法:在 UGUI 的使用中进行动静分离,以减少 UI 重绘,降低 DrawCall

3.Batch Breaker: Material Change

不同材质的物体也没办法进行合批,会造成合批被打断

解决方法:1.使用材质图集将多个纹理合并为一个纹理,以便多个对象可以使用同一个材质,从而实现合批。

2.使用 Material Property Blocks 进行材质的动态属性修改

示例:
// 获取材质实例
Material instanceMaterial = renderer.material;

// 使用 Material Property Blocks
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
propertyBlock.SetColor("_Color", Color.red); // 修改颜色
renderer.SetPropertyBlock(propertyBlock);

2.透明物体

对于透明物体而言,透明物体必须按照特定的顺序进行渲染,通常是从后到前。这是因为透明物体的混合效果依赖于其后面的物体的渲染结果。因此,透明物体的渲染顺序要求额外的处理

标签:合批,渲染,物体,Batch,Unity,调用,DrawCall,随记
From: https://www.cnblogs.com/pkmoon/p/18054244

相关文章

  • Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)
            CodeMonkey教程:https://www.youtube.com/watch?v=QDWlGOocKm8    Siki学院汉化教程:如何使用Unity开发分手厨房(胡闹厨房)-Unity2023-SiKi学院|SiKi学堂-unity|u3d|虚幻|ue4/5|java|python|人工智能|视频教程|在线课程版本:Unity6模板:3D核心(渲......
  • 【Unity 插件】MiniMonsters - Turn Based Monster Battles快速构建回合制怪物对战游
    MiniMonsters-TurnBasedMonsterBattles是一款专为Unity开发者设计的插件,旨在帮助开发者快速构建回合制怪物对战游戏。该插件提供了一整套完整的系统,包括怪物战斗逻辑、技能系统、回合制战斗管理等功能,使得开发者能够专注于游戏内容的创作,而不需要从零开始编写复杂的战......
  • 【Unity 插件】Lean Touch 快速创建基于触摸的交互功能,适合用于移动端游戏和应用开发
    LeanTouch是一款轻量级且功能强大的Unity插件,专门设计用于实现移动设备上的触摸输入控制,同时也支持鼠标输入。它能够帮助开发者快速创建基于触摸的交互功能,例如平移、缩放、旋转等操作,非常适合用于移动端游戏和应用开发。以下是其详细介绍:功能特点1.多点触控支持支持......
  • 【Unity插件】FPS Animation Framework 专注于为第一人称射击(FPS)游戏提供高质量的动画
    FPSAnimationFramework是一款Unity插件,专注于为第一人称射击(FPS)游戏提供高质量的动画框架和工具。它帮助开发者快速实现流畅、专业的角色动画,适用于单人游戏、多人游戏以及VR项目。以下是详细介绍:功能特点1.高质量动画提供多种预制动画,涵盖FPS游戏中的核心动作:......
  • 【Unity风格化自然场景插件】Green Meadows - Stylized Environment (Built-in) 以低
    GreenMeadows-StylizedEnvironment(Built-in)是一款专为Unity内置渲染管线(Built-inRenderPipeline)设计的风格化自然场景插件,适合打造清新明亮的卡通风格环境。以下是它的详细介绍:插件简介这款插件以低多边形与手绘风格为核心,资源内容丰富,包括植被、地形材质和小型......
  • Unity-波数-杀怪-学习
    学习目标:应用Unity中的AI赋予敌人追击玩家角色的移动控制子弹的生成以及发射敌人的生成以及波数设置Unity的ParticleSystem的简单基本应用LeanTween的简单运用本期主要来源于B站Up小joe老师的教学视频https://www.bilibili.com/video/BV1ia4y1j78A/?spm_id_from=333.999.0.0&v......
  • unity四叉树
    1publicclassQuadTree_12{3//节点内允许的最大对象4privateintmaxObjs=1;56//最大层级7privateintmaxLvl=3;89//当前层级10privateintlvl;1112//当前层级内的对象13privateList<Tr......
  • FreeRTOS学习随记-2
    05-2_创建任务函数的进一步实验创建的任务传入handle,之后通过handle引用任务或者删除任务。空闲任务释放堆和栈同一个函数可以创建不同的任务,因为他们对应的栈不同,每个任务有自己的栈,互不影响如何确定任务需要多大的栈空间需要你研究直播四小时讲解栈任务--定义运行起......
  • FreeRTOS学习随记-1
    1-扩展讲解变量与指针RAM-read/writeROM-readonlymap文件可以看变量的地址和大小不管指针还是普通变量,都是变量,在内存中就需要一个地址存放、const是个常量,在rom中char一个字节指针对于32位处理器来说,他保存的是个地址,所以一定是4字节/32位的,不管他的类......
  • Unity中GameManager的用处
     UnityGameManager是Unity引擎中的一个常见的设计模式,他用于管理游戏中的全局状态和对象。GameManager可以存储和访问游戏中的全局信息,如玩家分数、生命值、游戏困难等等。此外,GameManager还可以管理游戏对象的创建、销毁和更新,比如敌人、道具等。通过使用GameM......