【问题标题】:Does this SDL_gfx code involve a race condition?此 SDL_gfx 代码是否涉及竞争条件?
【发布时间】:2016-05-03 01:21:44
【问题描述】:

当我在我的机器上运行以下代码时,它的行为并不确定。它应该绘制的三角形有时只会出现:

#include <SDL/SDL.h>
#include <SDL/SDL_gfxPrimitives.h>

int main(int argc, char* args[])
{
    int xres = 250;
    int yres = 250;

    SDL_Surface* screen = SDL_SetVideoMode(xres, yres,
        0, SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_NOFRAME);

    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    filledTrigonRGBA(screen, 10, 10, 170, 170, 75, 100, 255, 0, 255, 255);
    //SDL_Delay(1);       // this fixes some race condition?
    SDL_Flip(screen);
    SDL_Delay(1000);
    SDL_Quit();

    return 0;
}

但如果我取消注释第一个 SDL_Delay() 调用,三角形总是会出现。我在使用 SDL 2 时也观察到了这一点。

这里的某个库中是否存在竞争条件,或者我的计算机有问题?

【问题讨论】:

    标签: c graphics sdl race-condition non-deterministic


    【解决方案1】:

    涉及很多事情,尤其是如果您有合成窗口管理器。就像您翻转生成的图像但当时看不到窗口一样。合成时更糟糕,因为它实现了自己的双缓冲。

    就像每一个例子一样,重复地画一个循环。如果绝对需要,您可以仅在窗口事件(主要是“暴露”事件)上重绘。

    【讨论】:

    • 这是有道理的,但还有另一个谜团。如果我更改上面的代码以将图像blit 到屏幕表面(而不是绘制三角形),它总是有效的。那么这些时序问题是否仅在使用 SDL_gfx 时出现?
    • 不,不是。可能图像加载/blitting 需要更多时间,因此此时窗口会正确显示,但您不应该依赖它。这不是我第一次看到类似的问题。只是不要这样做,这对于类似游戏的应用程序没有意义,而且如果不特别注意,您显示的图像无论如何都不会持续存在(例如,被其他窗口遮住)。
    • 我主要想知道为什么会发生这种现象。我已经接受了你的回答。我想,知道参与窗口渲染的其他线程确实会导致时间敏感的影响就足够了。我看到人们在使用 X Windows 库时讨论这些复杂性;没有意识到 SDL 不会将它们抽象出来。
    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多