解决Ogre导入中文字体时的崩溃问题

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.csdn.net/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

                                  https://tool.lu/hexconvert/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值