网格和材质是 Unity 中的托管 C# 对象,这表示您无法从 Burst C# 代码中使用它们。这意味着,要在 BRG 绘制命令中使用它们,必须预先向 BRG 注册。
要注册网格和材质对象,请分别使用 BatchRendererGroup.RegisterMesh 和 BatchRendererGroup.RegisterMaterial。这些函数分别返回 BatchMeshID 和 BatchMaterialID,它们为包含 Burst 兼容句柄的普通数据结构。它们属于强类型,有助于防止意外使用错误的句柄类型。
可以随时注册网格和材质对象(包括运行时)。唯一的要求是:
如果不再需要网格和材质对象,也可以取消注册它们。在卸载任何网格或材质对象时,这是必要的操作。BatchRendererGroup.Dispose 会自动取消注册所有已注册的资源。
注意:BatchMeshID 或 BatchMaterialID 无法序列化。它们仅在注册的 BatchRendererGroup 中有效,如果取消注册或 BatchRendererGroup 不再存在,则它们将无效。如果强制 Unity 卸载网格或材质对象(当 Unity 卸载网格或材质对象所属的场景时,就会发生这种情况),BatchMeshID 和 BatchMaterialID 也会无效。
可以多次注册相同的网格或材质对象。这可以让您在注册网格或材质时无需确认哪些网格和材质已被注册。在这种情况下,BatchRenderer 会通过以下方式在内部记录注册数量:
注意:BRG 会检查在一帧中的第一次 OnPerformCulling 回调之后对网格或材质对象所做出的修改。这意味着 Unity 会考虑在该点之前进行的任何修改。其中包括您在第一次回调中所做的更改,但不包括回调在任何作业中安排的修改。在此点之后修改网格或材质对象会引发未定义行为。
请参阅以下代码示例,了解如何向 BatchRendererGroup 对象注册网格和材质。此代码示例基于初始化 BatchRendererGroup 对象中的示例。
using System;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.Rendering;
public class SimpleBRGExample : MonoBehaviour
{
public Mesh mesh;
public Material material;
private BatchRendererGroup m_BRG;
private BatchMeshID m_MeshID;
private BatchMaterialID m_MaterialID;
private void Start()
{
m_BRG = new BatchRendererGroup(this.OnPerformCulling, IntPtr.Zero);
m_MeshID = m_BRG.RegisterMesh(mesh);
m_MaterialID = m_BRG.RegisterMaterial(material);
}
private void OnDisable()
{
m_BRG.Dispose();
}
public unsafe JobHandle OnPerformCulling(
BatchRendererGroup rendererGroup,
BatchCullingContext cullingContext,
BatchCullingOutput cullingOutput,
IntPtr userContext)
{
// This simple example doesn't use jobs, so it can return an empty JobHandle.
// Performance-sensitive applications should use Burst jobs to implement
// culling and draw command output. In this case, this function would return a
// handle that completes when the Burst jobs finish.
return new JobHandle();
}
}
在创建任何使用已注册的网格和材质的绘制命令之前,需要提供用于绘制命令实例的数据,例如变换矩阵。为了向每个实例提供要使用的数据,BatchRendererGroup 会使用一种称为“批次”的概念。有关更多信息,请参阅下一个主题:创建批次。