Skip to main content
Version: 1.0

Advanced Android Thread Performance

Projects created with the Snapdragon Spaces Unity package can register threads with the OpenXR Runtime application to improve scheduling priority on Android.

Identifying appropriate priority for threads can help deliver frames quickly and consistently, and improve the XR experience.

By default, the Snapdragon Spaces Unity plugin will identify the Unity main thread and render thread to the OpenXR Runtime application without any action needed by the developer.

The SpacesThreadUtility class exposes a single method to developers: public static void SetThreadHint(SpacesThreadType threadType). This can be used to identify other developer-created threads.

This method must be called from the thread that should be registered. It should be called as early as possible in the lifetime of that thread for best results.

Four thread types are defined:

  • SPACES_THREAD_TYPE_APPLICATION_MAIN
  • SPACES_THREAD_TYPE_APPLICATION_WORKER
  • SPACES_THREAD_TYPE_RENDERER_MAIN
  • SPACES_THREAD_TYPE_RENDERER_WORKER

Assigning any of the first three thread types SPACES_THREAD_TYPE_APPLICATION_MAIN, SPACES_THREAD_TYPE_APPLICATION_WORKER, SPACES_THREAD_TYPE_RENDERER_MAIN currently has no affect on scheduling priority.

Threads assigned SPACES_THREAD_TYPE_RENDERER_WORKER will be scheduled with a higher priority than other threads.

In practice, these threads will yield less often and spend more time executing code.

Developers should use this sparingly. It is recommended that developers benchmark the performance change of identifying threads in this way themselves.

There is a small overhead to registering a thread with the OpenXR Runtime application, so this may not be appropriate for extremely short-lived threads.

Identifying non-rendering threads as SPACES_THREAD_TYPE_RENDERER_WORKER could adversely affect the XR experience by taking priority away from rendering threads and can cause decreased FPS, increased latency, reduced stability etc.