一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种跨运行环境的显示输出共享方法与流程

2022-08-13 20:37:55 来源:中国专利 TAG:


1.本发明属于在跨运行环境的数据共享技术领域,具体涉及一种跨运行环境的显示输出共享方法。


背景技术:

2.运行在不同环境中的应用程序通过对输入数据的处理形成输出数据,输出数据或以图片或视频的方式显示输出、或以音频的方式输出,也可以文件等方式进行输出。对于运行环境而言,屏幕显示也是一种显示输出的方式。
3.linux或windows等桌面操作系统上的安卓兼容环境(下文简称安卓兼容环境)是一种在linux或windows操作系统上运行安卓应用的技术,对丰富操作系统应用生态有着重要的意义。通常情况下,典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在桌面操作系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于桌面操作系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在桌面操作系统上的有效运行,例如,现有安卓兼容环境的实现方案有xdroid,它包括xdroidui和xdroidserver,xdroidui为安卓应用显示单元,xdroidserver为安卓应用兼容服务。
4.用户在使用安卓应用的过程中,往往会有录制屏幕的需求,例如,在使用视频会议类软件时用户有共享桌面的需求。现有安卓系统的显示系统中,一般主要包括cpu、gpu和display三个部分,其中,cpu负责计算帧数据,然后把计算完成的图像数据交给gpu,gpu对图像数据进行渲染,然后把渲染后的数据放到图形缓存区中,surfaceflinger将从图形缓冲区中取出的数据合成一帧的数据放入帧缓冲区,最后display从帧缓冲区中取出这些数据展示到屏幕上。virtualdisplay是虚拟的display,能够抓取屏幕上显示的内容主要用于截屏过程,能够满足用户共享屏幕的需求。然而,当用户在桌面系统中使用安卓应用时,用户实际需要分享的屏幕往往不是安卓系统的屏幕而是桌面系统的屏幕,采用安卓系统提供的录制屏幕的方法却无法解决共享桌面系统屏幕的问题,为用户操作带来不便。


技术实现要素:

