• 天津税务:推进“一制三化”审批制度改革_ebookpk 2018-11-26
  • Обычаи и нравы района Лунгун_爱的怒放 2018-11-26
  • 主持人资料库——黄健翔_冰箱冷笑话 2018-11-26
  • 苹果为新款iPhone提供备选丢失/盗窃保险计划_北美华文新闻 世界 2018-11-26
  • 银联卡小额免密限额提至1000元 默认开通合理吗?_情沦杏花村 2018-11-26
  • Empresas estrangeiras veem Cintur?o e Rota como oportunidade de desenvolvimento_中央反义词 2018-11-26
  • [视频]中文友好掀开新篇章——文莱各界高度评价习近平主席访问_完美世界高手5200 2018-11-26
  • 魅力西宁:暖风吹过记忆里的河湟老街_鸣护艾丽莎 2018-11-26
  • 法国28万人示威反对油价上涨 逾200人受伤_纵惯线 2018-11-26
  • 宫品仁油画、陈雁秋摄影作品展在太原开展_981 2018-11-26
  • 华为Mate9要来了 邀请函确定11月3日德国发布_团聚的反义词 2018-11-26
  • 败走茨城 权健失利不失信心_七雄争霸手机版 2018-11-26
  • 多为年轻选手创造条件(体坛观澜)_bydf0 2018-11-26
  • 西安市场主体井喷增长 今年新登记市场主体突破23万户_qqsecure 2018-11-25
  • 比特币这座楼要塌?价格跌破4300美元,今年已跌掉65%_奥巴马踢门 2018-11-25

    Oculus详述『延迟』问题及对应『帧渲染』解决方案

    2019-04-25 17:55:12 映维网 分享

    贾治邦简历 www.powere.cn 查看引用和消息源请点击:映维网

    理解CPU和GPU是如何同步渲染帧是实现最佳性能的关键

    映维网 2019年04月12日)对于延迟,不同的人有着不同的衡量方法。例如,从按下按钮到解码器予以识别的时间;从系统渲染一阵到屏幕进行显示的时间等等。Oculus的测量方法则是,从游戏逻辑采样预测追踪到利用这一游戏状态渲染的一帧呈现在屏幕中的时间。

    对于传统的游戏帧,一开始都是采样输入,执行所有逻辑更新,将所有对象渲染到??;然后,用前置缓存交换后置缓存,从而在屏幕显示全新的一阵。对于为传统显示器设计的游戏,它们可能会尝试维持稳定的帧速率,如30fps或60fps。但丢失的一帧通?;岜缓雎?,因为游戏中的camera位置和旋转与真实世界的显示器位置和旋转隔离。对于VR,丢帧会对用户的舒适度产生严重影响,因为只要渲染世界与现实世界不匹配,沉浸幻觉就会被打破。所以,Oculus提供了一个名为异步时间扭曲(Asynchronous TimeWarp)的系统,利用最近渲染的一帧,并在屏幕显示之前对其进行修改,从而令眼睛视图尽可能接近相应的真实世界方向。

    这意味着Oculus的渲染管道存在略微的不同。帧更新循环的第一部分仍然相同:查询输入,更新游戏逻辑,然后渲染场景。但接下来,系统不再是交换缓存,而是在渲染时将帧,以及视图姿态提交给异步时间扭曲,这样系统就可以在最后一刻进行修改以匹配更新的视图姿态。时间扭曲的巧妙之处在于丢帧发生时的情形。时间扭曲并不只是将显示器锁定在最后渲染的内容,它会利用前一帧,但执行与更新视图姿态相同的逻辑,这样即便世界的时间状态已经发生改变,你的视图都能匹配真实世界。

    1. VSync & Virtual VSync

    垂直同步(VSyncl;Vertical Sync)又可以称为“帧同步(Frame Sync)。这种系统已经出现多年时间,而游戏引擎主要是用它来匹配物理显示器的刷新率。对于VR,由于显示器的实际绘制交给了异步时间扭曲,所以它同时负责VSync。每一阵都需要固定的时间量,所以如果从这一点开始计算,我们可以定义所谓的Virtual VSync(V-VSync),亦即所有游戏处理都可以围绕它进行。

    请参阅上面的时间表,它暂时忽略了游戏过程。你可以看到,对于每一帧时间扭曲都需要少量的CPU时间,然后在运行VSync时需要一段GPU时间。因此,在运行V-VSync时游戏必须确保帧可供使用,以便时间扭曲能够处理它们。这当然只是一个简化的模型,目的是为了介绍时间扭曲所需的处理。

    2. Simplest Game Loop

    最简单的游戏循环都有一个执行游戏逻辑的CPU线程:将渲染命令发送到GPU,然后调用SubmitFrame,亦即等待下一个V-VSync。类似下图:

    如你所见,游戏逻辑和渲染发生在一帧长度之内,而且时间扭曲能够立即使用渲染帧。从游戏角度来看,这将涉及最低的延迟。如果你的GPU没有及时完成渲染,时间扭曲将不得不使用最后一帧,并导致渲染帧被丢弃。因为下一帧的CPU工作可以在当前帧的GPU工作仍在运行时运行,所以最终你可能是以全帧速率运行,但会出现多个过时帧。因此,与实际帧速率相比,过时帧的数量是更重要的监控度量。

    更糟糕的事情是,GPU渲染时间超过下一个V-VSync。前一帧需要重复使用两次,而下一帧的SubmitFrame调用会被阻止,直至当前帧完成渲染。这为GPU赶上CPU提供了时间,但同时意味当N+1帧最终显示时,这将出现一整帧的延迟。

    事实证明,在一个VSync的正常范围内执行全帧渲染是非常难以实现的目标,因为CPU时间、GPU时间加起来需要不到一?。ㄈ?2hz时是13.89ms,60Hz时是16.67ms)。实际上,几乎每款游戏都需要更多的时间。因此,Oculus API支持一种名为“Extra Latency Mode(额外延迟模式)”的功能。额外延迟模式令错过这一小窗口变成预期的行为,并始终使用为前一帧提交的帧。所述模式的图例如下所示:

    这样做的最大优势是,你可以为CPU和GPU利用完整一帧,所以你可以接近于实现100%的利用率。当然,缺点是丢失一帧延迟。Oculus认为,这样的权衡折中非常值得,乃至于Unity或Unreal 4都默认开启额外延迟模式.

    如果一切都按时运行,结果当然是显而易见,但如果CPU或GPU需要更长的时间才能完整帧的渲染呢?实际上,GPU的情况与这样一种情况非常类似:当一帧需要两个以上的V-VSyncs完成渲染时,额外延迟模式没有启用。迟到的一帧将导致下一帧的SubmitFrame调用被阻止。正如在关闭额外延迟模式时的情况一样,当回到预期的帧周期时,你将呈现至少3个高延迟?。ㄇ耙桓鲋馗粗?,当前帧和下一?。?。所以,避免GPU运行过长时间对游戏的流畅度而言至关重要。

    CPU的情况没有那么多问题。在启用额外延迟模式时,在V-Vsync返回后立即调用SubmitFrame(假设前一帧已经准备就绪)。例如:

    如你所见,果CPU花费的时间继续超过帧时间,GPU最终将花费过长的时间,而SubmitFrame会被阻止。但如果CPU时间减少,游戏将恢复,应用程序将永远不会丢失帧。

    声明:本站部分资源来源于网络,版权归原作者或者来源机构所有,如作者或来源机构不同意本站转载采用,请通知我们,我们将第一时间删除内容。本站刊载文章出于传递更多信息之目的,所刊文章观点仅代表作者本人观点,并不意味着本站赞同作者观点或证实其描述,其原创性及对文章内容的真实性、完整性、及时性本站亦不作任何保证或承诺,请读者仅作参考。
    编辑:
    恒兴烧坊酒 | 张家界代孕 | 青岛怀孕 | 吉林来孕 | 高鹰代孕 | 高鹰代孕 | 奇侠小说网 | 金洁妈妈网 | 大话健康网 | 乐清新闻资讯网 | 想找大学生代生孩子 | 给别人生小孩 | 我想替人生小孩 | 福州代孕网 |