Когда я запускаю следующий код на своей машине, он не ведет себя детерминистически. Треугольник он должен рисовать только кажется иногда:Имеет ли этот код SDL_gfx условие гонки?
#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.
Есть ли какое-либо состояние гонки в одной из библиотек здесь или что-то не так с моим компьютером?
Это имеет смысл, но есть еще одна загадка. Если я изменю приведенный выше код, чтобы разбить изображение на поверхность экрана (вместо рисования треугольника), он всегда работает. Таким образом, эти проблемы времени возникают только при использовании SDL_gfx? – sacheie
Нет, это не так. Вероятно, загрузка изображения/бланширование занимает больше времени, поэтому окно становится правильно отображаемым в этой точке, но вы не должны полагаться на него. Это не первый раз, когда я вижу похожие вопросы; просто не делайте этого, это мало имеет смысла для игровых приложений, и без особого внимания ваше отображаемое изображение не будет сохраняться в любом случае (например, омрачено другим окном). – keltar
Мне было интересно узнать, почему происходит это явление. Я принял ваш ответ. Достаточно, я думаю, знать, что другие потоки, связанные с рендерингом окон, вызывают зависящие от времени эффекты. Я видел, как люди обсуждали эти сложности при использовании X Windows-библиотек; не понимал, что SDL не абстрагирует их. – sacheie