bool createSceneFont()
{
Ogre::OverlaySystem* pOverlaySystem = new Ogre::OverlaySystem();
m_pSceneManager->addRenderQueueListener(pOverlaySystem);
Ogre::FontPtr tempFont = static_cast<Ogre::FontPtr>(Ogre::FontManager::getSingleton().create("SdkTrays/Caption", "Popular"));
tempFont->setType(Ogre::FontType::FT_TRUETYPE); // 字体类型
tempFont->setSource("msyh.ttf"); // 字体源(微软雅黑)
tempFont->setTrueTypeResolution(96); // 字体的打印分辨率,一般为96
tempFont->setTrueTypeSize(32); // 字体大小: 生成纹理的大小,值越大生成纹理所花的时间也就越多
tempFont->addCodePointRange(Ogre::Font::CodePointRange(33,126)); // 英文-unicode的int值范围
tempFont->addCodePointRange(Ogre::Font::CodePointRange(19968,40869)); // 汉字-unicode的int值范围
m_font = tempFont;
m_font->load();
if (m_font.isNull())
{
return false;
}
return true;
}
以上是加载字体的代码,来自于https://blog.youkuaiyun.com/cao269631539/article/details/54929602
奔溃原因是内存分配失败,这是因为load的调用中会创建两张纹理,一张PF_BYTE_LA格式的,一张RGB格式的,但是在创建RGB格式纹理的时候会因为资源太大导致失败(创建两种纹理是因为显存处理的纹理格式是RGB格式)
之所以需求的RGB纹理资源太大是因为字体设置问题,导致一张纹理的大小远远大于正常使用的纹理大小,而且也大于了显卡所支持的纹理大小,一般支持的纹理大小是8192*8192
解决办法就是调整字体参数:
1、改变trueTypeSize大小
2、改变分辨率
3、设置有效的编码范围,最节省的方式就是按需设置范围,避免了浪费(这才是最有效的方法)
附加两个在线网址,用于汉字unicode编码查询和进制转换:
1、编码查询,https://www.qqxiuzi.cn/bianma/zifuji.php
2、编码进制转换,http://tool.chinaz.com/tools/unicode.aspx