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

Unity 性能优化之GPU Instancing(五)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激!

文章目录

  • 前言
  • 一、GPU Instancing使用方法
  • 二、使用GPU Instancing的条件
  • 三、GPU Instancing弊端
  • 四、注意
  • 五、检查是否成功
  • 总结


前言

GPU Instancing也是一种Draw call的优化方案,使用一个Draw call就能渲染具有多个相同材质的网格对象。而这些网格的每个copy称为一个实例(Instancing)。
使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体,从而减少CPU和GPU的开销。
什么是Draw call这章有详细介绍 Unity 性能优化之数据面板(Statistics)(一) ):
Draw Call是指CPU向GPU发送绘制指令的过程,一个Draw Call就是CPU向GPU发送的一组绘制指令,可以绘制出一个或多个物体。

GPU Instancing比较适合场景中有大量重复的网格实例,例如:草、树木、灌木丛 或者大量 重复性物体。

一、GPU Instancing使用方法

要启用GPU Instancing,我们可以选中一个材质,然后在Inspector窗口勾选Enable GPU Instancing,这样就可以了,如下图:
在这里插入图片描述

二、使用GPU Instancing的条件

1、使用相同的材质和网格。
2、材质的着色器必须支持GPU Instancing。例如:标准着色器和表面着色器就支持GPU Instancing。
3、网格的顶点布局和着色器必须相同。如果网格的顶点布局或着色器不同,那么它们就无法被合并成一个实例。
4、每个实例需要有不同的变换信息(例如位置、旋转、缩放)。虽然多个实例可以使用相同的材质和网格,但是它们必须拥有不同的变换信息才能被正确地实例化并渲染出来。
5、GPU Instancing与SRP Batcher不兼容,如果项目使用了SRP Batcher,并且配置为优先使用SRP Batcher而不是GPU实例化,启用GPU实例化可能不会生效。SRP Batcher是Unity提供的一种渲染优化技术,它可以将多个网格合并成单个批次进行渲染,从而提高性能。在这种情况下,GPU实例化将被忽略。

三、GPU Instancing弊端

所有得优化技术都是有利有弊得,GPU Instancing虽然可以减少CPU的开销,优化Draw Call次数,提高性能。但是也会占用内存,所以需要合理使用。

四、注意

1、URP渲染管线中,会发现GPU Instancing没有生效,原因是UPR默认开启SRP Batch,你可以选择关闭它。
2、如果已经GPU Instancing的物体 需要修改实例的一些属性,需要使用MaterialPropertyBlock,也就是通过C#代码来控制,这样可以不破坏GPU Instancing

MaterialPropertyBlock是Unity3D引擎中用于动态修改材质属性的类。它允许在运行时修改材质的属性,而不用重新创建一个新的材质实例。MaterialPropertyBlock可应用于渲染管线的各个阶段,如顶点着色器、片段着色器等,这意味着它可以被用于实现一些高级的渲染效果,如GPU实例化和动态批处理等。
通过MaterialPropertyBlock,开发者可以在运行时修改材质的属性,例如颜色、纹理等,这些修改可以作用于单个对象或者整个场景中的所有对象。此外,使用MaterialPropertyBlock还可以提高性能,因为它避免了重新创建材质实例的开销。
所以MaterialPropertyBlock也是一种优化方案。

五、检查是否成功

以在Profiler窗口看到Instancing信息是否发生变化,如下图
在这里插入图片描述

总结

好记性不如烂笔头
上一章:链接: Unity 性能优化之动态批处理(四)
下一章:链接: Unity 性能优化之遮挡剔除(Occlusion Culling)(六)

http://www.lryc.cn/news/347644.html

相关文章:

  • LeetCode 138. 随机链表的复制
  • 【PC微信小程序点不动处理方法】
  • 量化交易:日内网格交易策略.md
  • Ubuntu 20.04在Anaconda虚拟环境中配置PyQt4
  • charts3D地球--添加航线
  • 变色龙还是树懒:揭示大型语言模型在知识冲突中的行为
  • Android OpenMAX(四)OMX Core
  • 【Linux】轻量级应用服务器如何开放端口 -- 详解
  • git如何查看密码
  • redis脑裂问题
  • 日本率先研发成功6G设备,刺痛了谁?为何日本能率先突破?
  • SpringBoot自动配置源码解析+自定义Spring Boot Starter
  • Kafka 环境配置与使用总结
  • 【算法】滑动窗口——串联所有单词的子串
  • 等保测评安全物理环境测评讲解
  • TensorRT-llm入门
  • TinyXML-2介绍
  • JAVA课程设计
  • 基于SpringBoot+Vue的旅游网站系统
  • http代理ip按流量划算还是个数划算?
  • Banana Pi BPI-F3, 进迭时空K1芯片设计,定位工业级应用,网络通信及工业自动化
  • 安科瑞工业IT产品及解决方案—电源不接地,设备外壳接地【监测系统对地绝缘电阻】
  • 栈:概念与实现
  • 【Linux】查找服务器中某个文件的完整路径
  • windows server 2019 安装 docker环境
  • 【Linux】探索 Linux du 命令:管理磁盘空间的利器
  • Service 和 Ingress
  • C++(类和对象—封装)
  • 如何训练一个大模型:LoRA篇
  • Spring Cloud学习笔记(Nacos):基础和项目启动