To improve performance when you tessellate a large mesh, use the job system. This prevents the main thread from being blocked for an extended period. When you create a tessellation job, use the MeshGenerationContext.AddMeshGenerationJob API to provide the job handle to UI Toolkit. This ensures that UI Toolkit will wait for the job to finish before accessing the mesh.
If you can quickly calculate the number of vertices or indices, use the main thread to allocate the mesh and add it to the draw sequence. You can do so with the following APIs:
Note: You can add the mesh to the draw sequence at any point during the call to generateVisualContent.
The following example demonstrates a jobified tessellation with allocation on the main thread, where the job performs the actual tessellation.
[!code-cs[(Modules/UIElements/Tests/UIElementsExamples/Assets/Examples/MeshGenerationContext_AddMeshGenerationJob.cs)]
If it’s computationally expensive to calculate the number of vertices or indices, insert a MeshGenerationNode into the draw sequence. Then provide the node to your job, along with a TempMeshAllocator. You can do so with the following APIs:
In this approach, perform the allocation from the job. Use the TempMeshAllocator.AllocateTempMesh to safely allocate a temporary mesh from a job. The MeshGenerationNode.DrawMesh acts like a container for a nested draw sequence that’s populated by the job.
Building on the prior example, the following demonstrates how to perform both the allocation and the tessellation from the job:
[!code-cs[(Modules/UIElements/Tests/UIElementsExamples/Assets/Examples/MeshGenerationContext_InsertMeshGenerationNode.cs)]