一种基于着色器的跨运行环境鼠标图层渲染优化方法转让专利

申请号 : CN202211539279.1

文献号 : CN115543158B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 温研晏华

申请人 : 北京麟卓信息科技有限公司

摘要 :

本发明公开了一种基于着色器的跨运行环境鼠标图层渲染优化方法,通过在桌面系统中按照标准的鼠标渲染方式够建鼠标渲染的着色器程序,确定鼠标顶点相关数据在着色器程序对应的二进制程序中的具体位置,当再次渲染鼠标时,不再需要重新构建和编译着色器程序,而仅需在已构建的着色器程序的二进制程序中修改对应位置的鼠标顶点属性值即可实现鼠标的渲染,有效降低了跨运行环境中鼠标渲染的性能开销。

权利要求 :

1.一种基于着色器的跨运行环境鼠标图层渲染优化方法,其特征在于,具体包括以下步骤:

步骤1、在桌面系统端针对不同鼠标形状分别构建用于执行桌面系统端正常的鼠标绘制过程的着色器程序记为鼠标顶点获取程序,记录鼠标顶点的顶点索引及顶点属性值,通过将初始着色器程序的编译结果与修改鼠标顶点取值后的着色器程序的编译结果进行对比,其中不同的数据位即为顶点位置,记录顶点位置在着色器程序的编译结果中的偏移量,建立顶点索引与偏移量间的鼠标偏移量映射关系;

步骤2、在安卓兼容环境内,设置安卓兼容环境停止为鼠标创建图层,同时,在安卓兼容环境向安卓应用显示单元发送图层时拦截其中的鼠标图层;在桌面系统端的渲染器中根据当前的鼠标形状采用步骤1中确定的具有相同鼠标形状的鼠标顶点获取程序构建鼠标绘制着色器程序,编译鼠标绘制着色器程序得到鼠标绘制二进制程序;

步骤3、当渲染安卓应用桌面窗口时,桌面系统端执行标准的窗口渲染过程生成窗口着色器程序,根据当前鼠标的坐标计算得到当前鼠标形状下的鼠标顶点的顶点索引及顶点属性值;

步骤4、对于步骤3中得到的每个鼠标顶点,根据顶点索引在鼠标偏移量映射关系中查找对应的偏移量,按照偏移量在鼠标绘制二进制程序中确定顶点位置,将顶点位置的值替换为步骤3中得到的顶点属性值,得到新的鼠标绘制二进制程序;

步骤5、将步骤4中得到的鼠标绘制二进制程序链接到窗口着色程序的尾部,再执行窗口着色器程序的渲染操作,完成安卓应用桌面窗口及鼠标的渲染。

2.根据权利要求1所述的跨运行环境鼠标图层渲染优化方法,其特征在于,所述步骤1中所述通过将初始着色器程序的编译结果与修改鼠标顶点取值后的着色器程序的编译结果进行对比,其中不同的数据位即为顶点位置,记录顶点位置在着色器程序的编译结果中的偏移量,建立顶点索引与偏移量间的鼠标偏移量映射关系,包括以下步骤:步骤1.1、获取鼠标顶点的总数记为N,令i的初始为零;

步骤1.2、将初始着色器程序的编译结果中第i个顶点的取值修改为与初始值不同的值,再将鼠标顶点与顶点着色器程序绑定后,编译鼠标顶点获取程序得到二进制程序,将该二进制程序作为变更顶点二进制程序;

步骤1.3、将初始顶点二进制程序与变更顶点二进制程序进行逐个字节比对,其中不同的数据位即为顶点位置,记录顶点位置在顶点二进制程序中的偏移量,将顶点与偏移量间的映射关系加入鼠标偏移量映射关系中,令i自加1;

步骤1.4、若i小于N则执行步骤1.2,否则结束本流程。

3.根据权利要求1所述的跨运行环境鼠标图层渲染优化方法,其特征在于,所述安卓兼容环境基于xDroid建立。

