一种基于自适应解码缓存的压缩纹理渲染优化方法与流程-j9九游会真人

文档序号:35696661发布日期:2023-10-11 19:37阅读:7来源:国知局

1.本发明属于计算机应用开发技术领域,具体涉及一种基于自适应解码缓存的压缩纹理渲染优化方法。


背景技术:

2.图形应用程序在使用压缩纹理的时候,如果gpu支持此格式的压缩纹理,图形应用程序就可以直接将压缩纹理当作非压缩纹理使用,即直接将压缩纹理传递给gpu进行渲染或变换处理;反之,如果不支持,图形应用程序则需要通过图形模拟库采用cpu将压缩纹理解码成非压缩纹理,再对非压缩纹理执行后续的渲染处理。然而,采用cpu解码压缩纹理的过程非常耗时,一般情况下解码大小为1mb左右的astc格式的压缩纹理需要的时长超过100ms,这严重降低了图形应用程序的渲染帧率,影响了用户使用。


技术实现要素:

3.有鉴于此,本发明提供了一种基于自适应解码缓存的压缩纹理渲染优化方法,实现了应用程序运行中压缩纹理的一次解码持续使用提升了图形渲染的流畅性。
4.本发明提供的一种基于自适应解码缓存的压缩纹理渲染优化方法,包括以下步骤:步骤1、获取当前启动的应用程序的标识值,根据该标识值查找纹理缓存元信息,若存在则将纹理缓存元信息读入纹理历史信息列表,执行步骤2;否则以标识值为关键字新建纹理缓存元信息,并将纹理缓存元信息读入纹理历史信息列表,执行步骤2;所述纹理缓存元信息包括应用程序所使用纹理的纹理索引、纹理缓存、纹理缓存格式、纹理缓存文件、纹理缓存历史格式、纹理使用次数及关联纹理列表;步骤2、在应用程序执行过程中,当纹理被使用时获取纹理的当前纹理索引及当前纹理格式,根据当前纹理索引在纹理历史信息列表中查找对应的纹理,若存在则将该纹理的纹理使用次数自加1;否则在纹理历史信息列表中新建纹理,并将该纹理的纹理索引设置为当前纹理索引且将纹理使用次数设置为1;若当前纹理为压缩纹理则执行步骤3,否则执行步骤4;步骤3、设定遍历节点数,在纹理历史信息列表中选取与遍历节点数相等数量的纹理,将当前纹理的纹理索引加入到这些纹理的关联纹理列表的尾部;若当前纹理的纹理缓存及纹理缓存文件均为空,则采用cpu解码当前纹理得到解码结果,为解码结果分配内存并将解码结果保存在纹理缓存中,以解码结果的格式更新纹理缓存格式,再将解码结果的格式去重添加到纹理缓存历史格式中;若当前纹理的纹理缓存为空且纹理缓存文件不为空,则将纹理缓存文件读入纹理缓存中;将当前纹理的关联纹理列表的纹理缓存读入内存;根据当前纹理的纹理缓存中的数据为当前纹理创建非压缩纹理对象,且将当前纹理索引绑定到该非压缩纹理对象,执行步骤5;步骤4、遍历当前纹理的关联纹理列表中的关联纹理,当其存在于纹理历史信息列
表中且其纹理缓存为空时,若预加载纹理缓存空间小于阈值则根据其纹理缓存文件的大小分配内存作为纹理缓存,并将纹理缓存文件内容保存到纹理缓存中,采用纹理缓存文件大小与预加载纹理缓存空间的和更新预加载纹理缓存空间;若预加载纹理缓存空间不小于阈值则不处理;步骤5、当应用程序执行完毕卸载纹理时,以预加载纹理缓存空间的大小减去卸载纹理对应的纹理缓存文件大小的结果更新预加载纹理缓存空间,结束本流程。
5.进一步地,所述步骤1中所述标识值为应用程序的二进制代码的哈希值。
6.进一步地,所述步骤2中还包括:根据纹理操作所采用的函数名称判断当前被使用的纹理是否为压缩纹理。
7.进一步地,所述步骤3中的所述设定遍历节点数的方式为:获取纹理历史信息列表中的纹理数量m及当前纹理的关联纹理列表中纹理的数量n,以m和n的较小值作为遍历节点数。
8.进一步地,所述步骤3中还包括:若当前纹理的纹理缓存历史格式中格式数量大于1,则对纹理缓存历史格式中的每个历史格式执行以下操作,在纹理历史信息列表中查找纹理索引为当前纹理索引且纹理缓存格式为历史格式的纹理,若不存在则在纹理历史信息列表中增加以当前纹理索引为纹理索引、以历史格式为纹理缓存格式的新纹理,将新纹理的纹理使用次数设置为1,将新纹理的纹理缓存设置为根据当前纹理的纹理缓存转换成的格式为历史格式的纹理内容;若存在则不做处理。
9.进一步地,所述步骤4中所述遍历当前纹理的关联纹理列表中的关联纹理的方式为:先根据关联纹理列表中所有关联纹理的纹理使用次数由大到小对关联纹理排序形成有序关联纹理列表,再从前到后依次选择所述有序关联纹理列表中的关联纹理。
10.进一步地,所述步骤4中还包括:当执行纹理合并操作时,若待合并的纹理均为压缩纹理且其中一个具有gpu支持的压缩纹理格式,则采用cpu解码两个待合并压缩纹理后再执行纹理合并操作。
11.进一步地,所述步骤5中还包括:若当前为应用程序的第一次保存纹理操作,则通过磁盘过滤驱动挂起非系统磁盘的写操作,然后将各纹理的纹理缓存及关联纹理列表中关联纹理的纹理缓存顺序保存到该非系统磁盘中,最后再恢复该非系统磁盘的写操作。
12.有益效果
13.本发明通过在应用程序运行中缓存gpu不支持解码的压缩纹理的解码结果以及与其相关联的纹理,当再次使用该压缩纹理时自适应地加载解码结果及预加载关联纹理完成纹理的渲染,由此实现了压缩纹理的一次解码持续使用,从而显著减少了压缩纹理解码所需的cpu开销,提升了图形渲染的流畅性。
具体实施方式
14.下面列举实施例,对本发明进行详细描述。
15.本发明提供了一种基于自适应解码缓存的压缩纹理渲染优化方法,其核心思想是:在压缩纹理首次被解码后将解码得到的非压缩纹理保存到内存中,并记录纹理的使用方式、使用频率和相关纹理间的关联关系,再次使用压缩纹理时则直接加载解码结果并预加载其关联纹理完成纹理的渲染。
16.本发明提供的一种基于自适应解码缓存的压缩纹理渲染优化方法,具体包括以下步骤:步骤1、获取当前启动的应用程序的标识值,根据该标识值查找纹理缓存元信息,若存在则将纹理缓存元信息读入纹理历史信息列表,执行步骤2;否则以标识值为关键字新建纹理缓存元信息,并将纹理缓存元信息读入纹理历史信息列表,执行步骤2。
17.其中,纹理缓存元信息由应用程序所使用的纹理的相关信息组成。纹理的相关信息包括纹理索引、纹理缓存、纹理缓存格式、纹理缓存文件、纹理缓存历史格式、纹理使用次数及关联纹理列表。纹理索引是指纹理的标识值,该标识值为全局唯一且与应用程序的启动次数无关;纹理缓存为压缩纹理被解码后的数据,初始值为空,非压缩纹理的纹理缓存也为空;纹理缓存格式是指压缩纹理当前使用的被解码后的格式,例如rgb、rgba、yuv等;纹理缓存文件是指压缩纹理被解码后保存为文件的文件全路径,非压缩纹理的纹理缓存文件为空;纹理缓存历史格式是指压缩纹理曾使用的被解码后的格式,同一压缩纹理的纹理缓存格式可能会有多个,非压缩纹理的纹理缓存历史格式为空;纹理使用次数是指纹理在应用程序执行过程中被使用的次数,初始值为0;关联纹理列表是指在当前纹理被使用之后被使用的n个压缩纹理索引的列表,初始值为空链表。
18.本发明中,应用程序的标识值可为应用程序的二进制代码的哈希值。
19.步骤2、在应用程序执行过程中,当纹理被使用时获取纹理的当前纹理索引以及当前纹理格式,根据当前纹理索引在纹理历史信息列表中查找对应的纹理,若存在则将该纹理的纹理使用次数自加1;否则在纹理历史信息列表中新建纹理,并将该纹理的纹理索引设置为当前纹理索引且将纹理使用次数设置为1;若当前纹理为压缩纹理则执行步骤3,否则执行步骤4。
20.本发明中,可根据纹理操作所采用的函数名称来判断当前被使用的纹理是否为压缩纹理。
21.步骤3、获取纹理历史信息列表中的纹理数量m及当前纹理的关联纹理列表中纹理的数量n,以m和n的较小值作为遍历节点数,在纹理历史信息列表中选取与遍历节点数相等数量的纹理,将当前纹理的纹理索引加入到这些纹理的关联纹理列表的尾部;若当前纹理的纹理缓存及纹理缓存文件均为空,说明该压缩纹理未被解码过,则采用cpu解码该压缩纹理,为解码结果分配内存并将解码结果保存在纹理缓存中,并以解码结果的格式更新纹理缓存格式,再将解码结果的格式去重添加到纹理缓存历史格式中;若当前纹理的纹理缓存为空,纹理缓存文件不为空,则将纹理缓存文件读入纹理缓存中;并将当前纹理的关联纹理列表的纹理缓存读入内存;根据当前纹理的纹理缓存中的数据为当前纹理创建非压缩纹理对象,且将当前纹理索引绑定到该非压缩纹理对象;执行步骤5。
22.为进一步地提高压缩纹理的渲染效率,若当前纹理的纹理缓存历史格式中格式数量大于1,则对于纹理缓存历史格式中的每个历史格式执行:在纹理历史信息列表中查找纹理索引为当前纹理索引且纹理缓存格式为历史格式的纹理,若不存在则在纹理历史信息列表中增加以当前纹理索引为纹理索引、以历史格式为纹理缓存格式的新纹理,将新纹理的纹理使用次数设置为1,将新纹理的纹理缓存设置为根据当前纹理的纹理缓存转换成的格式为历史格式的纹理内容;若存在则不做处理。
23.步骤4、遍历当前纹理的关联纹理列表,根据关联纹理列表中所有关联纹理的纹理
使用次数由大到小对关联纹理排序形成有序关联纹理列表;从前到后依次选择有序关联纹理列表中的关联纹理,当其存在于纹理历史信息列表中且其纹理缓存为空时,若预加载纹理缓存空间小于阈值则根据其纹理缓存文件的大小分配内存作为纹理缓存,并将纹理缓存文件内容保存到纹理缓存中,采用纹理缓存文件大小与预加载纹理缓存空间的和更新预加载纹理缓存空间;若预加载纹理缓存空间不小于阈值则不处理;执行步骤5。
24.进一步地,当执行纹理合并操作时,若待合并的纹理均为压缩纹理且其中一个具有gpu支持的压缩纹理格式,则采用cpu解码两个待合并压缩纹理后再采用gpu执行纹理合并操作。通过上述操作防止由于gpu中同时出现压缩纹理和非压缩纹理而导致的无法执行纹理合并操作的问题。
25.步骤5、当应用程序执行完毕卸载纹理时,以预加载纹理缓存空间的大小减去卸载纹理对应的纹理缓存文件大小更新预加载纹理缓存空间;若当前为应用程序的第一次保存纹理操作,则采用非系统磁盘保存纹理历史信息列表中各纹理的纹理缓存数据,再通过磁盘过滤驱动挂起该非系统磁盘的写操作,然后将各纹理的纹理缓存及关联纹理列表中关联纹理的纹理缓存顺序保存到该非系统磁盘中,最后恢复该非系统磁盘的写操作,结束本流程。
实施例
26.本实施例中采用本发明提供的一种基于自适应解码缓存的压缩纹理渲染优化方法实现压缩纹理的渲染,具体包括以下步骤:s1、根据当前启动的应用程序二进制文件的哈希值,加载对应的压缩纹理缓存信息,将压缩纹理缓存信息读入texturehistory。
27.其中,texturehistory为一个列表,列表的每个成员的数据结构为tex_stat,tex_stat包括纹理索引texindex、 纹理缓存decodedtexbuffer、纹理缓存格式decodedtexformat、纹理缓存文件decodedtexfile、纹理缓存历史格式formatlist、纹理使用次数texusagecount、关联纹理列表followedtextures。
28.s2、应用程序运行中,监视压缩纹理和非压缩纹理的使用,实现对首次解码的压缩纹理的缓存,及压缩纹理缓存结果的自适应加载,并记录纹理使用方式、使用频率和相关纹理的关联(在内存中建立一个关联数据库)。
29.本实施例,通过修改图形库的实现。如opengl或者opengl es中修改glcompressedteximage1d、glcompressedteximage2d、glcompressedteximage3d函数监视压缩纹理的完整解码和加载过程,通过修改 glcompressedtexsubimage2d、glcompressedtexsubimage3d监视压缩纹理的部分解码和加载过程,通过修改glteximage1d、glteximage2d、 glteximage3d监视非压缩纹理的加载过程。
30.s2.1、根据当前函数名判断当前是1d、2d还是3d纹理,也可以获取当前是压缩纹理还是非压缩纹理,获取当前图形上下文context的活跃1d/2d/3d纹理的id,将此id记为activetextureid。
31.由glbindtexture设置,任意时刻一个图形线程中仅会有存在一个处于活跃状态的1d/2d/3d纹理。
32.s2.2、获取activetextureid对应的索引,记为activetextureindex,此索引是全
局唯一,仅与纹理的内容相关与应用启动次数无关。
33.s2.3、在texturehistory中搜索texindex为activetextureindex的节点:如存在,则将该节点的texusagecount自加1;否则,新建一个tex_stat的变量texstat,将其texindex设置为activetextureindex,将texusagecount设置为1,将函数参数中的format去重后加入formatlist。
34.s2.4、若当前纹理为压缩纹理,则在texturehistory中遍历min(n,texturehistory节点个数)个节点,将activetextureindex加入到这些节点的followedtextures的尾部;在texturehistory中搜索texindex为activetextureindex的节点,如未解码则执行cpu的压缩纹理解码操作,再根据解码结果分配decodedtexbuffer内存,并将解码内容保存到decodedtexbuffer;在texturehistory中找到texindex为activetextureindex的节点,此时其decodedtexbuffer如为空,则将其decodedtexfile的内容读入decodedtexbuffer,并读入此节点followedtextures中包含的内容;如formatlist中格式个数大于1,则对于其中的每一个decodedformat,执行:在texturehistory搜索texindex为activetextureindex、且decodedtexformat为decodedformat的节点,如不存在则基于decodedtexformat为每个decodedformat新建一个tex_stat的变量texstat,将其texindex设置为activetextureindex,将texusagecount设置为1,将其decodedtexformat设置为decodedformat,基于之前的decodedtexbuffer生成格式为decodedformat的decodedtexbuffer。
35.根据当前函数的format参数搜索在上一步中找到或者创建的tex_stat节点,基于节点的decodedtexbuffer创建非压缩纹理对象image,且将该压缩纹理的id绑定到非压缩纹理对象image。其中,该压缩纹理的id为图形加速库内部维护的纹理id,即glbindtexture的第二个参数。
36.s2.5、如当前不是压缩纹理,且在texturehistory中存在texindex为activetextureindex的节点,则遍历其followedtextures链表,按照该链表每个节点的texusagecount进行排序,texusagecount越大越靠前,排序后的列表记为sortedfollowedtextures。
37.对于sortedfollowedtextures中的每个节点包含的压缩纹理的compressedtexindex执行:在texturehistory中查找compressedtexindex对应的节点,如存在则判断decodedtexbuffer是否为空,为空则判断preloadeddecodedtexbuffersize的大小是否超过阈值,例如阈值为800mb,如小于阈值则:a) 、根据decodedtexfile文件大小分配decodedtexbuffer,并将decodedtexfile的内容读入到decodedtexbuffer;b) 、以preloadeddecodedtexbuffersize加上decodedtexfile文件大小的值更新preloadeddecodedtexbuffersize;若不小于阈值则不处理。
38.如不存在,则重新执行上述步骤完成压缩纹理的解码,并分配内存存储。
39.此外,对followedtextures链表中的节点的排序,也可按照使用时间顺序进行排
序。
40.s3、监视纹理合并的操作,如合并的纹理为两个压缩格式纹理,且其中仅有一个是gpu支持的压缩纹理则将gpu支持的压缩纹理强制使用cpu解码,解码后执行上述操作后再执行纹理合并操作。
41.s3、纹理卸载时,将texturehistory保存到磁盘文件,若为第一次保存解码后的纹理,则优先将decodedtexbuffer保存到非系统磁盘,以避免后续的挂起非系统磁盘写操作影响系统i/o性能;通过磁盘过滤驱动挂起decodedtexbuffer保存到的非系统磁盘的写操作;再对texturehistory中的每个压缩纹理节点执行以下操作,将其decodedtexbuffer和其followedtextures中的压缩纹理的decodedtexbuffer,顺序依次保存;恢复非系统磁盘写操作;同时,减小preloadeddecodedtexbuffersize的值。
42.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1  
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
网站地图