一种基于FreeType的双缓存文字统一快速渲染方法与流程

文档序号:33033005发布日期:2023-01-20 21:25阅读:47来源:国知局
一种基于FreeType的双缓存文字统一快速渲染方法与流程
一种基于freetype的双缓存文字统一快速渲染方法
技术领域
1.本发明涉及图形渲染应用软件技术领域,具体涉及一种基于freetype的双缓存文字统一快速渲染方法。


背景技术:

2.由于越来越多的文字显示需求,大量文字同时绘制导致渲染效率低,特别是在性能较低的系统上,文字显示速度慢的问题更加明显。如何提高文字渲染性能成为一个亟待解决的问题。


技术实现要素:

3.有鉴于此,本技术实施例提供一种基于freetype的双缓存文字统一快速渲染方法,实现了文字的快速渲染,解决了大量文字同时绘制导致渲染效率低的问题。
4.本技术实施例提供以下技术方案:一种基于freetype的双缓存文字统一快速渲染方法,包括:
5.在程序初始化时设置大纹理存储区、纹理更新缓存区和位图数据缓存区;所述大纹理存储区用于存储已绘制文字的字符纹理,所述纹理更新缓存区用于存储已绘制文字的字符编码,所述位图数据缓存区用于存储与所述字符编码对应的位图数据对象;
6.根据待绘制文字的字符编码和设定的字体大小,采用freetype生成对应的位图数据,使用opengl函数将该位图数据转换为字符纹理;将该字符纹理存储在所述大纹理存储区,将待绘制文字的字符编码存储在所述纹理更新缓存区,将位图数据存储在所述位图数据缓存区中对应的位图数据对象里;;
7.根据文字是否被绘制过和该文字的字符纹理是否在所述大纹理存储区中,设置位图数据对象的状态值,若该文字没有被绘制过,则状态值设置初始值0;若该文字被绘制过且字符纹理在所述大纹理存储区中,则状态值设置为1;若该文字被绘制过但字符纹理在所述大纹理存储区中被剔除,则状态值设置为2;
8.根据待绘制文字的字符编码索引到所述位图数据缓存区中的位图数据对象,获得位图数据、状态值、在大纹理存储区中的位置信息;
9.状态值为1时,可根据位置信息直接获得字符纹理,并在所述纹理更新缓存区找到对应的字符编码,将该字符编码更新至该纹理更新缓存区的第一位;
10.状态值为0时,使用freetype获得文字的位图数据,再使用opengl将位图数据生成字符纹理;
11.状态值为2时,取出位图数据对象中的位图数据,使用opengl将位图数据生成字符纹理;
12.使用opengl函数对字符纹理进行纹理贴图完成文字的渲染。
13.根据一种实施例,所述大纹理存储区和所述纹理更新缓存区的存储量相等,所述大纹理存储区存储的字符纹理与所述纹理更新缓存区存储的字符编码一一对应。
14.根据一种实施例,还包括:当状态值为0或2时,依据所述大纹理存储区的空间状态更新所述位图数据缓存区和所述纹理更新缓存区,具体包括:
15.所述大纹理存储区的空间状态未满时,将生成的字符纹理存储在所述大纹理存储区中,根据存储的位置信息更新文字对应的位图数据对象的位置属性并将其状态值设置为1,将对应的字符编码置于所述纹理更新缓存区的第一位;
16.所述大纹理存储区的空间状态满时,首先将所述纹理更新缓存区的最后一个字符编码取出,并根据该字符编码索引到所述位图数据缓存区中的对应位图数据对象,设置其状态值为2,然后根据位图数据对象的位置属性找到所述大纹理存储区中该字符纹理的位置信息,将其在所述大纹理存储区中替换成新生成的字符纹理,然后根据位置信息设置新绘制文字对应的位图数据对象的位置属性,并将其状态值设置为1,最后将新绘制文字的字符编码置于所述纹理更新缓存区的第一位。
17.根据一种实施例,还包括:
18.状态值设置为0时,该文字的位图数据对象中的位图数据和位置信息无效;
19.状态值设置为1时,该文字的位图数据对象中的位图数据和位置信息有效;
20.状态值设置为2时,该文字的位图数据对象中的位置信息无效,位图数据有效。
21.根据一种实施例,将字符纹理存储在所述大纹理存储区时,该字符纹理的宽高设置为字体的大小。
22.根据一种实施例,所述字符纹理以指示字符纹理存储的起始位置坐标为依据存储于所述大纹理存储区中,该起始位置坐标以字体大小为步长增加。
23.根据一种实施例,还包括:程序初始化时申请纹理缓存数组,所述纹理缓存数组包括:纹理坐标数组、颜色数组和绘制位置坐标数组;
24.当字符纹理生成后,先将字符纹理在所述大纹理存储区中的位置、文字颜色和其在屏幕上绘制的位置,分别存储到所述纹理坐标数组、颜色数组和绘制位置坐标数组中;再利用所述纹理缓存数组,使用opengl函数对每个字符纹理进行实时纹理贴图,对所有文字统一渲染。
25.与现有技术相比,本发明实施例减少了文字的渲染过程,避免了字符纹理实时纹理贴图时过多的opengl状态频繁的改变,从而提高文字快速渲染能力,提高文字渲染性能。
附图说明
26.为了更清楚地说明本技术实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
27.图1为本发明双缓存文字统一快速渲染流程图;
28.图2为本发明位图数据生成流程图;
29.图3为本发明纹理的创建与绘制流程图;
30.图4为本发明字符纹理存储示意图。
具体实施方式
31.下面结合附图对本技术实施例进行详细描述。
32.需要说明的是,在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
33.如图1所示,本发明实施例提供了一种基于freetype的双缓存文字统一快速渲染方法,包括:
34.在程序初始化时设置大纹理存储区、纹理更新缓存区和位图数据缓存区;所述大纹理存储区用于存储已绘制文字的字符纹理,所述纹理更新缓存区用于存储已绘制文字的字符编码,所述位图数据缓存区用于存储与所述字符编码对应的位图数据对象;其中,所述大纹理存储区和所述纹理更新缓存区的存储量相等,所述大纹理存储区存储的字符纹理与所述纹理更新缓存区存储的字符编码一一对应。
35.根据待绘制文字的字符编码和设定的字体大小,采用freetype生成对应的位图数据,使用opengl函数将该位图数据转换为字符纹理;将该字符纹理存储在所述大纹理存储区,将待绘制文字的字符编码存储在所述纹理更新缓存区,对待绘制文字的每一个字符编码对应设置一个位图数据对象,并存储于所述位图数据缓存区;位图数据对象包括该文字的位图数据、其字符纹理是否在大纹理中的状态值、在大纹理中的位置信息等属性。
36.根据文字是否被绘制过和该文字的字符纹理是否在所述大纹理存储区中,设置状态值,若该文字没有被绘制过,则状态值设置为0,位图数据对象中的位图数据和位置信息是无效的;若该文字被绘制过且字符纹理在所述大纹理存储区中,则状态值设置为1,位图数据对象中的位图数据和位置信息有效;若该文字被绘制过但字符纹理在所述大纹理存储区中被剔除,则状态值设置为2,位图数据对象中的位置信息是无效的,但位图数据有效。
37.在渲染文字时根据待绘制文字的字符编码索引到所述位图数据缓存区中的位图数据对象,获得位图数据、状态值、在大纹理存储区中的位置信息;
38.状态值为1时,可根据位置信息直接获得字符纹理,并在所述纹理更新缓存区找到对应的字符编码,将该字符编码更新至该纹理更新缓存区的第一位;
39.状态值为0时,使用freetype获得文字的位图数据,再使用opengl将位图数据生成字符纹理;
40.状态值为2时,取出位图数据对象中的位图数据,使用opengl将位图数据生成字符纹理;
41.使用opengl函数对字符纹理进行纹理贴图完成文字的渲染。
42.状态值为2时,可以直接取出位图数据对象的位图数据,避免了freetype生成位图数据过程,然后再使用opengl将位图数据生成字符纹理,而状态置为1时可以直接获得字符纹理,这有效提高了渲染效率。
43.当状态值为0或2时,依据所述大纹理存储区的空间状态更新所述位图数据缓存区和所述纹理更新缓存区,具体包括:
44.所述大纹理存储区的空间状态未满时,将生成的字符纹理存储在所述大纹理存储区中,根据存储的位置信息更新文字对应的位图数据对象的位置属性并将其状态值设置为1,将对应的字符编码置于所述纹理更新缓存区的第一位;
45.所述大纹理存储区的空间状态满时,首先将所述纹理更新缓存区的最后一个字符编码取出,并根据该字符编码索引到所述位图数据缓存区中的对应位图数据对象,设置其状态值为2,然后根据位图数据对象的位置属性找到所述大纹理存储区中该字符纹理的位置信息,将其在所述大纹理存储区中替换成新生成的字符纹理,然后根据位置信息设置新绘制文字对应的位图数据对象的位置属性,并将其状态值设置为1,最后将新绘制文字的字符编码置于所述纹理更新缓存区的第一位。
46.在本技术一种实施例中,将字符纹理存储在所述大纹理存储区时,该字符纹理的宽高设置为字体的大小,而不是字形数据中字符的真实宽高。这样可以避免在纹理更新时,如果被替换的字符的真实宽高小于新纹理的真实宽高,周围的其它字符纹理可能被压盖;如果被替换的字符的真实宽高大于新纹理的真实宽高,被替换的字符纹理将有残留。字符纹理以指示字符纹理存储的起始位置坐标为依据存储于大纹理中,然后起始位置坐标以字体大小为步长增加。纹理贴图阶段需要取出相应的字符纹理,此时要依据字符纹理的真实宽高取出,这样可以保证文字绘制的准确性。
47.在本技术一种实施例中,程序初始化时申请纹理缓存数组,所述纹理缓存数组包括:纹理坐标数组、颜色数组和绘制位置坐标数组;
48.当字符纹理生成后,先将字符纹理在所述大纹理存储区中的位置、文字颜色和其在屏幕上绘制的位置,分别存储到所述纹理坐标数组、颜色数组和绘制位置坐标数组中;当所需要绘制的文字的字符纹理全部生成之后,纹理缓存数组具有了这些文字的对应的信息,然后利用纹理缓存数组进行纹理贴图过程,使用opengl函数对每个字符纹理进行实时纹理贴图,对所有文字统一渲染,减少了文字绘制过程中纹理开关频繁切换造成的文字渲染时间过长的问题。
49.本发明的方法基于freetype生成位图数据,然后利用opengl函数将位图数据转换为字符纹理,最后使用opengl函数进行纹理贴图完成文字的渲染。本发明使用大的空纹理保存已绘制的字符纹理,再使用一个缓存实现大纹理字符纹理的更新,另一个缓存保存生成的位图数据等信息。当文字再次绘制时,通过取出大纹理中该文字的字符纹理或者取出该文字的位图数据的方式,简化了文字渲染的过程,从而提高了渲染速率。本发明还构建纹理坐标数组、颜色数组和绘制位置坐标数组,用于存储文字对应字符纹理在大纹理中的位置、文字颜色和其在屏幕上绘制的位置,通过统一渲染所有文字的方式减少了字符纹理实时纹理贴图时过多的opengl状态改变次数,提高了渲染性能。
50.下面结合附图和具体实施例,对本发明的具体实施方式进一步详细说明。
51.本实施例的双缓存文字统一快速渲染方法,具体如下:
52.(1)使用freetype读取simhei.ttf字体文件,并根据设定的字体大小(16)生成字体对象;
53.(2)根据待绘制文字的字符编码使用ft_get_char_index函数在字体对象中索引到字形索引,然后通过ft_load_glyph函数装载对应的字形映像,最后通过ft_render_glyph函数将轮廓渲染成位图数据,生成位图数据的流程图,如图2所示。使用opengl的glteximage2d函数将位图数据生成字符纹理,字体纹理的宽高均为字体大小(16),纹理的创建与绘制流程图,如图3所示;
54.(3)程序初始化时申请大的空纹理的大小为1024*1024,申请大小为64*64的纹理
更新缓存的列表,申请位图数据缓存,位图数据缓存的大小应不小于字体对象中字形的数量(65536),其索引为字符编码;
55.(4)使用位置坐标x,y分别表示字符纹理存储到大纹理的位置,初始为0;
56.(5)当绘制文字时,利用列表的模板函数将其字符编码放置在最前面,将字符纹理存储到大纹理的x.y位置并以字体大小更新x,y的值,字符纹理在大纹理中存储的示意图,如图4所示,字符纹理存储在比自身宽高大的区域会有部分空白区域。根据字符编码在位图数据缓存中找到位图数据对象,更新其位图数据、状态值和在大纹理中的位置;
57.(6)将待绘制文字的字符纹理在大纹理中的位置、文字颜色和其在屏幕上绘制的位置存储到纹理缓存数组中;
58.(7)开启纹理使能,设置纹理环境,根据纹理缓存数组进行统一渲染。
59.以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1