Unity 6.3
0 онлайн 91 гостей 3 в системе
Вход
Оптимизация Шаг 144 из 208

Зарегистрировать меши и материалы с BatchRendererGroup API в URP

Mesh и Material являются управляемыми объектами C# в Unity, что означает, что вы не можете использовать их из Burst C# кода. Это означает, что для использования их в командах рисования BRG, вы должны предварительно зарегистрироваться в BRG.

Чтобы зарегистрировать объекты Mesh и Material, используйте BatchRendererGroup.RegisterMesh и BatchRendererGroup.RegisterMaterial соответственно. Эти функции возвращают BatchMeshID и BatchMaterialIDсоответственно, которые являются простыми структурами данных, содержащими совместимый с Burst манипулятор. Они сильно типизированы, чтобы предотвратить ошибки от случайного использования неправильного типа манипулятора.

Объекты Mesh и Material можно регистрировать в любое время, включая время выполнения. Единственные требования:

  • Вам необходимо зарегистрировать объекты Mesh и Material, прежде чем BatchRendererGroup сможет использовать их для рендеринга.
  • Материал должен поддерживать инстанционирование DOTS.

Вы также можете отменить регистрацию объектов Mesh и Material, если они больше не нужны. Это необходимо, если вы хотите выгрузить любые объекты Mesh или Material. BatchRendererGroup.Dispose автоматически отменяет регистрацию всех зарегистрированных ассетов.

Примечание: Вы не можете сериализировать BatchMeshID или BatchMaterialID. Они действительны только с BatchRendererGroup, в котором вы их зарегистрировали, и становятся недействительными, если вы их отмените, или если BatchRendererGroup больше не существует. BatchMeshID и BatchMaterialID также становятся недействительными, если что-то заставляет Unity выгрузить объекты Mesh или Material, что происходит, когда Unity выгружает Scene, частью которого являются объекты Mesh или Material.

Один и тот же объект Mesh или Material можно зарегистрировать несколько раз. Это удобно, когда нужно регистрировать меши и материалы, не отслеживая, какие из них уже зарегистрированы. В этом случае BatchRenderer ведёт внутренний счётчик регистраций так:

  • Каждый раз, когда вы регистрируете объект Mesh или Material, BatchRendererGroup увеличивает его количество ссылок на 1.
  • Каждый раз, когда вы отменяете регистрацию объекта Сетки или Материала, BatchRendererGroup уменьшает количество его ссылок на 1. Если это приводит к тому, что количество ссылок достигает 0, BatchRendererGroup отменяет регистрацию Сетки или Материала. Если вы хотите использовать Сетку или Материал в будущих командах рисования, вы должны зарегистрировать его снова.
  • Вызов RegisterMesh или RegisterMaterial с уже зарегистрированной сеткой или материалом возвращает тот же BatchMeshID или BatchMaterialID, что и предыдущий вызов. Однако, если BatchRendererGroup полностью отрегистрировал сетку или материал, то при повторной регистрации может быть возвращен другой ID.

Примечание: BRG проверяет изменения объектов Mesh или Material после первого метода обратного вызова OnPerformCulling в кадре. Это означает, что Unity учитывает любые изменения, которые произошли до этой точки. Это включает изменения, которые вы сделали в самом первом обратном вызове, но не изменения, которые произошли в любых заданиях, запланированных обратным вызовом. Изменение объектов Mesh или Material после этой точки вызывает неопределенное поведение.

См. следующий пример кода для примера регистрации мешей и материалов с помощью объекта 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 использует концепцию, называемую пакетами. Дополнительные сведения см. в следующем разделе, Создание пакетов.