Обновления видео со значительной задержкой в ​​SDL

Если я правильно помню, я встречал эту проблему раньше, но я не могу вспомнить, как я решил ее. Это моя программа:

#include "SDL.h"

SDL_Surface *screen;
SDL_Event event;

int main(int argc,char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    atexit(SDL_Quit);
    screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
    int x = 10,y = 10;
    while (1)
    {
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
                exit(0);
        }
        int mx,my;
        Uint8 mstate = SDL_GetMouseState(&mx,&my);
        if (mstate & SDL_BUTTON(1)) x = mx,y = my;
        SDL_FillRect(screen,NULL,0);
        *(Uint32*)((Uint8*)screen->pixels+screen->pitch*y+x*sizeof(Uint32)) = 0xFFFFFFFF;
        SDL_UpdateRect(screen,0,0,0,0);
    }
}

Там белый пиксель на черном фоне, и он перемещается в положение курсора мыши, когда вы нажимаете левую кнопку мыши. Проблема в том, что до появления пикселя в новой позиции требуется значительная доля секунды. Это не проблема только с этим пикселем. Когда я пытаюсь переместить окно программы, оно также не отвечает немедленно. Также не работает функция printf, если я помещаю ее где-то в цикл while(SDL_PollEvent(&event)). С другой стороны, если я делаю то же самое с SDL_SetVideoMode, он отвечает в тот момент, когда происходит событие. Кроме того, это происходит только тогда, когда FPS и разрешение достаточно высоки. Если я установлю режим видео на 320x200 вместо 640x480 или ограничу FPS, все произойдет вовремя. Кстати, я использую Ubuntu 11.10 с графическими драйверами Mesa. Так это проблема SDL или другого программного обеспечения или это моя вина?

1 ответ

Он отлично работает на моем компьютере (Windows7), время выполнения внутри while (1) меньше 1 мс.

Тот факт, что все происходит вовремя, когда вы устанавливаете видео в более низкое разрешение, приводит к нехватке ресурсов вашего компьютера и / или неоптимизированной функции Ubuntu 11.10 with Mesa graphics drivers,

Вам нужно профилировать время процессора, используемое для каждой функции, чтобы найти узкое место.

Некоторые идеи:

  • Поместите ваши функции рисования / обновления внутри if (mstate & SDL_BUTTON(1))
  • Обновить измененный пиксель -> SDL_UpdateRect(screen,x,y,1,1);
  • Обновите старый белый пиксель на черный вместо заполнения черным всего экрана.
  • добавлять SDL_Delay(10); незадолго до окончания цикла while(1).
Другие вопросы по тегам