【笔记】Oculus最新优化VR体验指南

引自映维网

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


VR性能优化指南
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容