Unity: Difference between revisions
| (4 intermediate revisions by the same user not shown) | |||
| Line 23: | Line 23: | ||
All loading of streaming assets should be done in a background thread. See [https://wiki.davidl.me/view/C_Sharp#Multithreading C# Multithreading] for more details on multithreading.<br> | All loading of streaming assets should be done in a background thread. See [https://wiki.davidl.me/view/C_Sharp#Multithreading C# Multithreading] for more details on multithreading.<br> | ||
I've found that Unity's job system doesn't perform as well as C#'s ThreadPool when stressed with thousands of small tasks so I recommend using C# APIs over Unity APIs whenever possible.<br> | I've found that Unity's job system doesn't perform as well as C#'s ThreadPool when stressed with thousands of small tasks so I recommend using C# APIs over Unity APIs whenever possible.<br> | ||
[https:// | [https://assetstore.unity.com/packages/tools/thread-ninja-multithread-coroutine-15717 Ciela Spike's Thread Ninja] may be used to run coroutines in the background when you only need a single, but complex, task.<br> | ||
Much of Unity's API such as <code>new Mesh()</code> and <code>new Texture2D()</code> cannot be called from background threads. I suggest caching textures as <code>byte[]</code> or <code>Color32[]</code> which can then be loaded with [https://docs.unity3d.com/ScriptReference/Texture2D.LoadRawTextureData.html <code>Texture2D.LoadRawImageData()</code>]. Similarly, you can | Much of Unity's API for GPU assets such as <code>new Mesh()</code> and <code>new Texture2D()</code> cannot be called from background threads. | ||
I suggest caching textures in system memory as <code>byte[]</code> or <code>Color32[]</code> which can then be loaded with [https://docs.unity3d.com/ScriptReference/Texture2D.LoadRawTextureData.html <code>Texture2D.LoadRawImageData()</code>]. Similarly, you can hold a Mesh in system memory by using a struct of vertices, triangles, normals, and tangents. | |||
===Instancing=== | ===Instancing=== | ||
If you need multiple instances of the same object, make sure that the material is instanced so that all objects only consume one draw call.<br> | If you need multiple instances of the same object, make sure that the material is instanced so that all objects only consume one draw call.<br> | ||
See [https://docs.unity3d.com/Manual/GPUInstancing.html Unity: GPUInstancing].<br> | See [https://docs.unity3d.com/Manual/GPUInstancing.html Unity: GPUInstancing].<br> | ||
Do not attach scripts to thousands of objects. Instead use one script | Do not attach scripts to thousands of objects. Instead use one script to control all instanced objects.<br> | ||
====Merging Meshes==== | ====Merging Meshes==== | ||
| Line 37: | Line 38: | ||
Be aware of the limitations of using a single draw call though; transparency can become tricky. | Be aware of the limitations of using a single draw call though; transparency can become tricky. | ||
After merging a mesh, you can use a compute shader to animate and move the objects instead of using Unity scripts. | |||
The compute shader edits a single compute buffer which can be read by your vertex or geometry shader without passing data back to the CPU. | The compute shader edits a single compute buffer which can be read by your vertex or geometry shader without passing data back to the CPU. | ||