转自:http://blog.csdn.net/langresser_king/article/details/9012789

个人一直认为,文字绘制是cocos2d-x最薄弱的环节。对于愤怒的小鸟之类的游戏,cocos2d提供的文字绘制功能已足够使用。但是对于一个mmo来说,则完全不够。一个优秀的mmo客户端必然会对其有进行优化和再封装的操作。

cocos2d-x支持两种文字绘制方式(均支持中英文),一种是CCLabelTTF,一种是CCLabelBmpFont。

CCLabelTTF原理是调用系统api绘制字形纹理到一张CCImage上面,然后将其作为CCSprite进行渲染。好处是支持系统绘制文字不需要附加字体文件(当然,如果有需要也可以使用自定义字体文件,但是本质还是系统api进行文字绘制。),文字排版和渲染效果相对较好(尤其是ios这种以文字渲染见长的系统)。  缺点是绘制文字速度慢,只要是文字绘制就会生成一张贴图,没有缓存机制。   没有提供获取字形矩阵的接口,上层无法进行再次排版(这就意味着上层无法做缓存机制,另外富文本渲染的时候也需要这种接口,否则就需要以牺牲效率为代价了)。

CCLabelBmpFont原理是通过字形生成工具预先生成一个字体文件(fnt的字体配置和png的字形纹理),好处是速度快,不耗内存。缺点是支持文字数目有限,所以只支持固定文字的渲染,如控件文字、物品名称等,如果是玩家姓名、聊天栏这类输入内容不定的,还是需要使用CCLabelTTF。

文字渲染后续值得优化的有两个方向:

1、直接使用freetype,然后就是正常的游戏引擎的文字处理方式,支持缓存,速度快,描边之类的效果也可以内嵌

2、从底层获取字形矩阵的接口,然后上层字行排版,这个可以兼容现有的代码,而且排版难度比我们想象中要低很多。

总结下,游戏固有内容的文字渲染推荐使用CCLabelBmpFont,输入内容不定的,选用CCLabelTTF

CCLabelBmpFont只支持一张png字形纹理图片(BatchNode绘制时需要保证贴图在一样纹理上面),但是很多bitmap font生成工具会生成多张png图片资源。我写了个python脚本用于合并多个png字形资源。

  1. import re, Image;
  2. def create(font):
  3. fp = open(font+".fnt", "r");
  4. data = [];
  5. files = [];
  6. for line in fp:
  7. if line.find("pages=2") != -1:
  8. line = line.replace("pages=2", "pages=1");
  9. elif line.find("file=") != -1:
  10. match = re.search("file=\"(?P<file>.+)\"", line);
  11. if match:
  12. files.append(match.group("file"));
  13. if line.find("id=0") == -1:
  14. continue;
  15. line = re.sub("file=\".+\"", "file=\"{0}\"".format(font +"_1.png"), line)
  16. elif line.find("page=1") != -1:
  17. match = re.search("y=(?P<y>[0-9]+)", line);
  18. y = int(match.group("y"));
  19. y += 512;
  20. line = re.sub("y=[0-9]+", "y={0}".format(y), line);
  21. data.append(line);
  22. fp = open(font + "_1.fnt", "w");
  23. fp.writelines(data);
  24. fp.close();
  25. height = 0;
  26. merge = Image.new("RGBA", (512, len(files) * 512), 0);
  27. for file in files:
  28. img1 = Image.open(file);
  29. merge.paste(img1, (0, height));
  30. height += img1.size[1];
  31. merge.save(font + "_1.png", quality=70);
  32. create("name_outline");

