Unity: Difference between revisions

From David's Wiki
(Created page with "__FORCETOC__ == Shaders == Unity Shaders are written in HLSL. Unity supports the standard vertex, geometry, fragments shader pipeline. They also have their own variation o...")
 
No edit summary
(6 intermediate revisions by the same user not shown)
Line 4: Line 4:


== Shaders ==  
== Shaders ==  
Unity Shaders are written in HLSL.
Unity shaders are written in [[HLSL]].
Unity supports the standard vertex, geometry, fragments shader pipeline.
Unity supports the standard vertex, geometry, fragment shader pipeline.<br>
They also have their own variation of surface shaders.
They also have their own variation of fragment shaders called surface shaders which automatically handle lighting.<br>
Compute Shaders are useful for doing parallel computation on the GPU.
Compute shaders are useful for doing parallel computation on the GPU.<br>
Results from Compute Shaders can be used on the graphical shaders without being copied back to the CPU.
Results from compute shaders can be used on the graphical shaders without being copied back to the CPU.<br>




=== Compute Shaders ===
=== Compute Shaders ===
To use a compute shader, add a <source enclose="none">ComputeShader</source> reference to your C# script.
To use a compute shader, add a <code>ComputeShader</code> reference to your C# script.
To copy data to and from the GPU, use a <source enclose="none">ComputeBuffer</source>.
To copy data to and from the GPU, use a <code>ComputeBuffer</code>.
You can copy standard floats arrays as well as Unity Vector2, Vector3, and Vector4 structs.
You can copy standard floats arrays as well as Unity Vector2, Vector3, and Vector4 structs.
<--
<!--
Example:
Example:
<syntaxhighlight lang="C#">
<syntaxhighlight lang="C#">
Line 21: Line 21:
</syntaxhighlight >
</syntaxhighlight >
-->
-->
== Optimization ==
=== Loading Files ===
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>
[https://wiki.davidl.me/view/C_Sharp#Multithreading 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 cache a Mesh by caching a struct of vertices, triangles, normals, and tangents.
==References==
* [https://docs.unity3d.com/Manual/index.html Unity User Manual]
* [https://www.udemy.com/course/the-ultimate-guide-to-game-development-with-unity/ Basic Game Dev Course (Paid)]

Revision as of 12:15, 4 October 2019



Shaders

Unity shaders are written in HLSL. Unity supports the standard vertex, geometry, fragment shader pipeline.
They also have their own variation of fragment shaders called surface shaders which automatically handle lighting.
Compute shaders are useful for doing parallel computation on the GPU.
Results from compute shaders can be used on the graphical shaders without being copied back to the CPU.


Compute Shaders

To use a compute shader, add a ComputeShader reference to your C# script. To copy data to and from the GPU, use a ComputeBuffer. You can copy standard floats arrays as well as Unity Vector2, Vector3, and Vector4 structs.

Optimization

Loading Files

All loading of streaming assets should be done in a background thread. See C# Multithreading for more details on multithreading.
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.
Ciela Spike's Thread Ninja may be used to run coroutines in the background when you only need a single, but complex, task.
Much of Unity's API such as new Mesh() and new Texture2D() cannot be called from background threads. I suggest caching textures as byte[] or Color32[] which can then be loaded with Texture2D.LoadRawImageData(). Similarly, you can cache a Mesh by caching a struct of vertices, triangles, normals, and tangents.

References