Ich benutze SDL2 unter Windows (Ich habe sowohl Windows 7 und Windows 8 getestet). Ich spielte mit dem Rendern einer Textur, die an die Mauskoordinaten gebunden war, um eine Art "Fadenkreuz" -Effekt zu erzeugen.SDL2 rendern Textur sichtbar hinter der Maus
Es funktioniert, aber die Textur bleibt sichtbar hinter der Maus, die eine unangenehme Verzögerung zwischen Mausbewegung und den gerenderten Updates verursacht. Ehrlich gesagt, die Verzögerung ist sehr gering, aber für jemanden, der sich um absolute Genauigkeit kümmert, würde es die Person verrückt machen.
Meine Frage ist im Grunde, ist das normal? Ich vermute, dass die Verzögerung auf die Zeit zurückzuführen ist, die Windows benötigt, um das Ereignis an SDL und dann an SDL auszuliefern, um das Ereignis an mich zu liefern. Wie kann man über SDL einen gesperrten "Fadenkreuz" -Effekt erzielen?
Mein Code als Referenz:
#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;
}
Haben Sie den [Windows-Compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows) aktiviert? Benötigt Ihre "While" -Schleife immer ~ 16-17ms zur Ausführung? – genpfault
@genpfault Compositing ist aktiviert. Ich werde testen, wenn deaktiviert. Ich habe die Schleife noch nicht geplant, also muss ich das auch versuchen. –
Ihre 'SDL_Surface' wird nicht zentriert um die Mausposition gezeichnet, sondern zu' destrect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard