2013-09-04 2 views
5

Я использую 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; 
} 
+0

У вас есть [Windows compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows)? Ваш основной цикл 'while' всегда принимает ~ 16-17ms для выполнения? – genpfault

+0

@genpfault Композиция включена. Я проверю, когда отключен. Я еще не приурочил цикл, поэтому мне тоже придется попробовать. –

+0

Ваш 'SDL_Surface' не будет нарисован по центру мыши, измените его на' destRect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard

ответ

2

В то время как я не могу быть уверен, почему ваш цикл запаздывает, SDL поддерживает изменения поверхности мыши, а также некоторые другие функции, которые вы можете быть заинтересованы в Похоже. вы можете положить SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y) в хорошее использование. Вот ссылка на страницу вики на поддержку мыши: http://wiki.libsdl.org/CategoryMouse

Счастливое кодирование!

0

В проекте я работаю, я что-то вроде этого:

(За пределами основного игрового цикла):

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

(В основном цикле игры):

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

При использовании этого я на самом деле не заметил никакого запаздывания ввода. Может быть, это всего лишь тип события?

Обратите внимание, что это скорее всего не так эффективно, поскольку вы будете получать состояние мыши в каждом кадре, а не только при перемещении мыши.

Смежные вопросы