4.根据权利要求1所述的跨运行环境鼠标图层渲染优化方法,其特征在于,所述鼠标形状为桌面系统内的鼠标指针形状。

说明书 :

一种基于着色器的跨运行环境鼠标图层渲染优化方法

技术领域

[0001] 本发明属于移动应用开发技术领域,具体涉及一种基于着色器的跨运行环境鼠标图层渲染优化方法。

背景技术

[0002] 目前通常采用在桌面平台上安装安卓兼容环境的方式运行安卓应用,以解决安卓应用跨平台使用的问题,典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在桌面操作系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于桌面操作系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在桌面操作系统上的有效运行,例如,现有安卓兼容环境的实现方案有xDroid,它包括xDroidUI和xDroidServer,xDroidUI为安卓应用显示单元,xDroidServer为安卓应用兼容服务。
[0003] 现有安卓模拟器等安卓兼容环境中,图标的绘制方式主要包括由桌面系统端绘制和由安卓兼容环境绘制两种方式。在性能模式下,安卓兼容环境通过直接访问GPU绘制图标,此时用户可见的鼠标其实是在安卓兼容环境中绘制的。对于鼠标的绘制来说,安卓系统本身提供了鼠标绘制的功能,它是通过将鼠标绘制到单独的图层实现鼠标的绘制。
[0004] 然而,采用现有安卓系统的鼠标图层绘制机制实现安卓兼容环境内的鼠标渲染,绘制效率较低。安卓兼容环境内每次鼠标图层的渲染过程都包括:在安卓兼容环境内构建鼠标图层的包装器、将包装后的鼠标图层通过RPC传递至安卓应用显示单元、安卓应用显示单元使用着色器语言(GLSL,OpenGL Shader Language)构造着色器程序(Shader Program)并编译着色器程序进行渲染等步骤,并且当鼠标位置发生变化或安卓兼容环境定时刷新时都需要重新执行以上步骤,而一般情况下安卓兼容环境的刷新周期是16ms,因此现有安卓兼容环境的鼠标渲染效率较低,降低了用户体验。

发明内容

