没想到这个问题搞了快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行代码解决问题啦,自然就先这么干,以后有时间再做计较吧 :-)

最新文章

  1. Oracle 实验四-七
  2. JS_ECMA基本语法中的几种封装的小函数
  3. mybatis数据库基本配置包括数据源事物类型等
  4. <转>梳理:提高前端性能方面的处理以及不足
  5. 采用现代Objective-C
  6. 【动态规划】【最长公共子序列】Vijos P1111 小胖的水果
  7. ActionFilterAttribute OnActionExecuting 获取参数
  8. The area面积计算
  9. JavaScript------for-in的使用方法
  10. iview 无法缓存的问题
  11. spring配置JNDI(Java Naming and Directory Interface,Java命名和目录接口)数据源
  12. 【Java每日一题】20170307
  13. 【通信】Jave代码中生成url http请求
  14. 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)
  15. redis HyperLogLog 基数估算
  16. IOS Key-Value Observing (KVO)
  17. android中完全退出当前应用程序的四种方法
  18. [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
  19. powerdesigner 修改name时code不修改
  20. Unity3d-Socket之龙一编年史network.dll分析(1)

热门文章

  1. 浅谈.NET Micro Framework性能优化 转自 软件中国
  2. iOS UIView简单缩放动画
  3. OSPF多区域配置
  4. 理解C#系列 / 核心C# / 枚举
  5. WCF之服务元数据
  6. jquery页面滚动,菜单固定到顶部
  7. 《JavaScript高级程序设计》心得笔记-----第三篇章
  8. Apache HTTP Server安装教程
  9. SUID或SGID程序中能不能用system函数
  10. Hadoop 的部署适用性(网上资料http://www.linuxidc.com/Linux/2013-10/92141.htm)