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

窗口显示方法、装置、计算机设备和存储介质与流程

2022-02-22 08:51:32 来源:中国专利 TAG:


1.本发明涉及计算机操作系统领域,尤其涉及一种窗口显示方法、装置、计算机设备和存储介质。


背景技术:

2.在linux操作系统兼容android环境中,linux操作系统厂商在适配gpu(显卡)时,需要实现标准的opengl es(opengl for embedded systems)接口,应用程序就可以通过调用系统的opengl es接口来调用gpu显卡硬件。不同的linux操作系统,对于不同的gpu显卡,适配的opengl es版本号各异,适配的图形服务器(x11或者wayland)也各不相同。linux操作系统的这些差异性,导致在linux系统上显示android应用的窗口时,会出现各种显卡兼容性的问题。例如:
3.场景一:linux系统的调用gpu硬件的opengl es接口版本为2.0,而android 10操作系统依赖的opengl es版本号在3.0以上,由于版本的不兼容和版本的差异性,linux系统无法处理所有的android系统发送过去的opengl渲染请求,最终导致在linux系统上无法显示android应用的窗口。
4.场景二:linux系统调用gpu硬件的opengl es接口使用的显示服务器协议为wayland,而linux系统在显示android应用的窗口时,仅仅支持x11的显示服务器协议,并没有适配wayland的显示服务器协议。这样在linux系统上也无法显示android应用的窗口。
5.现有的方案中,并不能解决以上两种场景存在的问题,即linux侧opengl es接口的版本号无法满足运行android系统的需求,或者无法同时在x11和wayland的显示服务器协议上显示android应用的窗口。


技术实现要素:

