此 SDL_gfx 代码是否涉及竞争条件?
Does this SDL_gfx code involve a race condition?
当我在我的机器上 运行 以下代码时,它的行为不是确定性的。它应该绘制的三角形只是偶尔出现:
#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 时也观察到了这一点。
这里的某个库中是否存在竞争条件,或者我的计算机有问题?
涉及很多事情,特别是如果您有合成 window 管理器。就像您翻转生成的图像但 window 当时不可见一样。合成时情况更糟,因为它实现了自己的双缓冲。
就像每个示例一样,重复绘制一个循环。如果绝对必要,您可以仅在 window 个事件(主要是 'exposed' 个)上重绘。
当我在我的机器上 运行 以下代码时,它的行为不是确定性的。它应该绘制的三角形只是偶尔出现:
#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 时也观察到了这一点。
这里的某个库中是否存在竞争条件,或者我的计算机有问题?
涉及很多事情,特别是如果您有合成 window 管理器。就像您翻转生成的图像但 window 当时不可见一样。合成时情况更糟,因为它实现了自己的双缓冲。
就像每个示例一样,重复绘制一个循环。如果绝对必要,您可以仅在 window 个事件(主要是 'exposed' 个)上重绘。