基于抽帧控制和时间同步算法的远程显示降延迟方法与流程

文档序号:20916547发布日期:2020-05-29 13:35阅读:431来源:国知局
基于抽帧控制和时间同步算法的远程显示降延迟方法与流程

本发明属于内网环境下远程画面传输显示技术领域,具体涉及一种基于抽帧控制和时间同步算法的远程显示降延迟方法。



背景技术:

远程显示技术,是指经由网络将图像内容从远端设备(pc主机)提供给显示器并加以呈现的方法,该方法能够充分调动和利用资源,能够极大程度上降低客户端使用时受时间、空间的限制,降低对本地硬件的依赖,所以在云计算服务领域变得日益流行起来。

远程显示先后要经历抓屏、画面编码、网络传输和画面解码的过程,每一个环节均有时间开销,其中还存在着误差和阻塞,考虑到在一些特殊场景下,操作者对画面即时响应的要求非常高(如进行第一人称射击游戏),为使操作者感觉不到明显迟滞,这就要求远程显示的整体延时越低越好。目前主流的利用远程显示技术的相关产品都是通过外网进行图像传输,在绝大多数的网络环境下天然有着较大的延时(50ms左右),而图像传输所需的编解码能力可以通过两端选用高性能硬件并优化编解码技术方案得以提升,总体能控制在3.5ms左右,前者远大于后者。这种情况下,网络因素成为影响远程显示画面效果和操作反馈的主要原因,所以网络优化是此类产品当前的主要改进方向。

现有的远程系统中对图像传输采用的优化技术通常有如下两大分类:

(1)利用操作系统自身的特点,发送的图像数据为该系统绘图指令或是控件矢量描述信息。该技术因需依赖底层操作系统的实现,因此通用性不强,如windows的rdp,被控端现仅只有windows支持;同时对于无法用简单的绘图指令或是矢量信息描述的图像信息,例如网页中的图片和视频等,如果不结合视频压缩算法其传输的数据量将非常大,因此这类应用通常仅适用于内网等宽带应用场景下。

(2)利用通用的视频压缩算法如h.264、h.265等对图像进行压缩。这些算法通常将图像数据划分为特定大小的分块,然后将待压缩帧与关键帧i帧或是前向帧p帧查找出其帧间运动矢量,但因桌面清晰度通常比较高,因而记录分块运动矢量的数据也比较大;同时i帧通常是固定时间序列来确定,也既是相隔固定帧后将该帧设置为i帧,而远程桌面的背景变化无法由时间确定,以上这些都会导致如浏览网页上下滚动、窗口最大最小化时,图像压缩率效果差。

相比之下,当网络选择通过局域网传输时,网络延时可以控制在1ms左右,也就是说理论上总体延迟在5ms以内。但实际上延迟比这高很多,因为上端的数据还需要考虑一项,即显示器的延迟;以60hz的显示屏为例,60hz屏的意思是屏幕的图像每1秒钟重绘60次,也就是每16.6ms刷新1次,那对于主机端抓屏来说,每隔16.6ms才能抓取到主机的图像数据,对客户端同样如此,每隔16.6ms才能更新图像到显示屏上。当客户端解析完毕接收的画面数据,而显示屏没有到达下一次刷新的时间点、或是已经错过了上一次刷新的时间点,这就会带来强制的等待延迟(阻塞时间);而根据主机和客户端的刷新间隔,延迟情况也不一样,哪怕编解码时间很短,最大的延迟时间也有可能达到20ms。



技术实现要素:

鉴于上述,本发明提供了一种基于抽帧控制和时间同步算法的远程显示降延迟方法,在网络传输和编解码技术耗时较低的前提,使得整体的远程显示延迟达到和本地显示近乎一致的水平。

一种基于抽帧控制和时间同步算法的远程显示降延迟方法,具体地:首先保证主机端有足够数量的备选帧即要求主机端刷新频率n1大于客户端刷新频率n2,并通过时间同步算法不断对主机端与客户端之间的时间差diff以及数据传输往返时长rtt进行更新,进而由主机端通过抽帧控制方法从每1秒的n1帧图像中抽取合适的n2帧发送到客户端上。

进一步地,所述抽帧控制方法的具体判断执行过程如下:

(1)若上一帧未被抽取且tnext+tsu<tsh,则主机端抽取当前帧,否则执行下一步骤;

(2)若tel>1/n2,则主机端抽取当前帧,否则执行下一步骤;

(3)若tcur-tpre≥1/n2,则主机端抽取当前帧,否则执行下一步骤;

(4)若tcur+tel<tsh且tnext+tel>tsh,则主机端抽取当前帧,否则判断下一帧;

