zoukankan      html  css  js  c++  java
  • 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行代码解决问题啦,自然就先这么干,以后有时间再做计较吧 :-)

  • 相关阅读:
    mock中测试private方法,不是mock
    PHP检测每一段代码执行时间
    Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.
    php返回HTTP状态码
    PHP获取今天、昨天、明天的日期
    memcache及其telnet命令使用详解
    PHP的json_encode中文被转码的问题
    PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
    php pack()函数详解与示例
    socket编程原理
  • 原文地址:https://www.cnblogs.com/rolandash/p/3746776.html
Copyright © 2011-2022 走看看