这节包含VR应用开发在移动开发的独特领域的指南。
早期标题的性能建议
保守性能。虽然两个线程是用于VR应用的,很多安卓系统的问题我们不能控制,性能有比我们可能喜欢的更多的统计特性。一些后台任务偶尔使用GPU。一直逼近限制确实会导致更多的丢帧,并使体验不愉快。
你不能实现图形效果在这些性能约束(人们几年前不能再其他平台上看到)下,所以不要尝试去实现。VR体验来自发生在合成场景中的有趣事情,图形应该主要的尝试不调用对他们自己的注意。
虽然你一直保持60FPS,更多的高质量绘制消耗更多的电能,标题的视觉质量上的稍微改进不会消耗20分钟的电池生命。
保持直接渲染。绘制任何东西到一个视图里,在一个单一的假冒的每个网格中。对于VR重新设置深度缓冲区和多摄像机层的技巧是不好的,不管他们的性能问题。如果几何图形工作不正确--所有东西渲染进一个单一视图--这会导致感知问题在VR中,你应该修复这个设计。
你不能处理大多数的混合因为性能原因。如果你在标题上有续航能力限制,保证特效不要覆盖整个屏幕。
不要使用alpha测试/像素丢弃透明度--别名使用会是可怕的,性能一直是有问题的。alpha覆盖能有帮助的,但是设计一个标题不需要很多的切断几何是更好的。
大多数的VR场景应该用16位深度缓冲区分辨率和2x MSAA构建。如果你的场景主要是用pre-lit来压缩纹理。这儿有一点不同在16位和32位颜色缓冲。
赞成适度的“场景”代替”开放场景“。这是理论和实践上为什么你应该的原因,至少在短期内。第一代的标题应该是关于低挂果实,不是挑战。
看起来最好的场景会是独一无二的纹理模式。你能加载很多纹理--128M的纹理是可以的。和全局照明烧制进纹理,或者数据实际上是真实世界的抽样,你能制作合理的图像逼真场景(一直运行在60FPS立体视图上)。很多低级保真度的对比动态元素可能是不和谐的,所以这是重要的格式上的做决定。
全景照片为场景产生卓越的和有效率的背景。如果你不是太挑剔关于全局照明,允许它们被换出是经常美好的。全景基于图片灯光模式不是实践性能对于整个场景,但是大概是可以的对于特性(不能覆盖屏幕)。
帧率
感谢异步时间扭曲,在GearVR中游览会一直是平稳的和颤抖自由的在60FPS下,无论应用渲染的多快或多慢。这不是意味着性能不再是一个关心的事,改善应用的体验不是完全的保持在60FPS下。
如果一个应用不是一直运行在60FPS下,动画对象移动起伏,迅速转动头部拉取一些黑色在边上,玩家移动不会感觉到平滑,游戏手柄转动看起来特别坏。然而,异步时间扭曲不需要GPU管线空闲和很容易保持60FPS比不使用异步时间扭曲。
绘制任何东西(在视图中是卡住的)会看起来坏的如果帧率没有保持值60FPS,因为它只会在一只眼帧率更新上移动,替换任何视频帧率。不要使头向上显示。如果一些东西需要停留在玩家前面,就像一个漂浮的GUI面板,大部分时间它是静止的,必要时它会快速冲回中心,替换用头方向连续不断的牵引它。
场景
每个场景目标:
1.5W到10W个三角形
2.5W到10W个顶点
3.50到100绘制调用
一个应用可能会渲染更多的三角形通过使用非常简单的顶点和碎片程序,减小透支,减少绘制调用下降到一打。然而,很多小细节和轮廓边可以导致明显的混淆现象尽管MSAA。
对保守派来说它是好的!一个虚拟现实体验的质量不只是由渲染图像的质量决定。低延迟和高帧率是同样重要的在高质量、全沉浸式体验中,如果没有更多的话。
保持一只眼在顶点数量上因为顶点处理不是自由的在一个瓷砖架构的移动GPU上。一个场景中的顶点数量期望在相同的棒球场就和三角形的数量一样。一个典型的场景中,顶点数量不应该超过三角形数量的两倍。减小独一无二的顶点的数量,删除顶点属性对渲染来说这不是必要的。
纹理理想上用每texel4位存储在ETC2格式来改善渲染性能和一个8倍的存储空间减少比32位RGBA纹理。加载到512M的纹理是可行的,但是移动设备有效存储空间的限制需要考虑。为了一个独特的纹理环境在一个有移动性限制的应用中,加载128M的纹理是合理的。
纹理的直接烘焙反射和反光工作的很好为有移动限制的应用。来自动态着色的混淆现象基于反射在凸起的地图表面经常是一个网络消极的在VR中,但是简单的,平滑的形状一直是有益的来自动态反射在一些案例中。
动态阴影的动态灯光通常不是一个好主意。很多好技术需要使用深度缓冲区,它是特别昂贵的在一个瓷砖架构的移动GPUs上。渲染一个阴影缓冲区为一个单一的平行灯光在一个场景中是可行的,但是烘焙灯光和阴影通常产生更好的质量。
为了渲染更多的三角形,尽可能的减少透支是重要的。在透支场景中,它是重要的不透明的几何图形从前到后渲染显著的减少形状数量的操作。场景(只会从一个单一视口被显示)能被静态排序来保证从前到后渲染在一个每三角形基础上。场景(能被观看从多个有利点)可能需要被破碎在合理的几何(会被从前到后动态排序在运行时)块大小.
分辨率
由于主题的失真,在屏幕上的一个像素的感知大小.便利的,高分辨率是在屏幕的中心(它很好),即使是一个2560*1440的屏幕,像素一直是大的对比对一个传统的监视器或移动设备在典型的观看远离。
当前屏幕和主题,中心像素覆盖大约0.06度的视觉弧度,所以你可能希望一个6000像素长波段来包裹360度围绕一个镜头视口。远离中心,示例之间的空隙可能比一个大,所以变频解码应该被建立和被用来避免混淆现象。
通常目的,渲染需要90度FOV至少1500*1500分辨率的眼缓冲区,额外的变频解码的创建。当系统是仅仅能胜任的做这些用不重要的场景在最大时钟频率时,热的约束是这些无法维持。
很多游戏风格3DVR内容应该把1024*1024眼缓冲作为目标。在这个分辨率,像素会是轻微的拉伸的在中心,只仅仅压缩在边缘,所以变频解码是不必要的。入股你有很多性能净空,你能尝试增加这一位来增加好的显示分辨率的高级特性,但是这回消耗电能和性能。
专注于“观察者”应用(电子书阅读器,图片查看器,远程监视器等等)真实想聚焦在最高质量应该考虑使用时间扭曲覆盖物盘子来避免分辨率妥协和失真的双重采样在一个单独的渲染眼视图。使用一个sRGB帧缓冲和源纹理是重要的来避免“边不均匀”效果在高对比区域当示例非常接近最佳分辨率时。