没想到这个问题搞了快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字体碰到的问题的更多相关文章

  1. 图像处理---《在图片上打印文字 windows+GDI+TrueType字体》

    图像处理---<在图片上打印文字  windows+GDI+TrueType字体> 刚开始使用的是putText()函数做,缺陷是只能显示非中文: 接着,看大多数推荐Freetype库来做 ...

  2. iOS在一个label中显示不同颜色的字体

    UILabel *Label = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, 300, 30)]; NSMutableAttributedSt ...

  3. SpriteBuilder添加的TrueType字体未显示在log中的原因分析

    按照书上的说法,在SpriteBuilder中添加的TrueType字体名称会在枚举字体方法显示的log中出现.但是运行程序后没有在log中发现对应的字体名称. 因为该字体是例子中作者制作的,所以字体 ...

  4. NSMutableAttributedString iOS 在UILabel显示不同的字体和颜色(转)

    在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串,在iOS 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的attr ...

  5. vue中解决时间在ios上显示NAN的问题

    最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...

  6. ios上 更改 状态栏(UIStatusBar)

    摘要 ios上 更改状态栏(UIStatusBar)的颜色 ios UIStatusBar statusBar 状态栏 更改状态栏颜色 目录[-] IOS上 关于状态栏的相关设置(UIStatusBa ...

  7. IOS上 关于状态栏的相关设置(UIStatusBar)

    知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...

  8. [开源]在iOS上实现Android风格的控件Toast

    [开源]在iOS上实现Android风格的控件Toast iOS的风格和Apple其他产品一样,简单而粗暴.没有给人其他选择的余地,让你又爱又恨.同样的,Apple对待iOS平台的开发人员和对待大众消 ...

  9. ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏

    IOS上 关于状态栏的相关设置(UIStatusBar) 知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...

随机推荐

  1. iOS UIView简单缩放动画

    @interface ViewController () { UIView *animationView; UIButton *button; CGPoint animationPoint; } @e ...

  2. hexo资源--theme等

    Hexo (https://github.com/hexojs/hexo) [3]hexo你的博客(http://ibruce.info/2013/11/22/hexo-your-blog/) [4] ...

  3. 集合类学习之HashMap经典储存 分拣存储与面向对象组合

    HashMap:键值对(key-value) 通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value. 默认是1:1关系(一对一) 存在则覆盖,当key已经存在,则利用新的va ...

  4. Cocos2d-x移植到WindowsPhone8移植问题-libNetwork库移植问题

    Cocos2d-x提供了libNetwork库的源代码,而且还提供了libNetwork库的源代码Visual Studio 2012工程文件libNetwork.vcxproj,这样就更方便移植了. ...

  5. 以OpenGL方式运行Unity

    Unity在Windows上默认以DirextX的方式运行,在MacOS和Linux上默认以OpenGl的方式运行, 如果希望在Windows上以OpenGL的方式运行可以在命令行中输入 -force ...

  6. SQL Server 安装程序失败 不能在控件上调用 Invoke 或 BeginInvoke

    出现这种问题的原因是权限问题,怎么处理呢,使用管理员运行 如果这种方法不行,比如我的就不可以,点击右键 对各个权限对象重新添加完全控制权限. 我的电脑的情况是安装sql2010,然后安装sql管理工具 ...

  7. UI3_UITableView

    // // AppDelegate.m // UI3_UITableView // // Created by zhangxueming on 15/7/13. // Copyright (c) 20 ...

  8. 分享8款最新HTML5/CSS3功能插件及源码下载

    1.HTML5/CSS3鬼脸表情下拉菜单 超级可爱 这款HTML5/CSS3鬼脸表情下拉菜单真的很特别,虽然菜单的实现并没有利用复杂的HTML5/CSS3技术,但是创意的确不错. 在线演示 源码下载 ...

  9. Google面试题:计算从1到n的正数中1出现的次数

    题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 找工作,准备看写题目,题目说是Goo ...

  10. activiti系列导读

    此用于管理activiti系列标签文章,activiti的分析是建立在目前最新的版本5.21之上. 官方指导手册链接:http://www.activiti.org/userguide/index.h ...