GoogleVR Daydream Nexus 6P Performance

First post. Be Gentle.

We’re currently using Unreal 4.12.3 and a Nexus 6P to render a scene that appears to be suffering performance issues. Some information about the current scene

  • 180k Triangles
  • less than 100 draw calls
  • r.MobileContentScaleFactor=0 in DefaultDeviceProfiles.ini ]
    - Reallocating scene render targets to support 2392x1440 (Frame:2).
  • Mobile HDR off
  • There are two lights in the scene. Neither light is set to cast shadows.

With the above information, I am getting an average of about 11 FPS. The information reported in STAT UNIT is Game 13ms, Draw 99ms.

Resetting the content scale factor to the default values, performance improves but the visual quality suffers

  - Reallocating scene render targets to support 1196x720 (Frame:2).

The information reported in STAT UNIT is Game 10ms, Draw 30ms.

My question is, since these results are happening on the hardware, how do I go about debugging this? We have already used the merge actor tool to combine similar objects in the scene. The triangle count and draw calls are below the suggested values for mobile development. What can I do to find out where the bottle neck is, and what steps can I take to resolve it.

Thanks.

For anyone coming across this thread, here is the information I was able to find out in no particular order

Thermal Throttling

With the Nexus 6P, we’ve noticed that you almost invariably get thermally throttled nearly immediately after starting the game, which destroys performance. The characteristic you will notice is that the game runs well for a while, then gets worse performance. Waiting for the kit to cool down ( or putting it in the freezer for a few minutes ) returns it to good performance for a short period of time.

Draw Calls

We were going by some unreal documentation for mobile development that suggested < 500 draw calls per scene. Asking around, the suggestion for VR is closer to 50 draw calls per scene. We have not found any documentation to back up that number, but reducing content will generally benefit the GPU, since we are currently GPU bound.

Draw calls can be reduced by combining actors and simplifying materials. Combine as many materials as possible, and make sure to make heavy use of instanced static mesh components. On PC, there’s some potential in trying to automatically batch these things together, but on mobile, the cost is too high.

The other thing that you may consider doing is using cull volumes to ensure that non-visible rooms are completely culled out when outside of them. Unreal occlusion is slightly more liberal in what it chooses to draw, and cull volumes help make it a bit more conservative in those choices. Additionally, you can toggle visibility on actors (or entire sublevels) to get the same effect, if your content is built like that.

Another important thing to remember is that if something is alpha’d to zero, it may still be drawn! So, if you don’t want to render it, be sure to actually hide it to prevent it from being rendered.

Unreal Settings

And are you using Scanline Racing along with arm64? The delta in performance without those is pretty massive.

note: This requires NDK r11c, and at least API 21
note: you can only have one build type enabled at a time, or it will cause an error

Enable this setting - Edit > Project Settings > Platforms > Android > Build > Support arm64
Disable this setting - Edit > Project Settings > Platforms > Android > Build > Support armv7

Enable this setting - Edit > Project Settings > Platforms > Android > Advanced APKPackaging > Configure GoogleVR for low-latency rendering mode ( scanline racing )

Profiling

For profiling on the device, the preferred method is to capture on the device, and then copy back to the PC. Use “stat startfile” and “stat stopfile” on the console (4-tap). This will write a .ue4stats file on the sdcard under /sdcard/UE4Game/[you project]. The exact path is written to the logcat. Copy this back to your PC and open it in the profiler tab in the session frontend.