Tôi đang sử dụng SDL2 trên Windows (tôi đã thử nghiệm cả Windows 7 và Windows 8). Tôi đã chơi xung quanh với kết xuất một kết cấu bị khóa với các tọa độ chuột để tạo ra một loại hiệu ứng "crosshair".SDL2 hiển thị kết cấu rõ ràng nằm sau chuột
Nó hoạt động, nhưng kết cấu nhìn rõ ràng phía sau chuột tạo ra sự chậm trễ khó xử giữa chuyển động của chuột và các bản cập nhật được hiển thị. Thành thật mà nói, sự chậm trễ là rất nhỏ, nhưng để một người quan tâm về độ chính xác tuyệt đối, nó sẽ lái xe người điên.
Câu hỏi của tôi về cơ bản, điều này có bình thường không? Tôi đoán rằng sự chậm trễ là do thời gian cần để Windows cung cấp sự kiện cho SDL và sau đó SDL cung cấp sự kiện cho tôi. Làm thế nào có thể đạt được một hiệu ứng "crosshair" bị khóa thông qua SDL?
Mã của tôi để tham khảo:
#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;
}
Bạn có bật [Windows compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows) không? Vòng lặp 'while' chính của bạn luôn mất ~ 16-17ms để thực thi? – genpfault
@genpfault Tính năng tổng hợp được bật. Tôi sẽ kiểm tra khi bị vô hiệu hóa. Tôi đã không hẹn giờ vòng lặp nào, vì vậy tôi sẽ phải cố gắng đó là tốt. –
'SDL_Surface' của bạn sẽ không được vẽ xung quanh vị trí chuột, thay đổi thành' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard