博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
讨论cocos2d-x字体绘制原理和应用方案
阅读量:4920 次
发布时间:2019-06-11

本文共 1904 字,大约阅读时间需要 6 分钟。

转自: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字形资源。

 

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

转载于:https://www.cnblogs.com/fwycmengsoft/p/3644709.html

你可能感兴趣的文章
flutter AS 打包
查看>>
Python webpy微信公众号开发之 回复图文消息
查看>>
ubuntu多版本cuda并存与切换【两个博客链接】
查看>>
html5新特性之DOCTYPE声明
查看>>
POJ 3299 Humidex 难度:0
查看>>
快速切题 poj3414 Pots
查看>>
Linux 常用命令
查看>>
五家共井(第1届第3题)
查看>>
c文件操作
查看>>
《Spring In Action》 读书笔记(2) -- bean装配 ...
查看>>
很好很強大..
查看>>
Oracle之子查询:Top-N问题
查看>>
PAT:1011. A+B和C (15) AC
查看>>
JS中的内置对象
查看>>
Android--在Android应用中愉快地写C/C++代码(转)
查看>>
IOSUIcontrol事件
查看>>
docker 部署spring.boot项目【一】(引用外部配置文件)
查看>>
CSS 巧用 :before和:after
查看>>
Winform——用户登陆
查看>>
【博客园IT新闻】博客园IT新闻 iPhone 客户端发布
查看>>