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;
}
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
@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ć. –
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