6.为了解决在linux系统上使用基于x11协议或者wayland协议的qt窗口显示android应用的问题,本发明提供了一种窗口显示方法、装置、计算机设备和存储介质。
7.第一方面,本发明提供一种窗口显示方法,所述方法为:
8.加载opengl es渲染库;
9.android系统将opengl es渲染指令编码,向linux系统发送编码后的opengl es渲染指令;
10.linux系统接收到编码的opengl es渲染指令,进行解码后,调用已加载的opengl es渲染库;
11.启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface。
12.进一步地,所述方法在加载opengl es渲染库之前,还包括:
13.检测linux系统是否支持x11协议opengl es渲染;
14.检测linux系统是否支持wayland协议opengl es渲染;
15.检测linux系统是否支持opengl es版本号大于或等于3.0;
16.根据检测结果,加载不同的opengl es渲染库。
17.进一步地,所述方法中根据linux系统支持的显示服务器协议创建qt窗口,包括:
18.根据linux系统支持的显示服务器协议创建基于x11协议或wayland协议的qt窗口。
19.进一步地,启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,具体为:
20.在linux侧启动android应用时,linux侧向android发送消息,android侧启动应用进程,通知linux侧启动android应用显示窗口,linux侧根据linux系统支持的显示服务器协议创建qt窗口。
21.进一步地,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface,具体为:
22.创建qt窗口后,根据qt窗口的窗口标识创建与窗口绑定的egl surface,android侧的surfaceflinger进程进行图形绘制,向linux侧发送opengl es渲染指令,linux侧接收指令后将opengl es渲染数据输出到egl surface。
23.第二方面,本发明提供一种窗口显示装置,所述装置包括:
24.存储器,用于存储程序;
25.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行:
26.加载opengl es渲染库;
27.android系统将opengl es渲染指令编码,向linux系统发送编码后的opengl es渲染指令;
28.linux系统接收到编码的opengl es渲染指令,进行解码后,调用已加载的opengl es渲染库;
29.启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface。
30.第三方面,本发明提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行:
31.加载opengl es渲染库;
32.android系统将opengl es渲染指令编码,向linux系统发送编码后的opengl es渲染指令;
33.linux系统接收到编码的opengl es渲染指令,进行解码后,调用已加载的opengl es渲染库;
34.启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface。
35.第四方面,本发明提供一种存储有计算机可读指令的存储介质,所述计算机可读
指令被一个或多个处理器执行时,使得一个或多个处理器执行:
36.加载opengl es渲染库;
37.android系统将opengl es渲染指令编码,向linux系统发送编码后的opengl es渲染指令;
38.linux系统接收到编码的opengl es渲染指令,进行解码后,调用已加载的opengl es渲染库;
39.启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface。
40.本发明与现有技术相比,具有以下优点:
41.在linux兼容android环境中,能彻底地解决在linux系统上使用基于x11协议或者wayland协议的qt窗口显示android应用的问题。
附图说明
42.图1为本发明实施例提供的一种窗口显示方法示意图;
43.图2为本发明实施例提供的一种窗口显示装置组成示意图。
具体实施方式
44.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
45.对于在linux操作系统上兼容运行android的环境来说,android运行环境是运行在容器中的。
46.通过容器技术可以在linux系统运行一个新的linux系统(包括其他基于linux系统定制的系统,如android),容器使得客户机系统和主机系统相互隔离。与传统的基于虚拟机技术的方案不同,在容器技术中,客户系统与主机系统共享cpu、内存、存储等资源,资源开销很低。此外,通过适当的配置,还能使客户系统直接访问主机的硬件资源,进一步提升客户系统的性能。
47.图1为本发明实施例提供的一种窗口显示方法示意图,所述方法为:
48.加载opengl es渲染库;
49.android系统将opengl es渲染指令编码,向linux系统发送编码后的opengl es渲染指令;
50.linux系统接收到编码的opengl es渲染指令,进行解码后,调用已加载的opengl es渲染库;
51.启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface。
52.说明,egl surface是对用来存储图像的内存区域,可以理解为一个后端的渲染目标窗口。egl是opengl es和底层nat ive平台视窗系统之间的接口。
53.进一步地,所述方法在加载opengl es渲染库之前,还包括:
54.检测linux系统是否支持x11协议opengl es渲染;
55.检测linux系统是否支持wayland协议opengl es渲染;
56.检测linux系统是否支持opengl es版本号大于或等于3.0;
57.根据检测结果,加载不同的opengl es渲染库。
58.具体地,检测linux系统是否支持x11协议的gpu硬件opengl es渲染。
59.启动opengl es代理程序opengl_proxy后,会先检测当前linux系统是否支持x11协议的硬件opengl es渲染。主要是通过调用系统的egl接口来完成检测。
60.相关代码如下:
61.#include《egl/egl.h》
62.#include《egl/eglext.h》
63.egldisplay mdisplay=eglgetdisplay(egl_default_display)
64.eglinitialize(mdisplay,nullptr,nullptr);
65.const char*extensions=eglquerystring(mdisplay,
66.egl_extensions)
67.egldisplay是一个关联系统物理屏幕的通用数据类型。对于pc来说,display就是显示器的句柄。通过附带egl_default_display参数eglgetdisplay函数来获取x11协议的egldisplay,再通过eglinitialize进行egldisplay的初始化。最后通过eglquerystring函数带egl_extensions参数获取egldisplay实现的egl扩展,如果返回的字符串中包含egl_ext_platform_x11或者egl_khr_platform_x11,则说明linux系统支持x11协议的gpu硬件opengl es渲染。
68.检测linux系统是否支持wayland协议的gpu硬件opengl es渲染。
69.如果检测到linux系统不支持x11协议的gpu硬件opengl es渲染,则开始检测linux系统是否支持wayland协议的gpu硬件opengl es渲染。主要是通过调用系统的egl接口来完成检测,但是调用的api有一些区别。主要代码如下:
70.#include《egl/egl.h》
71.#include《egl/eglext.h》
72.static pfneglgetplatformdisplayextproc get_platform_display
73.=
74.(pfneglgetplatformdisplayextproc)eglgetprocaddress("eglget
75.platformdisplayext");
76.egldisplay mdisplay=
77.get_platform_display(egl_platform_wayland_khr,
78.m_wayland_display,null);
79.eglinitialize(mdisplay,nullptr,nullptr);
80.const char*extensions=eglquerystring(mdisplay,
81.egl_extensions)
82.通过eglgetprocaddress函数获取eglgetplatformdisplayext的符号地址,再附带egl_platform_wayland_khr参数调用其符号地址,获取wayland协议的egldisplay。再通
过eglinitialize进行egldisplay的初始化。最后通过eglquerystring函数带egl_extensions参数获取egldisplay实现的egl扩展,如果返回的字符串中包含egl_ext_platform_wayland或者egl_khr_platform_wayland,则说明linux系统支持wayland协议的gpu硬件opengl es渲染。
83.检测linux是否支持版本号大于或等于3.0的opengl es渲染。
84.如果检测到linux系统支持x11协议的gpu硬件opengl es渲染或者支持wayland协议的gpu硬件opengl es渲染,由于需要运行的android版本为10.0,而android10.0依赖3.0及以上版本的opengl es,所以还需要检测当前支持的opengl es版本号是否大于或等于3.0。同样是调用egl的接口来查询opengl es的版本,相关代码如下:
85.eglquerystring(egl_no_display,egl_version)
86.在获取完egldisplay以及调用了eglinitialize函数对egldisplay进行初始化之后,可以通过eglquerystring函数带egl_version参数获取opengl es的版本号,从而判断opengl es的版本号是否大于或等于3.0。
87.根据检测结果加载不同的opengl es渲染库。
88.opengl es渲染库主要包括libegl.so,libglesv1.so,libglesv2.so。这三个共享库向上实现了标准的egl和opengl es接口,向下直接调用gpu(显卡),一般由gpu(显卡)厂商提供。
89.如果检测到linux系统支持x11协议的gpu硬件opengl es渲染或者支持wayland协议的gpu硬件opengl es渲染,且当前支持的opengl es版本号大于等于3.0,则可以直接加载linux系统自带的opengles渲染库。
90.如果检测到linux系统不支持x11协议的gpu硬件opengl es渲染且不支持wayland协议的gpu硬件opengl es渲染,或者linux系统支持x11协议的gpu硬件opengl es渲染或者支持wayland协议的gpu硬件opengl es渲染,但是当前支持的opengl es版本号小于3.0,则加载使用软件模拟egl和opengl es接口的库swiftshader。swiftshader是一款用于在cpu上进行高性能图形渲染的软件库,其向上使用了标准的egl和opengl es接口,向下调用cpu,而非gpu,即使用了软件模拟的方式,而非调用硬件资源。所以swiftshader不依赖显卡硬件。当检测到硬件接口不能满足需求时,则使用swiftshader库来完成opengl es的调用。swiftshader目前支持x11显示服务器协议。
91.加载完opengl es渲染库之后,opengl es代理程序会进行egl的初始化,并启动一个用来接收android发送过来的opengl es指令的进程。接着启动android系统,android系统会启动一个surfaceflinger显示进程,surfaceflinger会发送opengl es指令给opengl es代理程序来完成android系统的显示初始化。opengl es代理程序还会启动一个用来接收android系统发送过来的android应用启动消息的进程,等待android应用的启动。
92.android系统将opengl es渲染指令进行编码后发送给linux系统的opengl es代理程序,opengl es代理程序的opengl es接收进程接收到opengl es指令后,将opengl es指令解码后,调用已经加载好的opengl es渲染库,从而达到android系统调用linux系统硬件gpu的目的。
93.android系统的opengl es渲染最终通过linux系统来实现,但是linux系统中仍然还需要一个本地窗口,并且将opengl es的渲染结果输出到linux系统的本地窗口,才能实
现使用linux系统的窗口显示android应用的功能。
94.如果检测到linux系统支持x11协议的gpu硬件opengl es渲染,此时可以启动一个基于x11协议的qt程序。可以通过设置qt_qpa_platform环境变量为xcb,或者启动qt程序时,增加-platform xcb参数的方法来设置qt程序的显示服务器协议为x11。
95.启动qt程序后,在qt程序中启动一个qwindow类的窗口,然后将qwindow的窗口标识winid传递给opengl es代理程序,opengl es代理程序以egldisplay和winid为参数调用eglcreatewindowsurface函数创建一个和qwindow绑定的eglsurface。android侧的surfaceflinger进程会进行图形绘制,此时会发送编码后的opengl es指令给linux侧的opengl es代理程序,opengl es代理程序会将opengl es渲染的数据输出到eglsurface中,由于eglsurface和qwindow绑定,所以最终会将eglsurface中的内容输出到本地的qwindow窗口,完成在linux系统上使用x11协议的qt窗口显示android应用的目的。
96.进一步地,所述方法中根据linux系统支持的显示服务器协议创建qt窗口,包括:
97.根据linux系统支持的显示服务器协议创建基于x11协议或wayland协议的qt窗口。
98.进一步地,启动android应用,根据linux系统支持的显示服务器协议创建qt窗口,具体为:
99.在linux侧启动android应用时,linux侧向android发送消息,android侧启动应用进程,通知linux侧启动android应用显示窗口,linux侧根据linux系统支持的显示服务器协议创建qt窗口。
100.进一步地,根据窗口标识创建egl surface,android侧进行图形绘制,linux侧将opengl es渲染数据输出到egl surface,具体为:
101.创建qt窗口后,根据qt窗口的窗口标识创建与窗口绑定的egl surface,android侧的surfaceflinger进程进行图形绘制,向linux侧发送opengl es渲染指令,linux侧接收指令后将opengl es渲染数据输出到egl surface。
102.图2为本发明实施例提供的一种窗口显示装置组成示意图,所述装置包括:
103.存储器,用于存储程序;
104.处理器,用于执行所述存储器中存储的程序,当所述存储器中存储的程序被执行时,所述处理器用于执行上述方法的步骤。
105.此外,本发明实施例提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述方法的步骤。
106.本发明实施例提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述方法的步骤。
107.最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

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

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

相关文献