SDL2渲染纹理明显落后于鼠标

时间:2013-09-04 12:51:37

标签: c++ windows sdl sdl-2

我在Windows上使用SDL2(我已经测试了Windows 7和Windows 8)。我正在玩渲染纹理锁定到鼠标坐标以创建一种“十字准线”效果。

它有效,但纹理明显落后于鼠标,这会在鼠标移动和渲染更新之间产生尴尬的延迟。老实说,延迟很小,但对于那些关心绝对准确性的人来说,这会让这个人疯狂。

我的问题基本上是,这是正常的吗?我猜测延迟是由于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; 
}

2 个答案:

答案 0 :(得分:2)

虽然我不能确定为什么你的循环滞后,SDL支持更改鼠标表面,以及你可能感兴趣的其他一些功能。看起来你可以好好使用SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y)。这是鼠标支持维基页面的链接:http://wiki.libsdl.org/CategoryMouse

快乐的编码!

答案 1 :(得分: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);

使用它时我没有真正注意到任何输入延迟。也许这只是事件类型?

请注意,这很可能不那么有效,因为你会在每一帧都获得鼠标状态,而不是只在你移动鼠标时。