其中:tnext为主机端下一帧的刷新时间,tsu为提交时间,tsh为显示时间,tel为流逝时间,tcur为主机端当前帧的刷新时间,tpre为主机端上一次抽帧时间。

进一步地,所述显示时间tsh=tsu+阻塞时间,阻塞时间为主机端当前帧抓帧时间到客户端下一帧显示时间的等待间隔。

进一步地,所述提交时间tsu=数据到达客户端时间+客户端解码耗时,客户端解码耗时即客户端解码当前传输过来的一帧图像数据所耗费的时间。

进一步地,所述数据到达客户端时间=主机端开始传输数据的本地时间t1+主机端抓屏耗时+diff+tel,主机端抓屏耗时即主机端调用相应api接口抓取一帧当前画面的耗时。

进一步地,所述流逝时间tel=主机端编码耗时+rtt/2,主机端编码耗时即主机端编码当前所接收到的一帧图像数据所耗费的时间。

进一步地,所述时间同步算法的具体实现为:对于主机端与客户端之间传输的每一帧数据,采集主机端开始传输数据的本地时间t1、客户端收到数据的本地时间t2、客户端开始回传数据的本地时间t3以及主机端收到数据的本地时间t4,并计算本次数据传输往返时长rtt=(t4-t1)-(t3-t2)以及主机端与客户端之间的时间差diff=t2-t1-rtt/2;考虑到主机端和客户端的晶振误差,若晶振误差会导致diff每n秒累计漂移1毫秒且系统允许diff的计算误差为m毫秒,则要求系统每n×m秒更新一次rtt和diff;若时间同步报文的频率为x赫兹即每1/x秒钟主机端与客户端进行一次时间同步报文的传输,则每n×m秒内会有n×m×x组关于t1~t4的时间数据,取这n×m×x组中t2-t1值最小的一组时间数据,并利用该组时间数据计算更新rtt和diff。

如上所述,本发明通过抽帧控制及时间同步算法将显示时间控制在显示器每1帧的刷新间隔内,可以认为将远程显示延迟降低到了与本地显示一致的水平,有效避免了远程显示所带来的延迟影响用户的操作体验。

附图说明

图1为主机端a和客户端b之间的时间同步方案示意图。

图2为未使用抽帧控制技术的理论显示延迟示意图。

图3为使用本发明抽帧控制技术后的理论显示延迟示意图。

具体实施方式

为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。

本发明远程显示降延迟方法中抽帧控制的先决条件是主机端有足够数量的备选帧,即需要主机端刷新率大于客户端刷新率。假设主机端刷新率120hz,客户端刷新率60hz,我们就可以从主机端每1秒的120帧中抽取合适的60帧到客户端上;但是网络中两台主机之间的本地时间是存在误差的,客户端将自己每1帧刷新的时间点告知主机端,主机端是没办法直接使用这个值,还需要知道对端和自己的时间差,这里就需要利用时间同步设计方案:

设主机端开始传输数据的本地时间为t1,客户端收到数据的本地时间为t2,主机端传输数据到客户端的耗时为t1,客户端开始传回数据的本地时间为t3,主机端收到数据的本地时间为t4,客户端传输数据到主机端的耗时为t2,则网络传输往返时间rtt=(t4-t1)-(t3-t2)=t1+t2,设主机端和客户端的时间差为diff,则t1+t1+diff=t2,diff=t2-t1-t1。

因为t1、t2的值无法直接采集,所以需要通过其它方式计算所得,考虑在rtt极小的情况下,t1、t2可以看做非常接近,即t1=t2=rtt/2,再利用已知的t1、t2、t3、t4值,就可以进一步计算出diff。这里算法需要做的是不断计算每1帧的rtt,每当出现一个rtt历史最小值,就计算一次diff,持续的时间越长diff的精确度越高。

无论是rtt还是diff,都是数值极小的运算,所以这种情况下不能忽略主机和客户机的晶振误差,晶振误差的主要表现是:在t0时刻计算出两台机器的时间差后(假设是精确的10.0ms),又经过了60秒,两台机器的时间差应该还是10.0ms,但是事实上每经过60秒,时间的误差就累计了1ms左右。但是,rtt的最小值是越来越难以被触发的,很有可能几遍我们在某时刻将两台机器的时间差同步在了20us的误差范围内,但是经过一定的时间,两台机器的时间发生了较大的变化(几个ms),但是我们的程序却感知不到这个变化(因为rtt得不到更新)。

对于上述问题的最终解决方案是:首先规划固定的时间窗口,再针对连续的每一个时间窗口进一步计算rtt和diff。假设晶振误差会导致60s内漂移1ms,我们允许的时间差计算误差为100us,那么至少需要在6s内更新一次时间差,也就是说每6ms为一个时间窗口。由于带宽的限制,时间同步的报文不能太多,假设设置为2hz,这意味着在6s内,我们仅有12组数据(12组t1,t2,t3,t4),为了尽可能的将误差降到最低,我们需要尽可能的在12组数据内找到最优解:

