引自映维网 :
Oculus最近发布了一个关于如何优化VR体验的新指南,其中还包括开发者在寻找和解决VR性能问题时需要注意的常见错误。 VR开发者执着于确保自己的Rift体验维持在90fps以上的帧率,而他们有充分的理由需要这样做。尽管很大程度上是因为这是提供舒适观影体验的最低标准(低于这一标准可能会造成用户头晕恶心),但如果开发者的Rift体验无法持续维持在90fps或以上,他们的应用根本就无法在Oculus Store上发行。
为了帮助在游戏过程中无法达到标准的应用,Oculus推出了一系列的辅助性解决方案,包括异步时间扭曲和异步空间扭曲。这两者在本质上都是为了弥补当计算能力不足而出现的帧率下降。然而,这仅仅只是辅助性手段,无法解决底层的优化问题。为此,Oculus表示开发者需要投入足够的时间来确保应用从一开始就能满足标准。这份指南专为应用和游戏引擎开发者设计
由于众所周知的原因,我将这份指南人肉搬运过来,此为第一部分,虽然是Oculus家出品,但是对于其它VR平台也有借鉴意义,尤其是Unity 和HTC VIVE。
如下,文末附中文学习笔记思维导图:
Guidelines for VR Performance Optimization
This section covers the general principles that you should follow in order to effectively optimize your VR applications.
Overview
Optimizing VR applications can be challenging. It is easy to go down the wrong path, and end up optimizing code that doesn’t improve the overall performance of your application. Because of this, you need to identify and focus in on where the bottlenecks really are, and optimize those sections first.
VR performance issues are generally of two types: CPU issues and GPU issues. The CPU tends to be involved with manipulating the model and the camera view, and generating the scene to be rendered. The GPU tends to be involved with generating textures and shading for the meshes in your scenes. It is important to discover whether an optimization problem is due to CPU load or GPU load, and to optimize your code accordingly.
In general, you follow Amdahl’s Law for parallel programming: Optimize the sections that are utilizing the system the most. Focus on the big expensive code paths. Don’t focus on issues which, even if you reduce the costs to near zero, you would only achieve minor reductions to the overall performance costs.
It is not uncommon for one area within your application to utilize a large percentage of the system’s processing time, while the remaining areas consume much smaller percentages. You should aim to optimize the larger problem area first.
As you optimize your application, strive to change one thing at a time. Keep in mind that there can be non-trivial interactions between the changes you make, especially with complex VR applications. Ideally, try to locate in your version control software history the single change that caused the performance problem you are experiencing. Then, look for the root cause of the performance issue there. Don’t assume that multiple changes work together to cause a single performance problem.
For many people, it is easy to get a bit pedantic or obsessive about things that don’t matter in terms of bottom line performance. It is usually best to simply consider timing issues: Is the application hitting frame rate? If so, you may not need to further optimize your application, even if your code is not designed as well as would be ideal. Focus on what really counts, in terms of performance issues that impact the user experience.
Techniques for Hitting Frame Rate
With VR, every frame must be typically drawn twice, once for each eye. That typically means that every draw call is issued twice, every mesh is drawn twice, and every texture is bound twice. There is also a small amount of overhead that is required to apply distortion and TimeWarp to the final output frame (approximately 2 ms per frame). Since the Rift refreshes frames at 90 Hz, it can be challenging to hit fame rate consistently.
The following general guidelines can help you to meet frame rate::
Limit each frame to a maximum of 500-1,000 draw calls
Limit each frame to a maximum of 1-2 million triangles or vertices
Use as few textures as possible, although they can be large
Limit the time spent in script execution to 1 ~ 3 ms, for example when running Unity Update()
Systems are full of surprises, so always run a profiler to understand the way your application is using resources.
Don’t optimize too early in the development process. Simplify the code first.
Everything is relative. Compare apples to apples.
Change one thing at a time: resolution, hardware resources, image quality, etc.
Dropped frames are not worth better quality graphics.
Don’t rely on Asynchronous Space Warp (ASW) to hit rendering frame rate. ASW generates intermediate frames based on very recent head pose information, if your application begins to drop frames. It works by distorting the previous frame to match the more recent head pose. While ASW will help smooth out a few dropped frames now and then, applications must meet a consistent 90 frames per second (FPS) to qualify for the Oculus Store.
The CPU tends to be less of a bottleneck on the Rift, when compared with mobile VR devices. If you can maintain 90 Hz on a PC that meets the recommended specifications, that will broaden your reach across all hardware supported by Oculus.
Simple graphics (which are constructed out of relatively few polygons) can often provide just as good of an experience as photorealistic graphics, which typically require significantly more processing in order to render each frame.
Use techniques such as Level of Detail (LOD), culling, and batching.
Cut the shading rate by scaling eye buffers, and using Oculus octilinear rendering (which leverages NVIDIA Lens Matched Shading).
Using blob shadows.
Create your own optimized math when rendering graphical constructs.
Use cheaper projector shadows to save bandwidth.
When you are rendering to the cascaded shadow map, which can cost a lot in terms of bandwidth, consider the resolution and the number of cascades you are using. Try not to use expensive filtering. However, this approach pretty quickly ends up producing lower quality graphics. So you might use projector shadows.
Use baked shading if necessary.
Common Causes of Performance Problems
Performance problems are most commonly caused by the following issues (in order of severity):
Performance ProblemResource Costs
Scenes that require dependent renders, including shadows and reflectionsCPU, GPU
Binding of Vertex Buffer Objects (VBOs) in order to issue draw callsCPU, Graphics Driver
Transparency, multi-pass shaders, per-pixel lighting, and other effects that fill large numbers of pixelsGPU, I/O
Large texture loads, blits, and other forms of memcpyI/O, Memory Controller
Skinned animationCPU
Unity garbage collection overheadCPU
![1199677-c12b3bc078417f30.png](https://i-blog.csdnimg.cn/blog_migrate/115343088dcd546204ac036b6df096f9.webp?x-image-process=image/format,png)