SDL: оптимизация времени передачи

Я использую SDL в оконном режиме.

Учитывая большой спрайт, скажем, 1024 x 640, быстрее ли разбить все изображение на несколько маленьких плиток, скажем, 32 x 32 пикселей, чем разбить все изображение сразу?

Мне приходится блистать фоном на экране (1024*640) в оконном режиме при 30 FPS (минимум). Я думаю, что двойная буферизация и аппаратная поверхность не могут быть использованы в оконном режиме... Сейчас я блит весь спрайт сразу, но потребление процессора кажется очень высоким для простого фонового блитинга.


person Arnaud G    schedule 15.11.2011    source источник
comment
Не забудьте преобразовать ваши поверхности в формат отображения, иначе SDL выполняйте закулисные преобразования для каждого блита.   -  person genpfault    schedule 15.11.2011
comment
Я сделал. Но blit все еще жадны до процессора ...   -  person Arnaud G    schedule 18.11.2011
comment
@ArnaudG Я знаю, что это довольно старо, но как вычислить потребление ЦП? Какую частоту кадров вы получаете?   -  person emartel    schedule 17.11.2012


Ответы (1)


Во-первых, убедитесь, что изображение имеет формат небольшого типа файла, например «PNG». Во-вторых, при переносе изображения убедитесь, что вы не добавляете цвет прозрачности к фоновому изображению, так как это бессмысленно и требует МНОГО циклов процессора. Вот пример кода, который я написал давным-давно в качестве оболочки для загрузки изображений.

SDL_Surface* altSDL::load_image(std::string filename)  
{
    SDL_Surface* loadedImage = NULL;

    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load( filename.c_str() );

    if( loadedImage != NULL )
    {
        optimizedImage = SDL_DisplayFormat( loadedImage );        
        SDL_FreeSurface( loadedImage );
    }
    else
    {
        Failure* fail;
        fail = Failure::getInstance();
        fail->failLog(filename);
    }

    if( optimizedImage != NULL )
    {
        Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
        SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
    }

    return optimizedImage;
}

В этом коде вы сможете передать все свои изображения в него для очень плавной оптимизации, но в случае с фоновыми/большими изображениями вам нужно будет убедиться, что этот последний блок кода изменен на что-то большее в строках что-то вроде этого:

//Added some Sudo code

    if( loadedImage != NULL && !isBigImage)
            {
                optimizedImage = SDL_DisplayFormat( loadedImage );        
                SDL_FreeSurface( loadedImage );
            }
            else if(!isBigImage)
            {
                Failure* fail;
                fail = Failure::getInstance();
                fail->failLog(filename);
            }

isBigImage — это код sudo, который я добавил, и это переданный параметр; в некоторых случаях. Это сделает все ваши изображения оптимизированными, меньшими (следует убедиться, что они являются файлами png) и сделает так, чтобы прозрачность добавлялась только к небольшим файлам изображений, поэтому ваш фон не разрешал ваш fps

person DeathB4Allegiance    schedule 29.07.2015