2013-09-04 11 views
5

Używam SDL2 w systemie Windows (testowałem zarówno system Windows 7, jak i Windows 8). Grałem z renderowaniem tekstury zamkniętej na współrzędnych myszy, aby stworzyć efekt "celownika".Tekstura renderowania SDL2 widocznie pozostaje w tyle za myszką

Działa, ale tekstura pozostaje w tyle za myszą, co powoduje niezręczne opóźnienie między ruchem myszy a renderowanymi aktualizacjami. Szczerze mówiąc, opóźnienie jest bardzo niewielkie, ale dla kogoś, kto dba o absolutną dokładność, doprowadziłoby to osobę do szaleństwa.

Moje pytanie jest w zasadzie, czy to normalne? Zgaduję, że opóźnienie wynika z czasu, jaki zajmuje systemowi Windows dostarczenie zdarzenia do SDL, a następnie SDL, aby dostarczyć wydarzenie do mnie. W jaki sposób można osiągnąć zablokowany efekt "celownika" za pośrednictwem SDL?

Mój kod dla odniesienia:

#include "SDL.h" 

int main(int argc, char* args[]) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 

    SDL_Window* window = SDL_CreateWindow("SDL", 100, 100, 640, 480, SDL_WINDOW_SHOWN); 

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    SDL_Surface* surface = SDL_LoadBMP("mouse.bmp"); 

    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); 
    SDL_FreeSurface(surface); 

    bool isExiting = false; 
    int x = 0; 
    int y = 0; 

    while(!isExiting) 
    { 
     SDL_Event e; 
     while(SDL_PollEvent(&e)) 
     { 
      if(e.type == SDL_QUIT) 
      { 
       isExiting = true; 
       break; 
      } 
      else if(e.type == SDL_MOUSEMOTION) 
      { 
       x = e.motion.x; 
       y = e.motion.y; 
      } 
     } 

     SDL_Rect destRect; 
     destRect.h = 19; 
     destRect.w = 19; 
     destRect.x = x; 
     destRect.y = y; 

     SDL_RenderClear(renderer); 
     SDL_RenderCopy(renderer, texture, NULL, &destRect); 
     SDL_RenderPresent(renderer); 
    } 

    SDL_Quit(); 

    return 0; 
} 
+0

Czy masz włączoną funkcję [Windows compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows)? Czy twoja główna pętla 'while' zawsze wymaga ~ 16-17ms do wykonania? – genpfault

+0

@genpfault Kompozycja jest włączona. Będę testować, gdy wyłączony. Nie mam jeszcze ustalonego czasu na pętlę, więc muszę też spróbować. –

+0

Twoja 'SDL_Surface' nie zostanie narysowana w środku wokół myszy pos, zmień ją na' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard

Odpowiedz

2

Chociaż nie mogę być pewien, dlaczego pętli tyle, SDL posiada wsparcie dla zmieniających powierzchnię myszy, jak również niektóre inne funkcje mogą być zainteresowani Wydaje się. możesz dobrze wykorzystać numer SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y). Oto link do strony wiki na temat obsługi myszy: http://wiki.libsdl.org/CategoryMouse

Szczęśliwe kodowanie!

0

W projekcie pracuję nad, mam coś takiego:

(poza główną pętlę gry):

SDL_Texture* cursor = //blah; 
SDL_Rect cursor_hitbox; 
SDL_QueryTexture(cursor, NULL, NULL, &cursor_hitbox.w, &cursor_hitbox.h); 

(W głównej pętli gry):

SDL_GetMouseState(&cursor_hitbox.x, &cursor_hitbox.y); 

Podczas korzystania z tego nie zauważyłem żadnego opóźnienia wejściowego. Może to tylko typ wydarzenia?

Należy zauważyć, że najprawdopodobniej nie jest to tak efektywne, ponieważ otrzymywałbyś stan myszy w każdej klatce, a nie tylko po przesunięciu myszy.

Powiązane problemy