2015-01-06 2 views
0

SDL_LockTexture 액션을 다른 스레드에 배치하려고 SDL2 릴리스 패키지의 teststreaming.c를 변경했습니다. 내 코드가이 기능을 필요로하기 때문에 작동하는지 여부를 확인하고 싶습니다.SDL2 : 다른 스레드에서 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 (렌더러) 바로 앞의 window/render/texture가 만들어지는 동일한 스레드에 넣으면됩니다. 그것은 잘 작동합니다.

그래서 주 스레드와 다른 스레드에서 텍스처를 조작하지 못하는 제한이 있습니까? 그렇다면 내 요청을 충족시키는 가장 좋은 방법은 무엇입니까 (표시된 데이터는 다른 스레드에 있음)?

도움을 주셔서 감사합니다. 그냥 나중에 참조

답변

1

". 이 기능은 메인 스레드에서 호출해야합니다"

진술 링크를 다음에서 위의 코멘트를 살펴 보자 마지막으로 수정 된 파일은 2014년 12월 7일이었다 이번에는 SDL_LockTexture가이 헤더 안에 있습니다. http://www.libsdl.org/tmp/SDL/include/SDL_render.h

관련 문제