Я использую SDL2 для Windows (я тестировал как Windows 7, так и Windows 8). Я играл с рендерингом текстуры, привязанной к координатам мыши, чтобы создать своего рода эффект «перекрестия».SDL2 визуализировать текстуру заметно отстает от мыши
Это работает, но текстура заметно отстает от мыши, что создает неудобную задержку между движением мыши и визуализированными обновлениями. Честно говоря, задержка очень незначительная, но для кого-то, кто заботится о абсолютной точности, это сбило бы человека с ума.
Мой вопрос в основном, это нормально? Я предполагаю, что задержка связана с тем, сколько времени потребуется Windows для доставки события в SDL, а затем SDL для доставки события мне. Как можно добиться эффекта «перекрестия» с помощью SDL?
Мой код для справки:
#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;
}
У вас есть [Windows compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows)? Ваш основной цикл 'while' всегда принимает ~ 16-17ms для выполнения? – genpfault
@genpfault Композиция включена. Я проверю, когда отключен. Я еще не приурочил цикл, поэтому мне тоже придется попробовать. –
Ваш 'SDL_Surface' не будет нарисован по центру мыши, измените его на' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard