SDL2:SDL_LockTexture可以在另一个线程中使用吗?

时间:2015-01-06 10:13:07

标签: sdl-2

我更改了SDL2发行包中的teststreaming.c,尝试将SDL_LockTexture操作放在另一个线程中。我想验证它是否有效,因为我的代码需要此功能。

我的更改很简单,如下所示:

void UpdateTexture(SDL_Texture *texture, int frame)
{
    SDL_LockTexture(texture, NULL, &pixels, &pitch);
    /*hanlde the pixels*/
    SDL_UnlockTexture(texture);
}

int updateStreamFunction( void* data )
{
    int frame = 0;
    SDL_Texture *MooseTexture; 

    MooseTexture = (SDL_Texture *)data;
    while (gRunning){
        frame = (frame + 1) % MOOSEFRAMES_COUNT;
        UpdateTexture(MooseTexture, frame);
        SDL_Delay(40);
    }
    printf("quit the thread: updateStreamThread\n");
    return 0;
}

int main(int argc, char **argv)
{
    .....
    MooseTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, MOOSEPIC_W, MOOSEPIC_H);
    if (!MooseTexture) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't set create texture: %s\n", SDL_GetError());
        quit(5);
    }

    threadID = SDL_CreateThread( updateStreamFunction, "updateStreamThread", (void*)MooseTexture );
    ....
    SDL_RenderClear(renderer);   
    SDL_RenderCopy(renderer, MooseTexture, NULL, NULL);        
    SDL_RenderPresent(renderer);
}

然而,这些变化对我不起作用。它只显示一些垃圾数据。但是如果我把UpdateTexture()放在SDL_RenderClear(渲染器)之前,就在创建窗口/渲染/纹理的同一个线程中。它工作正常。

那么有没有限制在主线程的不同线程中没有操纵纹理?如果是,那么满足我的请求的最佳方式是什么(显示的数据在不同的主题中)?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

仅供将来参考:

从下面的链接中查看上面的注释,其中说明" 必须从主线程中调用这些函数。"上次修改的文件是2014-12-07此时编写,SDL_LockTexture在此标题内。 http://www.libsdl.org/tmp/SDL/include/SDL_render.h