5.有鉴于此,本发明提供了一种跨运行环境的显示输出共享方法,能够在不同运行环境之间实现显示输出的共享。
6.本发明提供的一种跨运行环境的显示输出共享方法,包括以下步骤:安卓兼容环境中,在安卓应用创建虚显时获取安卓应用的应用包名,建立虚显与应用包名之间的对应关系;在安卓兼容环境的surfaceflinger服务接收到显示状态更新消息后,遍历当前保存的display,若存在状态仅为读取状态且类型为虚显的display,则判断该display对应的应用包名是否存在于所述对应关系中,如果存在则创建与该display相关的虚拟图形缓冲区生产者、虚拟显示绘制表面及虚拟显示设备,虚拟图形缓冲区生产者获取桌面系统的截屏数据后将截屏数据渲染到虚拟显示绘制表面生成渲染数据,虚拟显示设
备将渲染数据输出到屏幕完成显示,其中,虚拟显示设备为包含单一图层的displaydevice;如果不存在状态仅为读取状态且类型为虚显的display,或该display不存在于所述对应关系中,则退出本流程。
7.进一步地,所述虚拟图形缓冲区生产者获取桌面系统的截屏数据的过程,包括以下步骤:步骤2.1、测试计算桌面系统的最大截屏帧率,若最大截屏帧率大于阈值则确定虚拟图形缓冲区生产者的工作模式为异步模式,否则为同步模式;步骤2.2、确定共享缓冲区的大小创建共享缓冲区,用于桌面系统与安卓兼容环境间截屏数据的交互;步骤2.3、根据步骤2.1确定的最大截屏帧率,获取桌面系统的截屏数据,并将截屏数据的数据格式转换为安卓系统的图像格式;当虚拟图形缓冲区生产者的工作模式为同步模式时,若共享缓冲区为可写状态则将截屏数据写入共享缓冲区,否则等待共享缓冲区的状态变为可写状态后再写入数据,虚拟图形缓冲区生产者检测到共享缓冲区中有数据写入后,设置共享缓冲区的状态为不可写,再从共享缓冲区获取截屏数据后将数据传递至虚拟显示绘制表面,并设置共享缓冲区的状态为可写;当虚拟图形缓冲区生产者的工作模式为异步模式时,当虚拟图形缓冲区生产者检测到共享缓冲区中有数据写入后,读取截屏数据后将数据传递至虚拟显示绘制表面。
8.进一步地,所述步骤2.1中测试计算桌面系统的最大截屏帧率的过程,包括以下步骤:步骤3.1、获取系统cpu利用率的初始值,设定截屏帧率的初始值;步骤3. 2、在桌面系统中采用设定的截屏帧率执行截屏操作,生成截屏数据;在安卓兼容环境内将截屏数据转换为安卓系统所需数据格式,获取系统当前的cpu利用率;步骤3.3、重复多次执行步骤3. 2得到间隔设定时间的多个cpu利用率,求得cpu利用率的平均值;步骤3.4、若平均值小于步骤3.1中cpu利用率的初始值,则增大截屏帧率执行步骤3. 2;否则,当前截屏帧率即为最大截屏帧率,执行步骤3.5;步骤3.5、如果最大截屏帧率大于阈值,则确定虚拟图形缓冲区生产者的工作模式为异步模式,否则为同步模式。
9.进一步地,所述步骤3.4中增大截屏帧率的方式为在当前截屏帧率的基础上增加5帧/秒。
10.进一步地,所述步骤3.5中的阈值为30帧/秒。
11.进一步地,所述步骤2.2中确定共享缓冲区的大小的过程,包括以下步骤:步骤6.1、获取桌面系统的屏幕尺寸、截屏数据的数据格式及截屏数据中每像素所需字节数;根据截屏数据的数据格式确定缓冲区大小偏移量;步骤6.2、若所述步骤2.1输出的结果为同步模式,则采用步骤6.1获取的屏幕尺寸、每像素所需字节数及缓冲区大小偏移量,采用如下公式计算缓冲区大小:缓冲区大小=屏幕宽度*屏幕高度*每像素所需字节数 缓冲区大小偏移量;若所述步骤2.1输出的结果为异步模式,则采用如下公式计算缓冲区大小:缓冲区大小=(屏幕宽度*屏幕高度*每像素所
需字节数 缓冲区大小偏移量)*截屏帧率。
12.进一步地,所述在安卓应用创建虚显时获取安卓应用的应用包名,建立虚显与应用包名之间的对应关系的方式为:修改安卓系统中与virtualdisplay创建相关的函数,将安卓应用的应用包名作为变量保存在virtualdisplay内部。
13.进一步地,所述与virtualdisplay创建相关的函数包括但不限于:mediaprojection.createvirtualdisplay、displaymanager.createvirtualdisplay及displaymanagerglobal.createvirtualdisplay。
14.进一步地,所述虚拟显示设备中单一图层的实现方式为:将图层的绘制状态设置为不透明且始终可见,且可视区域的尺寸与桌面系统的屏幕尺寸相同。
15.有益效果:1、本发明通过在安卓兼容环境内创建与虚显相关的虚拟图形缓冲区生产者、虚拟显示绘制表面及虚拟显示设备,虚拟图形缓冲区生产者获取桌面系统的截屏数据,虚拟显示绘制表面将截屏数据转换为渲染数据,虚拟显示设备将渲染数据输出到屏幕显示,实现了将桌面系统的显示输出共享到安卓兼容环境中,从而解决了共享桌面系统屏幕的问题。
16.2、本发明通过在安卓系统内进行系统级的设计实现,进一步提高了桌面系统屏幕共享的执行效率,提升了使用效果。
附图说明
17.图1为本发明提供的一种跨运行环境的显示输出共享方法的流程图。
具体实施方式
18.下面结合附图并举实施例,对本发明进行详细描述。
19.为了便于理解本专利提供的技术方案,现将与本专利相关的安卓系统技术名词列举如下:surfaceflinger服务,是用于在安卓系统中将接收到的多个来源的图形显示数据合成后发送到显示设备。例如,安卓应用一般包括三个图层:顶部的状态栏、底部或者侧面的导航栏以及应用的界面,单独更新和渲染图层,再将图层发送到surfaceflinger服务进行合成后刷新到硬件显示。
20.绘制表面(surface),是安卓应用窗口第一次显示时请求安卓系统内的windowmanagerservice服务为其创建的用于记录窗口显示内容的类。安卓系统中,窗口(window)是从设计者角度定义的关于层次和布局的类,surface则是从工程师实现角度定义的类。窗口的内容是变化的,surface需要有空间来记录每个时刻窗口的内容。在安卓系统的surfaceflinger实现里,surface一般具有两个缓冲区,分别用于绘画和显示,两个缓冲区按照固定的频率进行交换,从而实现窗口的动态刷新。
21.图层(layer),是surfaceflinger 进行合成的基本操作单元。layer在安卓应用请求创建surface时在surfaceflinger内部创建,因此surface与layer对应。
22.显示(display),是用于从帧缓冲区中取出数据信息并将数据信息展示到屏幕上的类,其中,虚显(virtualdisplay)是display的子类。display的状态一般包括读取状态(mcurrentstate)和待绘制状态(mdrawingstate)两类,其中,处于待绘制状态的display通
常为处于读取状态的display的子集。
23.虚拟显示绘制表面(virtualdisplaysurface),是安卓系统为虚显创建的用于渲染图形数据的类。
24.显示设备(displaydevice),是用于描述显示屏的类,用于是将displaysurface中的渲染数据显示在显示屏上。
25.本发明提供的一种跨运行环境的显示输出共享方法,流程如图1所示,包括以下步骤:在安卓兼容环境中,当安卓应用创建虚显时,获取当前进程的进程id及对应的应用包名,建立虚显与应用包名之间的对应关系;当安卓兼容环境的surfaceflinger服务接收到显示状态更新消息后,遍历当前保存的display,若存在状态仅为读取状态且类型为虚显的display,则判断该display对应的应用包名是否存在于虚显与应用包名对应关系之中,如果存在则创建与该display相关的虚拟图形缓冲区生产者及虚拟显示绘制表面,并为该display建立虚拟显示设备,最终由虚拟显示设备将从虚拟显示绘制表面接收到的渲染数据输出到屏幕显示,其中,虚拟图形缓冲区生产者用于获取桌面系统的截屏数据,虚拟图形缓冲区生产者将截屏数据渲染到虚拟显示绘制表面生成渲染数据,虚拟显示设备是仅包含单一图层的displaydevice;如果不存在状态仅为读取状态且类型为虚显的display,或该display不存在于所述对应关系中,则退出本流程。
26.进一步地,为了提高安卓兼容环境中绘制的截屏数据与桌面系统生成的截屏数据的同步性,本发明根据桌面系统的截屏帧率的取值设计了同步模式和异步模式,由此给出了虚拟图形缓冲区生产者的一种实现方式,具体步骤如下:步骤1.1、测试计算最大截屏帧率,若最大截屏帧率大于阈值则确定虚拟图形缓冲区生产者的工作模式为异步模式,否则为同步模式。
27.其中,计算桌面系统的最大截屏帧率的方式为:s11、获取系统cpu利用率的初始值,记为:cpu_useage;设定截屏帧率的初始值,记为framerate;s12、在桌面系统中,采用设定的截屏帧率执行截屏操作,生成截屏数据;在安卓兼容环境内将截屏数据转换为安卓系统所需数据格式;获取系统当前的cpu利用率;s13、重复多次执行s12得到间隔设定时间的多个cpu利用率,例如间隔30秒,求多个cpu利用率的平均值,若平均值小于s11得到的cpu利用率的初始值,则增大截屏帧率执行s12;否则执行s14;s14、如果截屏帧率大于阈值,则确定虚拟图形缓冲区生产者的工作模式为异步模式,否则为同步模式。
28.其中,s13中增大截屏帧率的方式为在当前截屏帧率的基础上增加5帧/秒,s14中截屏帧率的阈值可设置为30帧/秒。
29.步骤1.2、确定共享缓冲区的大小,创建共享缓冲区,用于桌面系统与安卓兼容环境间截屏数据的交互。
30.共享缓冲区大小的设定包括以下步骤:s21、获取桌面系统的屏幕尺寸、截屏数据的数据格式及截屏数据中每像素所需字
节数;根据截屏数据的数据格式确定缓冲区大小偏移量,例如,将偏移量设置为512字节;s22、若步骤1.1输出的结果为同步模式,则采用s21获取的屏幕尺寸、每像素所需字节数及缓冲区大小偏移量,采用如下公式计算缓冲区大小:缓冲区大小=屏幕宽度*屏幕高度*每像素所需字节数 缓冲区大小偏移量;若步骤1.1输出的结果为异步模式,则采用如下公式计算缓冲区大小:缓冲区大小=(屏幕宽度*屏幕高度*每像素所需字节数 缓冲区大小偏移量)*截屏帧率。
31.步骤1.3、根据步骤1.1确定的截屏帧率,获取桌面系统的截屏数据;当虚拟图形缓冲区生产者的工作模式为同步模式时,若共享缓冲区为可写状态则将截屏数据写入共享缓冲区,否则等待共享缓冲区的状态变为可写状态后再写入数据,虚拟图形缓冲区生产者检测到共享缓冲区中有数据写入后,设置共享缓冲区的状态为不可写,再从共享缓冲区获取截屏数据后将数据传递至虚拟显示绘制表面,并设置共享缓冲区的状态为可写;当虚拟图形缓冲区生产者的工作模式为异步模式时,当虚拟图形缓冲区生产者检测到共享缓冲区中有数据写入后,读取截屏数据后将数据传递至虚拟显示绘制表面。虚拟显示绘制表面将截屏数据的数据格式转换为安卓系统的图像格式。
32.进一步地,为了避免由虚拟显示设备导致的安卓系统误刷新操作,以提高跨环境的显示输出的效率,本发明提供了虚拟显示设备中单一图层的一种实现方式,具体为:将图层的绘制状态设置为不透明且始终可见,且可视区域的尺寸与桌面系统的屏幕尺寸相同。
33.实施例1:本实例通过修改安卓系统中与virtualdisplay创建相关的函数,实现当安卓应用创建虚显时,获取当前进程的进程id及对应的应用包名,并将安卓应用的应用包名作为变量保存在virtualdisplay内部,从而完成虚显与应用包名之间对应关系的建立。通过修改函数直接获取进程的进程id是最高效的方式,能够有效节约系统资源。
34.安卓系统中,与virtualdisplay创建相关的函数包括:mediaprojection. createvirtualdisplay、displaymanager.createvirtualdisplay、displaymanagerglobal.createvirtualdisplay及virtualdisplay的构造函数等。
35.实施例2:本实施例通过修改安卓系统中的surfaceflinger::handletransactionlocked,实现在安卓系统的surfaceflinger服务接收到显示状态更新消息后,创建与该display相关的虚拟图形缓冲区生产者及虚拟显示绘制表面,并为该display建立虚拟显示设备,最终由虚拟显示设备将从虚拟显示绘制表面接收到的渲染数据输出到屏幕显示。
36.具体来说,修改安卓系统中的surfaceflinger::handletransactionlocked包括以下步骤:s31、在surfaceflinger::handletransactionlocked中增加比较surfaceflinger中处于mcurrentstate的display与处于mdrawingstate状态的display,当存在仅处于mcurrentstate状态的display,且该display的类型为virtualdisplay时,定义该display为vdisplay;s32、创建虚拟图形缓冲区生产者的实例vbufferproducer,再采用vbufferproducer作为参数之一创建虚拟显示绘制表面类的实例vdisplaysurface;
s33、创建图层的实例dlayer,再创建仅包含dlayer的layerstack类的实例dlayerstack;s34、采用dlayerstack作为参数之一为vdisplay创建displaydevice类的实例vdisplaydevice,再将vdisplaydevice保存到 mdisplays 中进行管理。
37.实施例3:本实施例中通过linux内核接口在安卓兼容环境内的虚拟图形缓冲区生产者进程vbufferproducer和linux端的xdroid的截屏进程xdroidscreencap之间创建大小为buffersize的共享缓冲区sharedbuffer,其中,buffersize为采用步骤1.2确定的值。
38.然后在surfaceflinger进程(即vbufferproducer所在进程)中设置sharedbuffer的指针为sharedbufferptrinsurfaceflinger,在xdroidscreencap进程中设置sharedbuffer的指针为sharedbufferptrinscreencap。
39.当虚拟图形缓冲区生产者的工作模式为同步模式时:xdroidscreencap根据截屏帧率在linux端执行截屏操作得到截屏数据,再将截屏数据转换为安卓系统的图像格式,若sharebuffer处于未锁定状态,则将截屏数据写入sharedbufferptrinscreencap,并通过rpc通知vbufferproducer有新的截屏数据写入到了sharedbuffer中;若sharebuffer处于锁定状态,则等待sharedbuffer转变为未锁定状态;vbufferproducer检测到sharedbuffer中存在新数据后,将sharedbuffer设置为锁定状态,然后将sharedbufferptrinsurfaceflinger指向的一帧通过dequeuebuffer传递给vdisplaysurface后,将sharedbuffer设置为未锁定状态。
40.当虚拟图形缓冲区生产者的工作模式为异步模式时:xdroidscreencap根据截屏帧率在linux端执行截屏操作得到截屏数据,再将截屏数据转换为安卓系统的图像格式,将一帧插入到sharedbufferptrinscreencap指向的队列尾部,并通过rpc通知vbufferproducer有截屏数据写入到sharedbuffer中;vbufferproducer检测到sharedbuffer中存在新数据后,从sharedbufferptrinsurfaceflinger指向的队列的头部取出一帧通过dequeuebuffer传递给vdisplaysurface。
41.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献