2016-05-03 18 views
1

Когда я запускаю следующий код на своей машине, он не ведет себя детерминистически. Треугольник он должен рисовать только кажется иногда:Имеет ли этот код 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.

Есть ли какое-либо состояние гонки в одной из библиотек здесь или что-то не так с моим компьютером?

ответ

1

Существует много вещей, особенно если у вас есть компоновщик оконного менеджера. Например, если вы перевернули результирующее изображение, но в тот момент окно не было видно. С композицией это еще хуже, поскольку он реализует свою собственную двойную буферизацию.

Просто несколько раз нарисуйте петлю, как и каждый отдельный пример. Если вам абсолютно необходимо, вы можете перерисовывать только события окна (в основном «выставленные»).

+0

Это имеет смысл, но есть еще одна загадка. Если я изменю приведенный выше код, чтобы разбить изображение на поверхность экрана (вместо рисования треугольника), он всегда работает. Таким образом, эти проблемы времени возникают только при использовании SDL_gfx? – sacheie

+0

Нет, это не так. Вероятно, загрузка изображения/бланширование занимает больше времени, поэтому окно становится правильно отображаемым в этой точке, но вы не должны полагаться на него. Это не первый раз, когда я вижу похожие вопросы; просто не делайте этого, это мало имеет смысла для игровых приложений, и без особого внимания ваше отображаемое изображение не будет сохраняться в любом случае (например, омрачено другим окном). – keltar

+0

Мне было интересно узнать, почему происходит это явление. Я принял ваш ответ. Достаточно, я думаю, знать, что другие потоки, связанные с рендерингом окон, вызывают зависящие от времени эффекты. Я видел, как люди обсуждали эти сложности при использовании X Windows-библиотек; не понимал, что SDL не абстрагирует их. – sacheie

 Смежные вопросы

  • Нет связанных вопросов^_^