【发布时间】: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中的字形之外,它是否有可能完全停止渲染字形? -
@CyberShadow,我还没有对此进行明确的测试,但是点数会像 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