2013-09-04 11 views
5

Sto usando SDL2 su Windows (ho testato Windows 7 e Windows 8). Stavo giocando con il rendering di una texture bloccata alle coordinate del mouse per creare una sorta di effetto "mirino".SDL2 renda struttura ritarda visibilmente dietro il mouse

Funziona, ma la consistenza ritardo visibilmente dietro il mouse che crea un ritardo imbarazzante tra il movimento del mouse e gli aggiornamenti resi. Onestamente, il ritardo è molto minore, ma a qualcuno che si preoccupa dell'accuratezza assoluta, guiderà la persona folle.

La mia domanda è, fondamentalmente, è normale? Immagino che il ritardo sia dovuto al tempo impiegato da Windows per consegnare l'evento a SDL e quindi a SDL per consegnarmi l'evento. Come si può ottenere un effetto "crosshair" bloccato tramite SDL?

Il mio codice di riferimento:

#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

Hai il [compositore Windows] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows) attivato? Il tuo ciclo 'while' principale richiede sempre ~ 16-17ms per l'esecuzione? – genpfault

+0

@genpfault Il compositing è abilitato. Verificherò quando disabilitato. Non ho ancora programmato il ciclo, quindi dovrò provare anche quello. –

+0

Il vostro 'SDL_Surface' sarà non essere disegnato da meravigliarsi se gli pos del mouse, il cambiamento a' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard

risposta

2

Mentre non posso essere sicuro perché il ciclo è in ritardo, SDL ha il supporto per la modifica della superficie del mouse, così come alcune altre funzioni si può essere interessati a Sembra. potresti usare SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y) per il buon funzionamento. Ecco un link alla pagina wiki sul sostegno del mouse: http://wiki.libsdl.org/CategoryMouse

Felice codifica!

0

In un progetto su cui sto lavorando, faccio qualcosa di simile:

(Al di fuori del ciclo di gioco principale):

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

(Nella ciclo di gioco principale):

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

Durante l'utilizzo di questo non ho davvero notato alcun input lag. Forse è solo il tipo di evento?

Si noti che probabilmente non è altrettanto efficiente, dato che si otterrà lo stato del mouse ogni fotogramma, anziché solo quando si sposta il mouse.