一种基于垂直消隐模拟的图形应用帧率同步方法与流程

文档序号:33114577发布日期:2023-02-01 02:40阅读:108来源:国知局

1.本发明属于计算机图像处理技术领域,具体涉及一种基于垂直消隐模拟的图形应用帧率同步方法。


背景技术:

2.目前主要的图形渲染方式之一是采用专门的图形处理器(graphic processing unit,gpu)渲染三维图形的方式。gpu又称显示核心、视觉处理器、显示芯片,gpu是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器,采用gpu使显卡减少了对cpu的依赖,并进行部分原本cpu的工作,尤其是在3d图形处理时gpu所采用的核心技术有硬件t&l(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件t&l技术可以说是gpu的标志。gpu的生产商主要有nvidia、ati和amd。
3.gpu一般是通过标准api接口,如opengl、opengl es、vulkan、direct x等,提供图形渲染能力,这些接口通常被称为图形接口,图形应用通过调用这些图形接口最终实现图形绘制。每种图形接口都存在多个不同的版本,如opengl的最新版本是4.6,opengl es的最新版本是3.2。对于采用drm(direct rendering manager)驱动架构的gpu来说,gpu的drm驱动包括gpu厂商实现的drm驱动和linux内核提供的drm驱动支撑库两部分,其中,drm驱动支撑库是linux内核提供的各种共性支撑函数。
4.在对gpu进行测试时常用的测试方式是根据同一图形应用测试程序在不同gpu上渲染结果的差异来对比分析gpu的性能,对于这类测试首先需要解决的问题就是如何确保被测的gpu均采用相同的帧率(fps)。现有gpu测试中往往是采用设置操作系统和显示器的相关参数保证帧率的一致性,然而这种方式为用户增加了操作复杂度,精度也相对较低。


技术实现要素:

5.有鉴于此,本发明提供了一种基于垂直消隐模拟的图形应用帧率同步方法,能够实现不同gpu执行同一图形应用测试程序时所采用的帧率保持一致。
6.本发明提供的一种基于垂直消隐模拟的图形应用帧率同步方法,包括以下步骤:步骤1、关闭计算平台上所有图形应用程序,禁用窗口管理器的图形加速功能;建立中断列表,中断列表用于记录首次vblank中断的发生时间及后续vblank中断与首次vblank中断的时间间隔,令中断列表为空;确定当前使用的gpu;步骤2、令图形应用测试程序采用当前gpu对应的umd驱动程序路径,启动vblank中断;执行图形应用测试程序,捕获vblank中断记录中断时间为当前时间,若中断列表为空则以当前时间作为首次中断时间保存到中断列表中,否则以当前时间与首次中断时间的差值作为时间间隔保存到中断列表中,图形应用测试程序执行完毕后保存中断列表;步骤3、若图形应用测试程序在所有gpu上均已执行完毕,则执行步骤4;否则更换gpu执行步骤2;
步骤4、选取步骤2得到的中断列表中所含记录数量最少的中断列表作为标准垂直消隐事件队列,确定执行图形应用测试程序所需采用的gpu;步骤5、令图形应用测试程序使用当前采用的gpu对应的umd驱动程序路径,禁止使用vblank中断;执行图形应用测试程序,记录启动时间,当执行时间与启动时间的时间间隔与标准垂直消隐事件队列中的时间间隔相等时,构造vblank中断数据结构,并将vblank中断数据结构添加到内核的vblank事件队列中,直到图形应用测试程序执行完毕;步骤6、若图形应用测试程序在所有gpu上均已执行完毕,则结束本流程;否则更换gpu执行步骤5。
7.进一步地,所述步骤1中所述建立中断列表的方式为调用linux内核drm驱动支撑库中的函数获取gpu内核驱动的类型为drm_crtc_funcs数据结构,为drm_crtc_funcs分配中断列表vblank_interrupt_list。
8.进一步地,所述步骤2中所述启动vblank中断的方式为调用linux内核drm驱动支撑库中的函数enable_vblank启动vblank中断。
9.进一步地,所述步骤5中所述禁止使用vblank中断的方式为调用linux内核drm驱动支撑库中的disable_vblank函数禁止使用vblank中断。
10.进一步地,所述步骤2中所述当前时间的获取方式为采用内核提供的高精度定时器记录程序执行的时间。
11.有益效果:本发明通过修改linux内核提供的drm驱动支撑库以控制垂直消隐机制,实现了对应用刷新率即帧率的控制,进而实现了不同gpu执行同一图形应用测试程序时所采用的帧率保持一致,而无需用户执行修改操作,进一步降低了用户操作的复杂度,提升了控制的精确度。
具体实施方式
12.下面列举实施例,对本发明进行详细描述。
13.图形应用的渲染帧率不仅与gpu性能相关,还与操作系统图形驱动的相关配置有关,因此在不同gpu上运行相同图形应用时采用的渲染帧率往往也是不同的。gpu厂商通常不提供drm驱动的源代码,因此本发明的核心思想是:通过修改linux内核提供的drm驱动支撑库控制垂直消隐机制实现对应用刷新率即帧率的控制。其中,垂直消隐即vblank(vertical blank),该机制用于在图形图像渲染过程中实现页面翻转和垂直消隐的同步操作。drm core提供了大量的垂直消隐管理的辅助函数,主要包括伪中断过滤、vblank计数统计、翻转及重置等函数。
14.本发明提供了一种基于垂直消隐模拟的图形应用帧率同步方法,具体包括以下步骤:步骤1、在计算平台上关闭所有图形应用程序,禁用窗口管理器的图形加速功能,以确保计算平台上仅有图形应用测试程序使用gpu驱动的图形加速功能;调用linux内核drm驱动支撑库中的函数建立中断列表,中断列表用于记录首次中断的发生时间及后续中断与首次中断的时间间隔,再将中断列表初始化为空;确定当前使用的gpu。
15.步骤2、令图形应用测试程序优先搜索当前gpu对应的umd驱动程序路径,调用
linux内核drm驱动支撑库中的函数启动vblank中断;执行图形应用测试程序,执行过程中捕获vblank中断记录中断时间为当前时间,若中断列表为空则以当前时间作为首次中断时间保存到中断列表中,否则以当前时间与首次中断时间的差值作为时间间隔保存到中断列表中,图形应用测试程序执行完毕后保存中断列表。
16.其中,umd驱动程序为用户态显卡驱动程序(umd, user-mode driver)。为了保证记录时间的精度,在程序执行过程中采用内核提供的高精度定时器记录程序执行的时间。
17.步骤3、若图形应用测试程序在所有gpu上均已执行完毕,则执行步骤4;否则更换gpu执行步骤2。
18.步骤4、选取步骤2得到的所有gpu的中断列表中所含记录数量最少的中断列表作为标准垂直消隐事件队列,确定执行图形应用测试程序所需采用的gpu。
19.步骤5、令图形应用测试程序使用当前采用的gpu对应的umd驱动程序路径,调用linux内核drm驱动支撑库中的函数禁止使用vblank中断;执行图形应用测试程序,记录启动时间,当执行时间与启动时间的时间间隔与标准垂直消隐事件队列中的时间间隔相等时,构造vblank中断数据结构,并将vblank中断数据结构添加到内核的vblank事件队列中,直到图形应用测试程序执行完毕。
20.其中,采用内核提供的高精度定时器记录程序的启动时间及执行时间,再计算执行时间与启动时间的时间差,将该时间差作为时间间隔。
21.步骤6、若图形应用测试程序在所有gpu上均已执行完毕,则结束本流程;否则更换gpu执行步骤5。
22.实施例:本实施例采用本发明提供的一种基于垂直消隐模拟的图形应用帧率同步方法实现了在两个不同gpu上采用相同帧率运行图形应用测试程序,具体包括以下步骤:s1、在同一台计算机上安装两个不同的gpu,依次采用不同的gpu运行同一图形应用测试程序graphicapp,并记录不同gpu上出现的vblank事件序列。即,针对每个gpu执行以下步骤:s1.1、关闭linux上的所有图形应用程序,禁用窗口管理器的图形加速功能,确保在graphicapp开始运行时没有其他任何应用同时使用gpu驱动的图形加速功能;s1.2、通知修改后的linux内核,获取gpu内核驱动的类型为drm_crtc_funcs数据结构,调用enable_vblank函数启动vblank中断,其中,drm_crtc_funcs数据结构为gpu内核drm驱动在初始化时向内核注册的数据结构;再为该数据结构额外分配中断列表vblank_interrupt_list,将vblank_interrupt_list初始化为空;s1.3、将gpu的umd驱动路径加入graphicapp的库搜索路径的最前端,以便图形应用测试程序优先搜索当前gpu对应的umd驱动程序路径,再运行graphicapp;s1.4、修改linux内核drm驱动支撑库中的drm_crtc_handle_vblank函数,为vblank_interrupt_list增加长度为64bit的元素,若当前待加入的元素将是vblank_interrupt_list中的第一个元素,则采用linux内核的高精度定时器记录当前时间将当前时间作为元素加入vblank_interrupt_list中,否则将当前时间和第一个元素记录的时间的时间间隔作为元素加入vblank_interrupt_list中;调用drm_crtc_handle_vblank的标准流程,执行测试程序。
23.s2、采用linux系统的ioctl接口从内核获取每个gpu上的vblank_interrupt_list,vblank_interrupt_list所含元素的数量即可代表各gpu的帧率。
24.s3、比较不同gpu上的vblank_interrupt_list,选取所含元素个数最少的列表记为shortest_vblank_interrupt_list,以shortest_vblank_interrupt_list作为标准垂直消隐事件队列。
25.s4、将shortest_vblank_interrupt_list通过ioctl接口传递至修改后的linux内核。
26.s5、linux内核基于shortest_vblank_interrupt_list模拟vblank事件,在各gpu上重新执行graphicapp,包括以下步骤:s5.1、获取gpu内核驱动的类型为drm_crtc_funcs数据结构,调用disable_vblank函数,以禁止使用vblank中断;s5.2、执行graphicapp,记录启动时间,对shortest_vblank_interrupt_list中的每个时间间隔interval,添加内核的高精度定时器,当过去interval时间后,在定时器响应函数中构造一个vblank数据结构,将其加入内核的vblank事件队列,调用drm_update_vblank_count更新vblank计数,再获取下一个interval,添加内核的高精度定时器,直到图形应用测试程序执行完毕。
27.通过上述过程即可保证graphicapp在linux系统中的不同gpu上均采用与shortest_vblank_interrupt_list对应的帧率运行。
28.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1