提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、关掉抗锯齿
  • 二、生成更好的bitmap
    • 1.TTF字体
    • 2.Hint
    • 3.更高清的bitmap
  • 字体类的代码

前言

在业余时间想自己用cocos2dx开发一款像素游戏,但是遇到了不少的坑,其中有一项就是字体方面的。使用一个像素TTF字体,但是始终很糊,便去找各种解决办法。下面是自己使用的方法。

一、关掉抗锯齿

核心函数:setAliasTexParameters();
之前做在使用一些像素材质时也用到过这个函数,cocos2dx正在很多都开启了自动抗锯齿,可以使用该函数关闭抗锯齿。

  • 对于label
    可以使用label->getFontAtlas()->setAliasTexParameters();[还需测试]
  • 对于TextFieldTTF
    可以对其进行继承,在每次draw之前对其生成的_batchNodes里面的每个SpriteBatchNode使用setAliasTexParameters();

二、生成更好的bitmap

我使用的像素字体,按照之前的理解,关闭抗锯齿应该就不会出现模糊问题了。可是字体虽然不是整体模糊了,却又很多的半像素块。于是开始了漫长的读源码之旅。

1.TTF字体

现在用的比较多的就是TTF矢量字体(轮廓字体)和点阵字体。

  • 点阵字体
    点阵字体描绘了用打字是用二维数组描绘了字体中对应部分的深度。故在缩放时容易失真产
    生成马赛克式的锯齿边缘,这时便可以用抗锯齿生成半透明块使其相对平滑。
  • ttf字体
    ttf字体是保存了每个字对应的轮廓,使用一系列数学运算来计算对应结果。这样在对应大小下的字便会生成对应大小的轮廓。使其在缩放时不易失真。

2.Hint

ttf字体在不同大小下回自动计算对应大小下的轮廓,可是最终显示到计算机屏幕上还是需要进行光栅化。在低像素下编有可能出现有些像素块对应不满一个格子的情况。就像下图一样:

而hint(提示)技术就是想通过抗锯齿和网格对齐的方式来使这种情况减少。

在freetype2中,字体往往可以被autohint(自动)来获取不错的效果。
在cocos2dx源码中有类似这样的层级(label使用ttf或者textfieldttf):

[label]visit();updateContent();alignText();[FontAtlas]prepareLetterDefinitions();[CCFontFreeType]getGlyphBitmap();[freetype]FT_Load_Char()

而bitmap,用于保存每个像素深度值的数组便由FT_Load_Char()产生。cocos2dx随后便通过这个bitmap和相关的输出信息来生成对应的材质。而cocos2dx在使用FT_Load_Char()时吧autohint给关了,具体原因未知。于是我就试着把这个参数给设置为打开(将LOAD_NO_AUTOHINT标记去掉),好在改这个cpp所用重新编译时间不长。

3.更高清的bitmap

打开后发现情况并没有好了很多,虽然半透明块减少了很多,但是仍然有不少,而且部分地方出现了线条大小不一的情况。于是log输出了一下对应的bitmap值。结果却是有缺项。便又去看了看cocos2dx是如何设置对应参数生成bitmap的。随后发现最终生成的bitmap大小和之前调用的FT_SET_CHAR_SIZE有关,具体是写为固定为dpi的(72)和fontsize变量。但是不管调大fontsize和dpi对应的值,其最终渲染出来的字都会变大。于是便想到手动写一个类继承了TextFieldTTF,并将fontSize调大生成更高清的bitmap,但同时又通过管理scale来让字体大小和原来一样。

字体类的代码

只是大概思路,还有很多可以完善的地方:

