转自: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. Git 创建仓库

    本文将为大学介绍如何创建一个远程的Git仓库.您可以使用一个已经存在的目录作为Git仓库或创建一个空目录. 使用您当前的目录作为Git仓库,我们只需要使它初始化. git init 使用我们指定目录作 ...

  2. 关于数组中加入相同的view的试验

    随便新建一个工程,然后在控制器中粘贴如下代码 - (void)viewDidLoad { [super viewDidLoad]; UIView * view = [[UIView alloc]ini ...

  3. 【转】可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)

    原文地址:http://www.cnblogs.com/justnow/p/3382160.html (最新版本:V6.0,2017.12.11 .即将推出Xamarin移动端版本,包括 Androi ...

  4. Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)

    Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...

  5. Wpf ScrollBar自定义样式

    Wpf的ScrollBar可以分为六个区域:A.背景.B.向上按钮.C.向下的按钮.D.Track里面向上的按钮.E.Track里面向下的按钮.F.Track的Thumb 详情见下图 下面通过一个例子 ...

  6. memcache概念浅谈及名称混乱之区分

    关于memcache这个现在应用广泛的组件,大大提高的网站的响应速度,也方便了程序开发缓存的应用.但是目前针对memcache,网上的资料 大同小异,尤其基于LAMP的网站居多,php/pcel又有两 ...

  7. JDK1.9-新特性

    1. Java平台级模块系统 该特性使Java9最大的一个特性,Java提供该功能的主要的动机在于,减少内存的开销,JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.j ...

  8. Entity Framework "There is already an open DataReader associated with this 的解决办法

    解决办法: 1,修改连接串,加上MultipleActiveResultSets=true 2, 一次性先把数据读出来 var contacts = from c in db.Contact sele ...

  9. 浅谈 Objective-C 下对象的初始化

    转自:http://www.oschina.net/question/54100_32468 众所周知,Objective-C是一门面向对象的语言,一般情况下,我们在Objective-C中定义一个类 ...

  10. C# Lpt 并口热敏小票打印机打印位图

    class LptControl { private string LptStr = "lpt1"; public LptControl(string l_LPT_Str) { L ...