[0005] 有鉴于此,本发明提供了一种基于着色器的跨运行环境鼠标图层渲染优化方法,能够实现桌面系统端对鼠标的直接渲染。
[0006] 本发明提供的一种基于着色器的跨运行环境鼠标图层渲染优化方法,具体包括以下步骤:
[0007] 步骤1、在桌面系统端针对不同鼠标形状分别构建用于执行桌面系统端正常的鼠标绘制过程的着色器程序记为鼠标顶点获取程序,记录鼠标顶点的顶点索引及顶点属性值,通过将初始着色器程序的编译结果与修改鼠标顶点取值后的着色器程序的编译结果进行对比,其中不同的数据位即为顶点位置,记录顶点位置在着色器程序的编译结果中的偏移量,建立顶点索引与偏移量间的鼠标偏移量映射关系;
[0008] 步骤2、在安卓兼容环境内,设置安卓兼容环境停止为鼠标创建图层,同时,在安卓兼容环境向安卓应用显示单元发送图层时拦截其中的鼠标图层;在桌面系统端的渲染器中根据当前的鼠标形状采用步骤1中确定的具有相同鼠标形状的鼠标顶点获取程序构建鼠标绘制着色器程序,编译鼠标绘制着色器程序得到鼠标绘制二进制程序;
[0009] 步骤3、当渲染安卓应用桌面窗口时,桌面系统端执行标准的窗口渲染过程生成窗口着色器程序,根据当前鼠标的坐标计算得到当前鼠标形状下的鼠标顶点的顶点索引及顶点属性值;
[0010] 步骤4、对于步骤3中得到的每个鼠标顶点,根据顶点索引在鼠标偏移量映射关系中查找对应的偏移量,按照偏移量在鼠标绘制二进制程序中确定顶点位置,将顶点位置的值替换为步骤3中得到的顶点属性值,得到新的鼠标绘制二进制程序;
[0011] 步骤5、将步骤4中得到的鼠标绘制二进制程序链接到窗口着色程序的尾部,再执行窗口着色器程序的渲染操作,完成安卓应用桌面窗口及鼠标的渲染。
[0012] 进一步地,所述步骤1中所述通过将初始着色器程序的编译结果与修改鼠标顶点取值后的着色器程序的编译结果进行对比,其中不同的数据位即为顶点位置,记录顶点位置在着色器程序的编译结果中的偏移量,建立顶点索引与偏移量间的鼠标偏移量映射关系,包括以下步骤:
[0013] 步骤1.1、获取鼠标顶点的总数记为N,令i的初始为零;
[0014] 步骤1.2、将初始着色器程序的编译结果中第i个顶点的取值修改为与初始值不同的值,再将鼠标顶点与顶点着色器程序绑定后,编译鼠标顶点获取程序得到二进制程序,将该二进制程序作为变更顶点二进制程序;
[0015] 步骤1.3、将初始顶点二进制程序与变更顶点二进制程序进行逐个字节比对,其中不同的数据位即为顶点位置,记录顶点位置在顶点二进制程序中的偏移量,将顶点与偏移量间的映射关系加入鼠标偏移量映射关系中,令i自加1;
[0016] 步骤1.4、若i小于N则执行步骤1.2,否则结束本流程。
[0017] 进一步地,所述安卓兼容环境基于xDroid建立。
[0018] 进一步地,所述鼠标形状为桌面系统内的鼠标指针形状。
[0019] 有益效果:
[0020] 本发明通过在桌面系统中按照标准的鼠标渲染方式够建鼠标渲染的着色器程序,确定鼠标顶点相关数据在着色器程序对应的二进制程序中的具体位置,当再次渲染鼠标时,不再需要重新构建和编译着色器程序,而仅需在已构建的着色器程序的二进制程序中修改对应位置的鼠标顶点属性值即可实现鼠标的渲染,有效降低了跨运行环境中鼠标渲染的性能开销。

具体实施方式