#include "ui-UiTextFieldTTFNA.h"Label * UiTextFieldTTFNA::create()
{CC_ASSERT(false, "");return nullptr;
}float UiTextFieldTTFNA::getScale() const
{return Node::getScale() * _precisionScale;
}void UiTextFieldTTFNA::setScale(float scale)
{Node::setScale(scale / _precisionScale);
}float UiTextFieldTTFNA::getPrecisionScale() const
{return _precisionScale;
}void UiTextFieldTTFNA::setPrecisionScale(float scale)
{auto fontSize = getFontSize();auto fontScale = getScale();_precisionScale = scale;setFontSize(fontSize);setScale(fontScale);
}float UiTextFieldTTFNA::getFontSize() const
{auto oldConfig = getTTFConfig();auto fontSize = oldConfig.fontSize;return fontSize / _precisionScale;
}void UiTextFieldTTFNA::setFontSize(float sizes)
{auto oldConfig = getTTFConfig();auto fontName = oldConfig.fontFilePath;auto fontSize = sizes * _precisionScale;TTFConfig ttfConfig(fontName, fontSize, GlyphCollection::DYNAMIC);setTTFConfig(ttfConfig);
}void UiTextFieldTTFNA::draw(Renderer * renderer, const Mat4 & transform, uint32_t flags)
{for (auto batchNode : _batchNodes){auto texture0 = batchNode->getTextureAtlas()->getTexture();auto texture1 = batchNode->getTexture();texture0->setAliasTexParameters();texture1->setAliasTexParameters();}TextFieldTTF::draw(renderer, transform, flags);
}UiTextFieldTTFNA * UiTextFieldTTFNA::textFieldWithPlaceHolder(const std::string & placeholder, const Size & dimensions, TextHAlignment alignment, const std::string & fontName, float fontSize)
{UiTextFieldTTFNA *ret = new (std::nothrow) UiTextFieldTTFNA();if (ret && ret->initWithPlaceHolder("", dimensions, alignment, fontName, fontSize)){ret->_precisionScale = 1.0f;ret->setPrecisionScale(3);ret->autorelease();if (placeholder.size() > 0){ret->setPlaceHolder(placeholder);}return ret;}CC_SAFE_DELETE(ret);return nullptr;
}UiTextFieldTTFNA * UiTextFieldTTFNA::textFieldWithPlaceHolder(const std::string & placeholder, const std::string & fontName, float fontSize)
{UiTextFieldTTFNA *ret = new (std::nothrow) UiTextFieldTTFNA();if (ret && ret->initWithPlaceHolder("", fontName, fontSize)){ret->_precisionScale = 1.0f;ret->setPrecisionScale(3);ret->autorelease();if (placeholder.size() > 0){ret->setPlaceHolder(placeholder);}return ret;}CC_SAFE_DELETE(ret);return nullptr;
}

