2013-11-13 2 views
-1

Я застрял в какой-то «логичной» рутине. Мой код получает живые изображения предварительного просмотра с моей камеры, которые преобразуются в структуру RWops и, наконец, загружаются как текстура в SDL. Теперь мой вопрос: как я могу обновить текстуру, не разрушая и не перестраивая ее? Некоторый код с использованием atm:SDL2 - Текстура и часто меняющееся изображение

for(x=0; x<100; x++){ 
    capture_to_memory(camera, context, (const char**)&data, &size); 

    rw = SDL_RWFromConstMem(data, size); 

    // This part is building the texture through SDL_image 
    sdlTexture = IMG_LoadTexture_RW(sdlRenderer, rw, 0); 

    SDL_RenderClear(sdlRenderer); 
    SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL); 
    SDL_RenderPresent(sdlRenderer); 

    SDL_DestroyTexture(sdlTexture); 
} 

Как видите, и как я думаю, это абсолютно неэффективно. Я замечаю, что для 100 снимков мне требуется около 12 секунд, чтобы отобразить их (jpg). Если я просто разрешаю захват и конверсию, это делается за 4,5 секунды. Таким образом, он швыряет мою рутину со зданием и разрушает текстуру, замедляя все.

Любые предложения могут быть?

+0

SDL_image не предоставляет эту функцию. Если вам действительно нужно, вы можете напрямую использовать libpng/libjpeg/whatever_your_format_is. Однако медленная часть, скорее всего, декодирует изображение, а не выделяет для него память, поэтому это не принесет вам большой пользы. Откуда вы получаете данные и какой фактический формат/разрешение/частота кадров? – keltar

+0

Да, вот что я заметил. Декодирование занимает большую часть времени. Я должен сказать, что я работал над малиновым PI. Вы хотите использовать SDL, так как не хотите использовать сервер x11. Мои данные поступают из DSLR (libgphoto2), который представляет собой формат JPG с разрешением 640x400, поэтому не такой большой. Я гораздо больше интересуюсь тем, как обрабатывать быстро меняющиеся снимки в SDL. Я не могу всегда разрушать и восстанавливать текстуру! – ayk

ответ

0

После быстрого просмотра SDL_image у него нет API для декодирования изображения в существующую текстуру.

Если вы не можете запросить изображение в несжатом формате - вам придется использовать libjpeg напрямую. Или переосмыслить всю идею о том, как вы получаете изображения - возможно, чтение непосредственно с видеоустройства (v4l?) Будет лучше?

Для быстроменяющихся текстур, SDL есть SDL_TEXTUREACCESS_STREAMING flag for SDL_CreateTexture. Затем, когда вам нужно изменить данные, заблокируйте текстуру с помощью SDL_LockTexture, измените возвращаемую память и откройте ее.

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