【问题标题】:sdl ttf_rendertext_blended fails randomlysdl ttf_rendertext_blended 随机失败
【发布时间】:2014-11-16 11:58:10
【问题描述】:

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


我开始开发游戏,目前正在为它编写基本库。我在 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

【问题讨论】:

  • 只是为了实验,尝试在角色周围放置几个空格,比如在渲染函数中使用" " ~ c 而不是仅仅to!string(c),看看会发生什么。也许 SDL 不喜欢渲染单个字符..
  • @AdamD.Ruppe,我已经尝试过这样的事情。无论如何,我更改了这样的代码:if(!(c in rendered)) rendered[c] = texture(std.string.format(" %c ", c));,第一次测试运行给了我无穷无尽的列表:...TTF_RenderText_Blended: Text has zero width: ' 7 '...
  • “有时它可以毫无问题地工作。当它无法渲染一个字形时,有趣的是它会一遍又一遍地渲染相同的字形。”在第一个失败后,它会成功渲染新的字形吗? IE。除了缓存在rendered 中的字形之外,它是否有可能完全停止渲染字形?
  • @Cyber​​Shadow,我还没有对此进行明确的测试,但是点数会像 10、20、30 一样上升,...,所以代码以相同的顺序创建数字。因此,在示例案例中,它按 0、1、2、...、9 的顺序创建了数字,但未能呈现数字 6 和 9。字形失败是完全随机的,但当它们失败时,它们会继续失败每时每刻。我试着做一个测试用例来明确地测试那个用例,我想。
  • 我无法理解这个......我稍微修改了代码以查看哪些字形被渲染,哪些不是,并且无法重现该案例。现在,即使改回代码也不会重现故障:o 我的轻微预感是这与 SDL 和 TTF 无关,而是与编译器有关(我使用的是 Linux DMD64 D Compiler v2.066.1,使用 rdmd 编译)。 ..我继续调查此案。

标签: opengl d sdl-2 dmd sdl-ttf


【解决方案1】:

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

【讨论】:

  • 有趣!我需要在继续项目后立即尝试一下!
【解决方案2】:

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

【讨论】:

  • 呵呵,老问题,但没有过时:) 感谢提示,我会在回到文本渲染时尝试一下!我试着记住在这里更新这个项目,但遗憾的是很多东西已经改变了(SDL 版本、编译器版本等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2017-02-07
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多