尝试解决cocos2dx字体模糊时的一点收获相关推荐

  1. html页面字体缩小模糊怎么解决,如何解决网页字体模糊的问题

    我们在使用浏览器查看网页,有的时候有的网页字体比较模糊,都看不清楚字了.出现网页字体模糊的时候,我们可以去设置一下字体大小,应该就可以了.那遇到网页字体模糊这样的问题,我们应该要怎么去解决它好呢?接下 ...

  2. MacBook Big Sur 完美解决外接显示器 字体模糊、边缘不清 HIDPI 解决办法

    该文章转发MacBook Big Sur 完美解决外接显示器 字体模糊.边缘不清 HIDPI 解决办法 | 毕扬博客

  3. 计算机电脑桌面文字虚,字体模糊怎么调节 解决电脑字体模糊的方法大全详细图解...

    电脑字体模糊怎么办?我也没有现成的模糊图,反正就是网页浏览模糊的问题,有一部分是抗锯齿所致,抗锯齿把文字也抗锯齿,汉字不是很尖吗,抗锯齿后尖的部分会很模糊的. XP发生模糊这一问题的时候,按第一段就可 ...

  4. linux下解决chrome字体模糊

    1.下载微软雅黑 https://pan.baidu.com/s/1o7VqEX8#list/path=%2F 提取码: j68x 安装后在字体设置中替换即可 最好标题选粗体,别的看需求可以选择 2. ...

  5. 【技术贴】完美解决win7字体模糊!解决360浏览器在win7的标签字体图标模糊。最新办法收集。...

    装好了win7之后发现 怎么看都觉得win7的屏幕非常模糊,越看越模糊,越看越觉得是不是自己要求太高了.安装了360浏览器之后发现,我的浏览器里面的工具栏那个地方的所有文字都是模糊的仿佛蒙娜丽莎的微笑 ...

  6. 开篇:解决IE9字体模糊的问题(又称无法关闭ClearType)

    去年9月份到现在就没再写过技术博客,并不是因为我放弃了技术,而是我在公司内部创建了一个WIKI知识库,我习惯于把技术相关的内容都放在了上面,技术博客也就停止更新了,而现在想想还是蛮有必要继续写写技术博 ...

  7. 笔记本高分屏字体模糊_高分屏软件字体模糊的参考解决办法

    经过多年的发展,现在1080P的全高清显示屏正逐渐成为大多数笔记本的主流配置,高分屏带来了更精致.细腻的显示效果,让用户有了更好的视觉体验.但是也带了一些小问题,目前不少使用1080P高分屏笔记本用户 ...

  8. win10计算机管理字体糊,win10字体模糊如何解决

    win10系统是一款优秀的消费级别的系统,深受大家广泛好评.但是有些网友在使用时也会出现一些问题,比如win10字体模糊.接下来,我就给大家介绍一下解决win10字体模糊的解决方法,赶紧来瞧瞧吧 近来 ...

  9. wpf 字体模糊_WPF Effect 造成的字体模糊

    WPF 里面有个Effect ,暂且可以理解为 "特效" 分类. 但是有时候使用不恰当,容易出现各种毛病. 例如: 代码如下: 提示:Border 级使用 Effect 造成 Te ...

最新文章

  1. 73岁Hinton老爷子构思下一代神经网络:属于无监督对比学习
  2. MC, MCMC, Gibbs采样 原理实现(in R)
  3. java jar包示例_Java包getSpecificationVersion()方法和示例
  4. Android--Activity的跳转及Activity之间的数据传递
  5. BOOL与bool区别
  6. python 文件路径斜杠变成两道_Python文件操作---正斜杠与反斜杠
  7. 手机号码测试用例java_“邮箱”“验证码”“手机号码”输入框测试用例
  8. 阿姆斯特朗回旋加速喷气式阿姆斯特朗炮
  9. 让面试官哑口无言的JS奇葩知识,你遇到过吗?
  10. A19.从零开始前后端react+flask - 删除前后端数据
  11. HTTP Referer简介
  12. 【随笔】方波的表示、转换与应用
  13. CS5801HDMI转eDP/DP转换芯片资料|CS5801规格书
  14. CF411H 被遗忘的树 Havel定理 || 网络流
  15. 基于java(ssm)留学生交流互动论坛系统源码(java毕业设计)
  16. 如何终止forEach循环
  17. Apsara Clouder云计算专项技能认证:云服务器ECS
  18. 存储基础知识 - 传统存储 NAS SAN 和 分布式存储对比
  19. 小白快速变大神,零基础菜鸟应该怎么学编程
  20. 宇宙精密调治的再思《基督教与科学》第二十三课

热门文章

  1. 川信计算机组装维护,凉山州中学生技能大赛信息技术类竞赛总结
  2. 修改历史git提交用户名和邮箱错误,解决没有小绿点
  3. 负数在计算机中表示方法
  4. WBS 及 WBS字典
  5. 如何高效的学习JAVA?
  6. VScode+keil插件-取代keil开发不要太爽了
  7. python说话语音代码_Python文字转换语音,让你的文字会「说话」,抠脚大汉秒变撒娇萌妹...
  8. 八拜之交是指哪八拜?
  9. 放大招!百味勺子硬件设计篇
  10. 短视频系统开发时如何实现在iOS系统相册中选取视频