Overview
这是20年另一篇多用户VR的文章。
作者主要通过背景background environment (BE)的缓存复用来减少通信量。考虑到整个BE相似性不高,作者又划分为near BE和far BE。near BE放在client端渲染,far BE前后帧相似性较高,放在Server端渲染,同时客户端缓存和复用。
Challenges
作者基于安卓实现了一个Multi-Furion版本并测量它的性能。发现系统的主要瓶颈在于网络的时延,尤其是多用户带宽不足的情况下。
因此作者提出能够通过单用户间前后帧的相似性、多用户之间的相似性来缓存背景以减小通信量。
Exploiting Frame Similarity
作者通过测量前后帧的BE的SSIM来计算相似度,SSIM大于0.9可以认为是一样的。由左图可以看到,BE之间相似性较低。
同样情况发生在多用户间的相似性。
原因:作者发现在player所处位置附近会有很多objects,不同帧时间objects不同,同时渲染时这些objects会放大,使得相似性降低。而不同帧之间远处的背景相似性很高。作者选取一个位置和划分半径,分为near BE和far BE,进行了SSIM测量,如右图所示,far BE展示出高度一致性。
因此,对于每一个像素点,需要确定划分半径,然后near BE在客户端渲染,far BE在服务器渲染。划分半径需要考虑到应用的渲染需求和客户端的渲染能力。FI指small objects。
需满足:
由于
R
T
F
I
RT_{FI}
RTFI已知且较小,可通过直接测量的
R
T
F
I
=
4
m
s
RT_{FI}=4ms
RTFI=4ms。
因此
接下来需要确定半径满足该限制。比如某个点附近object density更大(渲染难度大)、设备资源不足,则应当减小半径,满足该延时条件。
作者观察到,在某一个小局部区域内,密度相似,渲染半径保持类似,因此可以统一求出一个半径。作者设计了一个启发式算法:
- 从整个背景图开始,随机选取K个点;
- 计算K个点满足条件的最大半径;
- 如果K个点的值相等,则认为这块区域属于一致;否则,划分成四等份重复过程。
最后生成一颗树,树的叶子节点表示一个区域。作者经过实验验证K取10时评估结果相对准确。
因此,far BE下载后将被缓存在客户端,之后可以复用相似的BE。注意这个半径的计算是offline完成的。
以上是同一用户前后帧之间的相似性。下面探讨邻近用户之间的相似性。作者设计了一个实验,通过设计不同的命中规则(严格匹配exact和相似similar),来看缓存命中率。
由V3和V5看到,增加了用户相似性并不会增加命中率,因此作者抛弃这种策略。
Design
这是系统架构图。服务器端准备好了far BE供用户下载,包含编码和发送。客户端下载后,可以缓存在Cache中。由传感器获取位置和操作后,FI和near BE在客户端渲染,far BE由prefetcher决定在缓存中直接取还是去下载。最后将两者合成和播放。这里还涉及到多用户间的FI同步,比如逛博物馆各个人头像的同步,采用unity的PUN。
总的时延包括:
当缓存命中时,客户端可以利用空闲的带宽下载冗余的BE块。
缓存中寻找相似帧BE的步骤包括:
- 对于每个点grid point,计算其dish_thresh的BE frame。这里点应该是指sensor获取到的坐标。(保证位置的相似性)
- 位于同一个叶子节点的帧。(使得半径相同)
- 拥有相同的objects set。(包含的物体一样)
所有符合条件的帧中,选取坐标最相近的帧。确定dish_thresh上,选取同个叶子节点区域上的 l l l个点,计算在该叶子节点对应半径下每个点能达到SSIM大于0.9的最远距离,选取这个区域的最小值作为dish_thresh。
缓存替换方面,选取LRU或FLF。
性能方面,质量达到1080p。帧率60FPS。延迟15.9ms。同时支持4个用户。