SDL: оптимизация времени - PullRequest
       56

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

2 голосов
/ 15 ноября 2011

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

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

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

1 Ответ

0 голосов
/ 29 июля 2015

Прежде всего, убедитесь, что изображение имеет небольшой формат файла, например, «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

...