SDL прозрачный оверлей - PullRequest
0 голосов
/ 05 марта 2012

Я хотел бы создать фальшивый эффект "взрыва" в SDL.Для этого я бы хотел, чтобы экран шел от того, чем он является в настоящее время, и стал белым.

Изначально я думал об использовании SDL_FillRect, например, так (где ExplosionTick - текущее альфа-значение):

SDL_FillRect(screen , NULL , SDL_MapRGBA(screen->format , 255, 255 , 255, explosionTick ));

Но вместо обратного угасающего прямоугольника он отображается полностью белым без альфа.Другой метод, который я попробовал, включал использование полноэкранного растрового изображения, заполненного прозрачным белым (со значением альфа-канала 1), и бликование его один раз для каждого взрыва. Отметьте, например, так:

        for(int a=0; a<explosionTick; a++){
            SDL_BlitSurface(boom, NULL, screen, NULL);
        }

Но это закончилось тем, чтомедленно бегать в режиме реального времени.Есть ли простой способ добиться этого эффекта без потери производительности?Спасибо за ваше время.

1 Ответ

1 голос
/ 05 марта 2012

Ну, вам нужно смешивание и AFAIK, единственный способ, которым SDL делает это с SDL_Blitsurface.Так что вам просто нужно оптимизировать этот блядь.Я предлагаю сравнительный анализ:

  • попробуйте использовать SDL_SetAlpha, чтобы использовать альфа на каждую поверхность вместо альфа на пиксель.Теоретически, для SDL это меньше работы, так что вы можете надеяться на некоторое увеличение скорости.Но я никогда не сравнивал это, и у меня были некоторые проблемы с этим в прошлом.
  • вам не нужно полноэкранное растровое изображение, просто повторите толстый ряд.Это должно быть менее требовательным к памяти и, возможно, увеличение кеша.Также вы, вероятно, можете подделать некоторую плавность, выполняя половину строк на каждом проходе (меньше пикселей для блика и все равно должны выглядеть как глобальный экранный эффект).
  • для оптимальной производительности, убедитесь, что ваше растровое изображение имеет формат отображения,Проверьте SDL_DisplayFormatAlpha или, возможно, SDL_DisplayFormat, если вы используете для каждой поверхности альфа
...