编辑:即使这个问题仍然存在,我也没有足够的频率来仔细研究它。请参阅问题结尾处的更多信息。
我开始开发一个游戏,我目前正在为它编写基础库。我在Linux 13 (Maya)上使用了SDL-2和OpenGL 3(使用Derelict3绑定)的D编程语言。编译器是DMD64 D编译器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_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是唯一一个在没有游戏控制器的情况下工作的演示。成功安装了所需的库和工具之后,可以使用命令构建它:
games/testbench/pacman$ make default发布于 2020-07-15 18:13:10
我遇到了完全相同的问题,对我来说,它是通过将用于创建字体的SDL_RWops结构(用TTF_OpenFontRW)保存在它创建的TTF_Font的整个生命周期中来修复的。我看到您也在用TTF_OpenFontRW创建字体,所以我想这也会为您解决这个问题。它看起来像SDL_ttf依赖于这个被保持活着,它读取释放的内存否则。
发布于 2017-02-01 19:07:05
我知道这个问题有点过时,但我可能也有类似的问题。每次使用SDL_DestroyTexture()之前,我都会简单地调用TTF_Render_Text_Blended()来修正它:)
https://stackoverflow.com/questions/26956658
复制相似问题