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像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时 ...
随机推荐
- ORACLE的分组统计之ROLLUP(一)
Oracle 9i以后,扩展了group by 的功能,能够满足大部分多维数据的分析统计功能,主要表现: 1. rollup,cube,grouping sets 扩展group by字句提供了丰富的 ...
- 关于lua垃圾回收是否会执行__gc函数呢?
直接上代码 -- test.lua do local x = setmetatable({},{ __gc = function() print("works") end }) e ...
- Iframe跨域_ASP.NET
1.描述: A系统 需要 调用 B系统的页面,被调用的B系统的页面b.html内部嵌套了iframe框架c.aspx地址页 2.问题呈现: ie浏览器下 Chrome浏览器下 追踪 3.问题原因: X ...
- hive安装配置错误
1.Access denied for user 'hive'@'localhost' (using password: YES) 解决办法: 执行 hive --service metastore ...
- [javascript|基本概念|Unll]学习笔记
Uull类型的值:null(只有一个)|空对象指针|typeof操作符返回object 作用:一般用于对即将保存对象但不知具体对象的引用 特殊:null == undefined --> tru ...
- JavaScript中Array的一些实用操作技巧
最近在调试JSP页面时频繁与ajax打交道,在复杂场景下,ajax传参数就需要对大量参数进行处理.这时我才发现,熟练Array的处理真的会使开发轻松不少!! 关于Array Array的创建很灵活,可 ...
- activiti搭建(二)与Spring集成
转载请注明源地址:http://www.cnblogs.com/lighten/p/5876773.html 本文主要讲解如何将Activiti和Spring框架集成,再过一段时间将会将一个基础的de ...
- jquery.validate.js
jquery.validate.js使用记录 首先到JQ官网下载搜索validate插件,下载相关源码,附上validate官网网址 https://jqueryvalidation.org/ 找到v ...
- Oracle10G的Sga_max_size和sga_target应该如何设置啊!
1调整原因 我们的客户反应现在我们公司的软件使用起来比较漫.目前他们已经用快要两年了.根据用户反应的情况,公司派我到现场做数据库调优.我在现场走访了几个部门,也向操作人员了解了一些情况.我初步分析认定 ...
- Template、ItemsPanel、ItemContainerStyle、ItemTemplate
先来看一张图(网上下的图,加了几个字) 1.Template是指控件的样式 在WPF中所有继承自contentcontrol类的控件都含有此属性,(继承自FrameworkElementdl类的Tex ...