Unity中Batching优化的GPU实例化(1)

文章目录

  • 前言
  • 一、GPU实例化的规则
    • 1、网格一样,材质一样,但是材质属性不一样
    • 2、单个合批最大上限为511个对象
    • 3、只有OpenGL es 3.0及以上才支持(3.0及以上有部分硬件可能也不支持)
  • 二、GPU实例化的应用场景
    • 1、公开几个成员属性,用于存放可以调整的数据
    • 2、用Random.insideUnitCircle随机生成一个单位圆内2维变量来作为我们模型的 xz 坐标
    • 3、我们在Start中,使用 Instantiate(Prefab,pos,Quaternion) 结合循环来生成大量重复网格
    • 在这里插入图片描述 300顶点以上(无法合批,一个板凳一个批次): ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c17793570b65400f8242b16c3f0ab993.png)
  • 三、测试代码


前言

在之前的文章中,我们解析了 Batching 优化中的 动态合批 和 静态合批。在这篇文章中我们来做一下 GPU实例化测试之前的准备

  • Unity中Batching优化的动态合批
  • Unity中Batching优化的静态合批

一、GPU实例化的规则

1、网格一样,材质一样,但是材质属性不一样

2、单个合批最大上限为511个对象

3、只有OpenGL es 3.0及以上才支持(3.0及以上有部分硬件可能也不支持)


二、GPU实例化的应用场景

GPU实例化主要应用于大量网格生成的情况

我们先在Unity中,实现一下大量生成网格

1、公开几个成员属性,用于存放可以调整的数据

public GameObject Prefab;
public int Count = 1;
public int Range = 10;

2、用Random.insideUnitCircle随机生成一个单位圆内2维变量来作为我们模型的 xz 坐标

  • 乘以Range 使得我们的模型离散开一点

Vector3 pos = Random.insideUnitCircle * Range;

3、我们在Start中,使用 Instantiate(Prefab,pos,Quaternion) 结合循环来生成大量重复网格

for (int i = 0;i < Count;i++)
{
Vector3 pos = Random.insideUnitCircle * Range;
Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);
}

  • 我们测试一下300顶点以下模型 和 300顶点以上模型生成后的Batch

300顶点以下(合批成了一个批次):

Unity中Batching优化的GPU实例化(1)_第1张图片
300顶点以上(无法合批,一个板凳一个批次):
Unity中Batching优化的GPU实例化(1)_第2张图片

三、测试代码

using UnityEngine;

public class P2_6_4 : MonoBehaviour
{
    public GameObject Prefab;
    public int Count = 1;
    public int Range = 10;
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0;i < Count;i++)
        {
            Vector3 pos = Random.insideUnitCircle * Range;
            Instantiate(Prefab,new Vector3(pos.x,0,pos.y),Quaternion.identity);
        }
    }
}

你可能感兴趣的:(Unity,unity,游戏引擎)