[0021] 下面列举实施例,对本发明进行详细描述。
[0022] 本发明提供的一种基于着色器的跨运行环境鼠标图层渲染优化方法,具体包括以下步骤:
[0023] 步骤1、在桌面系统端构建用于执行桌面系统端正常的鼠标绘制过程的着色器程序记为鼠标顶点获取程序,建立鼠标顶点列表用于保存顶点索引及顶点属性值,通过将初始着色器程序的编译结果与修改鼠标顶点取值后的着色器程序的编译结果进行对比,确定其中不同的数据位,该数据位即为顶点位置,记录顶点位置在着色器程序编译结果中的偏移量,建立顶点索引与偏移量间的鼠标偏移量映射关系。鼠标顶点获取程序为根据不同的鼠标形状分别构建的鼠标绘制相关的着色器程序。
[0024] 其中,建立顶点索引与偏移量间的鼠标偏移量映射关系的过程包括:
[0025] 步骤1.1、在桌面系统端构建用于执行桌面系统端正常的鼠标绘制过程的着色器程序作为鼠标顶点获取程序,鼠标顶点获取程序包括顶点着色器程序和片元着色器程序,将鼠标顶点列表与顶点着色器程序绑定以记录鼠标顶点信息;将鼠标顶点列表保存为初始顶点列表,编译鼠标顶点获取程序得到顶点二进制程序,将此时的顶点二进制程序作为初始顶点二进制程序。
[0026] 步骤1.2、获取鼠标顶点列表中顶点的总数N,令i的初始为零。
[0027] 步骤1.3、将鼠标顶点列表中第i个顶点的取值修改为与初始值不同的值,再将鼠标顶点列表与顶点着色器程序绑定后,编译鼠标顶点获取程序得到二进制程序,将该二进制程序作为变更顶点二进制程序。
[0028] 步骤1.4、将初始顶点二进制程序与变更顶点二进制程序进行逐个字节比对,其中不同的数据位即为顶点位置,记录顶点位置在顶点二进制程序中的偏移量,将顶点与偏移量间的映射关系加入鼠标偏移量映射关系中,令i自加1。
[0029] 步骤1.5、若i小于N则执行步骤1.3,否则结束本流程。
[0030] 本发明通过上述步骤即可建立桌面系统中鼠标渲染的标准着色器程序,同时也能确定鼠标顶点相关数据在标准着色器程序的二进制程序中的具体位置,这样在鼠标位置变化等需要重绘鼠标的情况发生时,不再需要重新构建和编译着色器程序,而仅需修改标准着色器程序的二进制程序中确定位置的鼠标顶点相关信息即可,减小了鼠标渲染的性能开销。此外,本发明在确定鼠标顶点相关信息在二进制程序中的位置时采用逐一修改顶点信息的方式,以避免修改过程所导致的数据压缩等情况的发生。
[0031] 步骤2、在安卓兼容环境内,设置安卓兼容环境停止为鼠标创建图层,同时,设置在安卓兼容环境向安卓应用显示单元发送图层时,拦截其中的鼠标图层后再发送到安卓应用显示单元;在桌面系统端的渲染器中根据当前的鼠标形状采用步骤1中确定的具有相同鼠标形状的鼠标顶点获取程序构建鼠标绘制着色器程序,编译鼠标绘制着色器程序得到运行时采用的鼠标绘制二进制程序。
[0032] 本发明通过设置安卓兼容环境停止为鼠标创建图层,同时拦截安卓应用创建的鼠标图层发送到桌面系统端,能够优化鼠标图层的构建开销及传递开销。
[0033] 步骤3、当渲染安卓应用桌面窗口时,桌面系统端执行标准的窗口渲染过程生成窗口着色器程序,获取当前鼠标的坐标,根据鼠标的坐标计算得到当前鼠标形状下的鼠标顶点列表,鼠标顶点列表中保存顶点索引及顶点属性值。
[0034] 步骤4、对于步骤3中得到的鼠标顶点列表中的每个顶点,根据顶点索引在鼠标偏移量映射关系中查找顶点对应的偏移量,按照偏移量在鼠标绘制二进制程序中确定顶点相关数据所在的位置,将偏移量处的值替换为步骤3中得到的顶点属性值,得到新的鼠标绘制二进制程序。
[0035] 步骤5、将步骤4中得到的鼠标绘制二进制程序链接到窗口着色程序的尾部,再执行窗口着色器程序的渲染操作,在完成安卓应用桌面窗口的绘制后完成鼠标的渲染。
[0036] 实施例:
[0037] 本实施例采用本发明提供的一种基于着色器的跨运行环境鼠标图层渲染优化方法,在xDroid中实现了使用xDroidUI完成鼠标的渲染,具体包括以下步骤:
[0038] S1、在桌面系统端构建用于执行桌面系统端正常的鼠标绘制过程的着色器程序记为鼠标顶点获取程序,以确定鼠标顶点在编译后的着色器程序中的位置,本实施例列举的鼠标顶点获取程序为绘制鼠标三角形图标的着色器程序,当鼠标形状改变时仅需要修改编译后的着色器程序中鼠标顶点位置的取值即可。具体包括以下步骤:
[0039] S1.1、构建鼠标顶点获取程序中的顶点着色器程序vertexProgram,程序代码如下:
[0040]     const char*  vertexProgram =
[0041]         "#version 430\n"
[0042]         "layout(location=0) in vec4 vPos; \n"
[0043]         "void main() { glPosition = vPos;}";
[0044] S1.2、构建鼠标顶点获取程序中的片元着色器程序fragmentProgram,程序代码如下:
[0045]     const char* fragmentProgram =
[0046]         "#version 430\n"
[0047]         "out vec4 fColor; \n"
[0048]         "void main() { fColor = vec4(0.0, 0.0, 1.0, 1.0); }";
[0049] S1.3、构建鼠标三角形的鼠标顶点列表,记为vertexList。
[0050] S1.4、将vertexList绑定到顶点着色器程序中,也就是将vertexList绑定到顶点着色器程序中的vPos,程序代码如下:
[0051]     glBufferData(GL_ARRAY_BUFFER, sizeof(vertexList), vertexList, GL_STATIC_DRAW);
[0052]     glEnableVertexAttribArray(vPos);
[0053]     glVertexAttribPointer(vPos, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
[0054] S1.5、依次调用方法glCreateShader、glShaderSource及glCompileShader,分别对vertexProgram和fragmentProgram进行处理,完成鼠标顶点获取程序的构建和编译。
[0055] S1.6、调用方法glGetShaderiv获取鼠标顶点获取程序编译后的二进制结果,即将vertexProgram和fragmentProgram编译后的二进制结果分别保存为originalCompiledVertexCode和originalCompiledFragmentCode。
[0056] S1.7、将vertexList另存为vertexListOriginal。
[0057] S1.8、将vertexList中的顶点个数记为vertexCount,循环执行以下步骤vertexCount次,令当前循环次数index为0:
[0058] S1.8.1、将vertexListOriginal的值赋给vertexList;
[0059] S1.8.2、修改vertexList [index]为与当前取值不同的值,赋值后的值记为newValue;
[0060] S1.8.3、执行S1.4及S1.5后,调用方法glGetShaderiv获取编译后的二进制结果,保存为newCompiledVertexCode和newCompiledFragmentCode;
[0061] S1.8.4、分别将newCompiledVertexCode与originalCompiledVertexCode、newCompiledFragmentCode与originalCompiledFragmentCode逐字节的进行比较,记录其中差异字节的偏移量,将偏移量记为vertexOffsetInCompiledVertexCode和vertexOffsetInCompiledFragmentCode;
[0062] S1.8.5、将index及vertexOffsetInCompiledVertexCode加入映射关系mapVertexIndex2OffsetInCompiledVertexCode中,将index及vertexOffsetInCompiledFragmentCode加入映射关系mapVertexIndex2OffsetInCompiledFragmentCode中。
[0063] S2、修改安卓兼容环境的鼠标图层相关处理过程,包括:通过修改SurfaceFlinger,使安卓兼容环境停止为鼠标创建图层;通过修改Composer,使安卓兼容环境准备向桌面系统端传递图层时,先判断图层的类型,若图层类型为鼠标图层则忽略不传递,否则正常传递。
[0064] S3、在xDroidUI端直接采用GLSL绘制鼠标,具体来说在桌面系统端的渲染器中执行以下操作:
[0065] S3.1、根据当前鼠标的形状,采用S1中确定的顶点着色器程序和片元着色器程序,构建符合当前鼠标形状的鼠标绘制着色器程序,编译鼠标绘制着色器程序得到二进制程序,将其分别记为compiledVertexCode和compiledFragmentCode。
[0066] S3.2、当绘制安卓应用桌面窗口时,执行标准的窗口渲染步骤,生成相应的着色器程序,记为standardGLSLCode;获取当前的鼠标坐标,根据当前的鼠标坐标重新计算当前鼠标形状下的鼠标顶点列表,记为vertexList。
[0067] S3.3、针对vertexList中的每个顶点vertex,执行以下步骤:
[0068] S3.3.1、根据vertex在vertexList中的index,在mapVertexIndex2OffsetInCompiledVertexCode及mapVertexIndex2OffsetInCompiledFragmentCode中查询对应的偏移量,记为offset,然后在compiledVertexCode及compiledFragmentCode中偏移量为offset地方将原有值修改为vertex的取值;
[0069] S3.3.2、获取standardGLSLCode的programID;
[0070] S3.3.3、调用方法glAttachShader将compiledVertexCode和compiledFragmentCode依次绑定到programID上;
[0071] S3.3.4、依次调用方法glLinkProgram  (programID)和glUseProgram (programID)执行渲染操作,实现在完成安卓应用桌面窗口的绘制后完成鼠标的渲染。
[0072] 综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。