sdl ttf_rendertext_blended随机失败

MaK*_*aKo 5 opengl d dmd sdl-ttf sdl-2

编辑:即使问题仍然存在,我还没有能够经常重现这一点,以便更接近地检查它.在问题的最后查看更多信息.


我开始开发游戏,我正在为它编写基本库.我在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;
}
Run Code Online (Sandbox Code Playgroud)

问题是,这完全是随机的.有时候它没有任何问题.当它无法渲染一个字形时,有趣的是它将无法一遍又一遍地渲染相同的字形.这是捕获我抛出的异常时的示例:

...
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'
...
Run Code Online (Sandbox Code Playgroud)

(我打印分数到屏幕,其他数字显示正常,除了那些少数).TTF_RenderText_Blended的数字无法呈现因运行而异,并且如上所述,它会不时地呈现所有数字.

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

我几乎没有任何想法,也没有通过搜索网络找到与此问题相关的任何内容.任何寻找解决方案的想法都非常受欢迎.


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

这个问题主要/最常见于pacman游戏中(尽管现在很少发生):

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
Run Code Online (Sandbox Code Playgroud)

小智 1

我知道这个问题有点过时了,但我可能也遇到过类似的问题。每次使用 TTF_Render_Text_Blend() 之前,我只需调用 SDL_DestroyTexture() 即可修复此问题:)