Performance
Unia is designed from the ground up to handle extremely large scenes and expansive content. Medium-tier devices such as the: Quest 3, Vega 7, Snapdragon 860+ and Apple M1 are used for performance profiling. Unia's performance for large scenes or complex UI's generally better than Godot and Unity, and aims to work on majority of most modern consumer devices - unlike Unreal.
Batching
Unia uses batching, so all default meshes use a single draw call, this helps with raw GPU throughput. All skinned meshes (avatars) by default also use one single draw call.
Steaming
Textures and geometry are incrementally loaded, this helps with handling VRAM usage for large scenes with a lot of content.
Occlusion and frustum culling
Unia uses compute-driven frustum and occlusion culling. Meshes can be marked as static occluders:
object.occluder = true;
Occluders use their full triangle geometry and their world transform at the time they are registered. They should be low-poly, static meshes. Occluder triangles are double-sided; materials and transparency do not affect the depth-only occlusion pass. An object's nearest bounding-box point must be at least one metre behind the occluder before it can be classified as occluded.
The occluder depth texture can be displayed in the top-left corner from the developer console:
occlusionDebug.showDepth = true;
Set occlusionDebug.depthPower = 1 for raw depth values. The default value of
64 applies a display curve that makes distant depth differences easier to see.
Automatic level of detail (LOD)
Unia dynamically adjusts the level of detail on large objects using meshlets. Distant parts of an object are rendered at lower detail automatically.
To disable LOD on a specific object:
object.LOD = false;
Unia uses MeshOptimizer to handle this efficiently.