iOS上用FTGL显示定制Truetype字体碰到的问题
没想到这个问题搞了快2个月时间;当然跟我只是断断续续地工作有关。
FTGL是freetype的opengl实现。我接触FTGL最初只是为了练习OpenGL,写几个简单的游戏app。开始试了试FTGL觉得挺简单好用,不需要太熟悉OpenGL底层的东西,于是决定在自己的一个app中正式加入用FTGL显示艺术True type字体的功能,预计应该很快能完成吧。
开始进展很顺利,似乎即将大工告成,结果最后突然发现一个问题:艺术字体(中文)显示若干段落以后,突然渲染不正常,总是显示一些混乱的字符;排除了应用逻辑错误以后,确定是FTGL库的问题,就此开始了漫长的调试过程。
我对OpenGL很不熟悉,前两个月由于另外一个项目中用到一点GL,看了点开发文档,弄完后其实也没打算要深入研究。没想到现在碰到这种问题,放弃又不甘心,为了调试FTGL库,不得已开始投入点精力开始研究GL。
尝试了一些跟踪后,出错的大致原因清楚了:我大概是运气太好,一开始就选用了FTTextureFont. FTGL显示Texture字体时,首先从ttf文件中创建face,根据用户要显示的字符串,读取face中的glyph,然后生成bitmap,这个bitmap没法保存在内存里,所以FTGL会把这些bitmap都一个个写到GPU的一张texture里面。问题是texture大小总是有限的,所以FTGL支持多个texture,即一旦一个texture被写满了以后,就创建一个新的texture,直到用完GPU内存。而我碰到的问题就在前一个texture被写满,创建一个新的texture之后,字符显示开始混乱;
但是我还是觉得这个问题很奇怪:FTGL库是个很老的库,并且据我查过开发版本这个支持多texture的功能在2010年的时侯就支持了,难道这么多年我是第一个碰到这个bug的人吗?FTGL库看代码作者水平还是比较高的,这个bug难道他没有测试发现吗?
没办法,搜了好几天除了有一个哥们在某个论坛提到过一句类似的情况,就再也没有任何线索;而且这个哥们居然很认命地就把这个问题当作FTGL固有的限制,毫无一点反抗的意图,居然建议改用PolygonFont或BufferFont:-(
仔细研究了几天FTGL的代码,横看竖看看不出问题;是iOS移植的问题?是iPhone硬件的限制?还是缓存的问题?猜测过各种错误原因最后都证明不靠谱;今天下午被另外一则坏消息狠狠打击了一下之后,脑袋灵光一闪,突然想到啊,莫非是这样?。。。
果然还是FTGL作者添加multiple texture支持时,考虑欠周到,测试估计也没做(其实是个挺明显的bug,但凡测试用例覆盖就会暴露);由于多个texture的存在,FTGL渲染时需要在多个texture之间切换时,没考虑到一个字符串里不同的字符的bitmap缓存可能位于不同的texture里,还是用了同一个texture做渲染,自然会出问题了。
考虑两种方法修改,一是采用multitexturing技术,这个听起来应该会比较酷,性能应该好点,但是要比较多时间;另外就是把原来一个字符串作为单位渲染改为逐个字符渲染,性能不一定好,不过就2行代码解决问题啦,自然就先这么干,以后有时间再做计较吧 :-)
iOS上用FTGL显示定制Truetype字体碰到的问题的更多相关文章
- 图像处理---《在图片上打印文字 windows+GDI+TrueType字体》
图像处理---<在图片上打印文字 windows+GDI+TrueType字体> 刚开始使用的是putText()函数做,缺陷是只能显示非中文: 接着,看大多数推荐Freetype库来做 ...
- iOS在一个label中显示不同颜色的字体
UILabel *Label = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, 300, 30)]; NSMutableAttributedSt ...
- SpriteBuilder添加的TrueType字体未显示在log中的原因分析
按照书上的说法,在SpriteBuilder中添加的TrueType字体名称会在枚举字体方法显示的log中出现.但是运行程序后没有在log中发现对应的字体名称. 因为该字体是例子中作者制作的,所以字体 ...
- NSMutableAttributedString iOS 在UILabel显示不同的字体和颜色(转)
在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串,在iOS 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的attr ...
- vue中解决时间在ios上显示NAN的问题
最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...
- ios上 更改 状态栏(UIStatusBar)
摘要 ios上 更改状态栏(UIStatusBar)的颜色 ios UIStatusBar statusBar 状态栏 更改状态栏颜色 目录[-] IOS上 关于状态栏的相关设置(UIStatusBa ...
- IOS上 关于状态栏的相关设置(UIStatusBar)
知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...
- [开源]在iOS上实现Android风格的控件Toast
[开源]在iOS上实现Android风格的控件Toast iOS的风格和Apple其他产品一样,简单而粗暴.没有给人其他选择的余地,让你又爱又恨.同样的,Apple对待iOS平台的开发人员和对待大众消 ...
- ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏
IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...
随机推荐
- SQL 复制订阅 异常后 强制删除
最近做数据库同步备份工作,将 主库 通过SQLService 自带的 [复制] 订阅出去后,因为 订阅方(从库) 发生异常,主库 无法确定 从库的订阅,就想清理了,订阅重新做同步,结果.....主库上 ...
- Cocos2d-x标签文乱码问题
我们在Windows下使用Visual Studio 2012开发游戏的时候,使用标签中包含中文时候会出现乱码或无法显示,如下图所示: 而应该显示的中文是如下图所示: HelloWorldScene. ...
- Rhythmbox中文乱码解决办法
今天在网络上找到了一个比较好的解决Rhythmbox中文乱码的问题的方法 进入你的音乐文件夹执行如下代码: mid3iconv -e GBK *.mp3 如果没有提示多试几次,有可能系统会提示: py ...
- 【转】理解依赖注入(IOC)和学习Unity
IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection).作用:将各层的对象以松耦合的方式组织在一起,解耦,各 ...
- 【转】asp.net mvc3 简单缓存实现sql依赖
asp.net mvc3 简单缓存实现sql依赖 议题 随 着网站的发展,大量用户访问流行内容和动态内容,这两个方面的因素会增加平均的载入时间,给Web服务器和数据库服务器造成大量的请求压力.而大 ...
- 《Linux系统free命令的使用》学习笔记
free命令用于显示当前系统的内存空闲和使用情况,其中包括物理内存,交换分区内存,内核缓冲区内存以及高速缓存,free的参数报错一下: -b ——字节的方式显示内存使用情况 [root@redhat ...
- 错误解决mysql - Event Scheduler: No data - zero rows fetched, selected, or processed
当遇到一个NOT FOUND(无数据)的警告时,使用一个包含清除警告语句的条件句柄处理,就可以继续处理程序并退出句柄. 这个问题在MySQL5.6.3之后的版本已经解决了,所以该解决方法不是必要的. ...
- 一个Ctrl+V下的问题
对于电脑快捷键来说恐怕没什么比Ctrl+C和Ctrl+V更熟悉的了. 最近做了一个小程序,界面上有一个文本框,要做的事情就是把从别的地方复制内容后粘贴到文本框中,然后以自己处理后的格式显示出来. 为了 ...
- Silverlight自动根据屏幕分辨率进行布局
xaml: <UserControl x:Class="SLCenterLayout.MainPage" xmlns="http://schemas.microso ...
- (转)android底部弹出iOS7风格对话选项框(QQ对话框)--第三方开源--IOS_Dialog_Library
本文转载于:http://blog.csdn.net/zhangphil/article/details/44940339 完成这个效果的是使用了 IOS_Dialog_Library 下载地址:ht ...