首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sdl ttf_rendertext_blended随机失败

sdl ttf_rendertext_blended随机失败
EN

Stack Overflow用户
提问于 2014-11-16 11:58:10
回答 2查看 1.5K关注 0票数 7

编辑:即使这个问题仍然存在,我也没有足够的频率来仔细研究它。请参阅问题结尾处的更多信息。

我开始开发一个游戏,我目前正在为它编写基础库。我在Linux 13 (Maya)上使用了SDL-2和OpenGL 3(使用Derelict3绑定)的D编程语言。编译器是DMD64 D编译器v2.067.1,我每次都用'rdmd‘重建二进制文件。

为了呈现(更改)文本,我按需创建字形.我为此使用的代码是:

代码语言:javascript
复制
class Font {
...

Texture render(char c) {
    if(!(c in rendered)) rendered[c] = texture(to!string(c));
    return rendered[c];
}

Texture texture(string text) {
    SDL_Color color={255, 255, 255, 255};

    auto bitmap = TTF_RenderText_Blended(
        font,
        std.string.toStringz(text),
        color
    );
    if(!bitmap) {
        throw new TTFError(
            "TTF_RenderText_Blended: " ~
            to!string(TTF_GetError()) ~ ": '" ~ text ~ "'"
        );
    }
    auto texture = new Texture(bitmap);
    SDL_FreeSurface(bitmap);
    return texture;
}

问题是,这完全是随机失败的。有时,它的工作没有任何问题。当它不能呈现一个字形时,有趣的是它不会一次又一次地呈现相同的字形。下面是一个捕获我抛出的异常的示例:

代码语言:javascript
复制
...
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
...

(我正在逐屏打印分数,除少数几个数字外,其他数字显示得很好)。数字TTF_RenderText_Blended无法呈现不同的运行,正如前面提到的,它会不时地呈现所有的数字。

一个细节是,在进入游戏循环之前,我呈现的静态字符串还没有失败,只是用于更改文本的单个字母。

我几乎没有任何想法,也没有找到任何与这个问题有关的搜索网页。任何寻找解决方案的想法都会受到很好的赞赏。

当前情况:我将编译器更新为DMD2.067.1,问题仍然存在(到目前为止使用的编译器: 2.066.1,2.067.1)。整体来说,项目家族目前就在github中:

https://github.com/mkoskim/games

文本字形呈现功能位于此文件中:

https://github.com/mkoskim/games/blob/master/engine/ext/font.d

...and它是从这里使用的:

https://github.com/mkoskim/games/blob/master/engine/ext/gui/label.d

这个问题主要/最频繁地出现在pacman游戏中(尽管现在很少):

https://github.com/mkoskim/games/tree/master/testbench/pacman

如果您想尝试一下,首先,请阅读(希望足够完整)安装说明:

https://github.com/mkoskim/games/blob/master/INSTALL

该项目是为64位Linux开发的,从构建的角度来看,它目前并不是用户友好和可移植的。Pacman是唯一一个在没有游戏控制器的情况下工作的演示。成功安装了所需的库和工具之后,可以使用命令构建它:

代码语言:javascript
复制
games/testbench/pacman$ make default
EN

回答 2

Stack Overflow用户

发布于 2020-07-15 18:13:10

我遇到了完全相同的问题,对我来说,它是通过将用于创建字体的SDL_RWops结构(用TTF_OpenFontRW)保存在它创建的TTF_Font的整个生命周期中来修复的。我看到您也在用TTF_OpenFontRW创建字体,所以我想这也会为您解决这个问题。它看起来像SDL_ttf依赖于这个被保持活着,它读取释放的内存否则。

票数 3
EN

Stack Overflow用户

发布于 2017-02-01 19:07:05

我知道这个问题有点过时,但我可能也有类似的问题。每次使用SDL_DestroyTexture()之前,我都会简单地调用TTF_Render_Text_Blended()来修正它:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26956658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档