Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 此SDL_gfx代码是否涉及竞争条件?_C_Graphics_Sdl_Race Condition_Non Deterministic - Fatal编程技术网

C 此SDL_gfx代码是否涉及竞争条件?

C 此SDL_gfx代码是否涉及竞争条件?,c,graphics,sdl,race-condition,non-deterministic,C,Graphics,Sdl,Race Condition,Non Deterministic,当我在我的机器上运行以下代码时,它的行为并不是决定性的。它应该绘制的三角形仅在以下情况下出现: #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,

当我在我的机器上运行以下代码时,它的行为并不是决定性的。它应该绘制的三角形仅在以下情况下出现:

#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;
}
#包括
#包括
int main(int argc,char*args[]
{
int xres=250;
int yres=250;
SDL_表面*屏幕=SDL_设置视频模式,
0,SDL|U SWSURFACE(SDL|U DOUBLEBUF(SDL|U NOFRAME));
SDL_FillRect(屏幕,NULL,SDL_映射RGB(屏幕->格式,0,0));
填充的trigonrgba(屏幕,10,10,170,170,75,100,255,0,255,255);
//SDL_Delay(1);//这修复了一些竞争条件?
SDL_翻转(屏幕);
SDL_延迟(1000);
SDL_退出();
返回0;
}
但是如果我取消对第一个SDL_Delay()调用的注释,三角形总是出现。我在使用SDL2时也观察到了这一点


这里的某个库中是否存在争用情况,或者我的计算机是否有问题?

涉及到很多问题,特别是如果您有合成窗口管理器。就像你们翻转你们的结果图像,但那个一刻窗口是不可见的。对于合成,情况更糟,因为它实现了自己的双缓冲


就像每个例子一样,反复画一个循环。如果您必须这样做,您只能在窗口事件(大部分是“公开”事件)上重新绘制。

这是有道理的,但还有另一个谜团。如果我更改上面的代码,将图像blit到屏幕表面(而不是绘制三角形),它总是有效的。那么,这些计时问题是否只在使用SDL_gfx时发生?不,不是。也许图像加载/blitting需要更多的时间,这样窗口就可以在那个时候正确显示,但你们不应该依赖它。这不是我第一次看到类似的问题;只是不要这样做,这对于类似游戏的应用程序来说没有什么意义,如果不特别注意,您显示的图像无论如何都不会持续(例如,被其他窗口遮住)。我主要感兴趣的是了解这种现象发生的原因。我已经接受了你的回答。。我想,知道窗口渲染中涉及的其他线程确实会导致时间敏感的效果就足够了。我见过人们在使用X Windows libs时讨论这些复杂问题;我不知道SDL不会把它们提取出来。