讨论cocos2d-x字体绘制原理和应用方案的更多相关文章

  1. Android View绘制原理分析

    推荐两篇分析view绘制原理比较好的文章,感谢作者的分享. <Android应用层View绘制流程与源码分析> <View 绘制流程>

  2. UIView的绘制原理

    当UIView调用setNeedDisplay之后, 系统会调用view对应layer的 setNeedsDisplay, 在当前runloop即将结束的时候调用CALayer的display方法. ...

  3. Android面试收集录12 View测量、布局及绘制原理

    一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...

  4. OpenGL字体绘制

    /* glfont.hpp sdragonx 2019-08-15 00:03:33 opengl字体类,提供初学者参考学习 opengl初始化之后,创建字体 font.init(L"微软雅 ...

  5. UIView绘制原理,异步绘制

    绘制原理 首先看一幅流程图 UIView调用setNeedsDisplay方法后,实际上并没有发生当前视图的绘制工作,而是在之后的某一时机进行绘制工作,为什么会在之后的某一时机进行绘制工作呢? 当UI ...

  6. Android-图像原理/绘制原理

    图像原理 先专门讲解图片,一想到图片有那些特点:    宽/高 格式jpg/jpeg/... 大小43.kb/... 图片是由像素点组成:像素点是正方形的,只是像素点很小很多,看起来可以拼接圆形⭕️, ...

  7. GR32 TImage32的图层绘制原理

    转载:http://blog.sina.com.cn/s/blog_491aced20100ded4.html TImage32的继承顺序如下:TCustomControl->TCustomPa ...

  8. view的绘制原理

    转:http://blog.csdn.net/berber78/article/details/42069301 自定义UI控件,需继承 View类或View的子类,并重载View类中的一些方法,不必 ...

  9. android自定义View的绘制原理

    每天我们都会使用很多的应用程序,尽管他们有不同的约定,但大多数应用的设计是非常相似的.这就是为什么许多客户要求使用一些其他应用程序没有的设计,使得应用程序显得独特和不同. 如果功能布局要求非常定制化, ...

随机推荐

  1. js jquery 结束循环

    js 中跳出循环用break,结束本次循环用continue,jqeruy 中循环分别对应 return false 和return true. jquery 中each循环 跳出用return tr ...

  2. Spring MVC 框架搭建及具体解释

    如今主流的Web MVC框架除了Struts这个主力 外.其次就是Spring MVC了,因此这也是作为一名程序猿需要掌握的主流框架.框架选择多了.应对多变的需求和业务时,可实行的方案自然就多了. 只 ...

  3. SSE,MSE,RMSE,R-square 指标讲解

    SSE(和方差.误差平方和):The sum of squares due to error MSE(均方差.方差):Mean squared errorRMSE(均方根.标准差):Root mean ...

  4. php里面的编码问题

    1 获取当前字符串的编码 $encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312",& ...

  5. HR问“预期薪资是多少”,这么说能加薪zz

    每年过完节,收好上一年的年终奖,身边人就开始蠢蠢欲动,招聘市场也异常火爆,节前各种裁员的新闻,过了个节都变成了“我们还要继续招人”. 年景不好,人才更是成了紧俏货.可现实中,我却发现,优质的人才未必能 ...

  6. Vivado使用技巧:封装自己设计的IP核

    概述   Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原理图设计的方式,只需要在其中调用设计好的IP核连线.IP核一部分来自于Xilinx ...

  7. Java中的四种引用类型,强引用,软引用,弱引用,虚引用

    对于Java中的垃圾回收机制来说,对象是否被回收的标准在于该对象是否被引用.因此,引用也是JVM进行内存管理的一个重要概念. Java中对象的引用一般有以下4种类型: 1强引用  2软引用  3弱引用 ...

  8. MySQL 错误号码 1449

    出现类似的问题是由于权限问题,授权给root所有sql权限即可: mysql> grant all privileges on *.* to root@"%" identif ...

  9. 获取真实的IE版本(转)

    IE 的浏览器模式和文本模式(二) 发表于 2013-09-07 Author: Jerry Qu 文章目录 判断真正的 IE 版本 JScript 引擎版本号 文本模式对 JScript 没影响? ...

  10. 机器学习算法( 七、AdaBoost元算法)

    一.概述 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法(meta-algorithm)背后的思路.元算法是对其他算法进行组合的一种方 ...