6

编辑:即使问题仍然存在,我也无法足够频繁地重现它以更仔细地检查它。在问题末尾查看更多信息。


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

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

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;
}

问题是这完全随机失败。有时它可以毫无问题地工作。当它无法渲染一个字形时,有趣的是它会一遍又一遍地渲染相同的字形。这是捕获我抛出的异常时的示例:

...
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_Blend 无法渲染的数字因运行而异,并且如前所述,它有时会渲染所有数字。

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

我几乎没有任何想法,并且通过搜索网络没有找到与此问题相关的任何内容。非常感谢任何寻找解决方案的想法。


当前情况:我将编译器更新为 DMD 2.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

...从这里使用它:

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

该问题主要/最常出现在吃豆人游戏中(尽管现在很少发生):

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

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

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

该项目是为 64 位 Linux Mint Maya 制作的,从构建的角度来看,它目前不是那么用户友好和便携。Pacman 是唯一(希望)在没有游戏控制器的情况下工作的演示。成功安装所需的库和工具后,您可以使用命令构建它:

games/testbench/pacman$ make default
4

2 回答 2

2

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

于 2020-07-15T18:13:10.727 回答
1

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

于 2017-02-01T19:07:05.987 回答