考虑从主机端到客户端传输,设传输时间为x,t1+diff+x=t2,从而x=(t2-t1)-diff,在一小段时间内,diff是常数,所以只要t2-t1达到最小,x就达到最小,这个推论在客户端到主机端方向也正确,即使t3-t4是个负值。至此我们得到了两端相对精确的时间差,接下来就可以执行抽帧控制。

首先,定义流逝时间=主机端编码耗时+rtt/2;到达客户端时间=主机端本地时间+主机端抓屏耗时+diff+流逝时间,即到达客户端时间=主机端本地时间+主机端抓屏耗时+diff+主机端编码耗时+rtt/2;提交时间=到达客户端时间+解码耗时;显示时间=提交时间+阻塞时间。当主机端新发布了一帧,则开始判断:

(1)若上一帧未被抽取,且下一帧刷新时间+提交时间<显示时间,则抽取该帧,否则跳至下一步;

(2)若流逝时间>客户端帧刷新间隔,则抽取该帧,否则跳至下一步;

(3)若主机端当前帧时间–主机端上次抽帧时间≥客户端帧刷新间隔,则抽取该帧,否则跳至下一步;

(4)若当前帧时间+流逝时间<显示时间,且下一帧刷新时间+流逝时间>显示时间,则抽取该帧,否则继续判断下一帧。

其中:阻塞时间为主机端当前帧抓帧时间到客户端下一帧显示时间的等待间隔,客户端解码耗时即解码当前传输过来的数据(一帧图像)所耗费的时间,抓屏时间即调用desktopduplicationapi接口抓取一帧当前画面的耗时,一般在0.1ms左右;windows8以后微软引入了一套新的接口,叫desktopduplicationapi,可以通过这套api访问桌面数据,desktopduplicationapi是通过microsoftdirectxgraphicsinfrastructure(dxgi)来提供桌面图像的,速度非常快(由于是通过gpu,所以cpu占用率很低,性能很高),具体调用流程如下:

1.创建d3ddevice;

2.通过一系列接口获取路径,获取到idxgioutputduplication接口;

3.调用acquirenextframe,获取当前桌面数据,保存在idxgiresource中;

4.把数据从gpu映射到内存中;

5.拷贝需要的数据到自己的buffer。

如上所述,本发明通过抽帧控制及时间同步算法将显示时间控制在显示器每1帧的刷新间隔内,可以认为将远程显示延迟降低到了与本地显示一致的水平,有效避免了远程显示所带来的延迟影响用户的操作体验。

如图1所示,我们具体模拟一次时间同步的实施过程,本地时间t1、t2、t3、t4已知,t1和t4来自机器a,t2和t3来自机器b,他们之间存在时间差,不能直接相减获取传输时间。假设a和b的时间差相差20.0ms(a慢于b),我们的目的就是将时间差的计算结果最大限度的靠近20.0ms。

假设传输时间为x,时间差为diff,仅考虑a->b方向,有t1+x+diff=t2,从而x=t2-t1-diff(在一小段时间内,diff是常数);可见,只要t2-t1达到最小,x就达到最小,这个推论在b->a方向也正确,即使t3-t4是个负值。

按照rtt取连续最小值算法,计算所用的数据是:

【117.7,139.9】、【141.4,123.4】

rtt=123.4-117.7–(141.4-139.9)=4.2ms

diff=139.9-117.7-4.2/2=20.1ms

按照两个传输方向上各自取最小值的算法,计算所用的数据是:

【103,125】、【141.4,123.4】

rtt=123.4-103-(141.4-125)=4.0ms

diff=125-103-4.0/2=20.0ms

如图2所示,假设远程显示所需耗时总和为5秒,当主机端最新1帧和客户端最新1帧的间隔小于5秒时,主机端的画面来不及显示到客户端上,只能延迟到客户端下1帧显示,而客户端当前帧只能延续上1帧的画面,即表现为卡顿。如图3所示,当使用抽帧技术时,必然能保证主机端有足够数量的帧,以选择到合适的、能够传递给客户端的帧。

上述对实施例的描述是为便于本技术领域的普通技术人员能理解和应用本发明。熟悉本领域技术的人员显然可以容易地对上述实施例做出各种修改,并把在此说明的一般原理应用到其他实施例中而不必经过创造性的劳动。因此,本发明不限于上述实施例,本领域技术人员根据本发明的揭示,对于本发明做出的改进和修改都应该在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1