SDL透明叠加

时间:2012-03-04 22:55:47

标签: c++ graphics transparency sdl

我想在SDL中创建一个虚假的“爆炸”效果。为此,我希望屏幕能够从当前的状态变为现实,并逐渐变为白色。

最初,我想过像这样使用SDL_FillRect(其中explosionTick是当前的alpha值):

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

但它不是反向渐变矩形,而是显示完全白色而没有alpha。我尝试的另一种方法是使用填充了透明白色(alpha值为1)的全屏位图,并为每个explosionTick进行一次blit,如下所示:

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

但是,这最终导致实时运行缓慢。 有没有简单的方法来实现这种效果而不会失去性能?谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

嗯,你需要混合和AFAIK SDL使用SDL_Blitsurface的唯一方法。所以你只需要优化那个blit。我建议对那些进行基准测试:

  • 尝试使用SDL_SetAlpha来使用每个表面的alpha而不是每个像素的alpha。从理论上讲,SDL的工作量较少,因此您可能希望获得一些速度提升。但是我从来没有对它进行过比较,过去也遇到过一些问题。
  • 你真的不需要全屏位图,只需重复一行粗线。它应该是更少的内存密集,并且可能有缓存增益。你也可以通过在每次传递中做一半的线来伪造一些平滑度(较少像素到blit并且看起来仍然看起来像全局屏幕效果)。
  • 为获得最佳性能,请验证您的位图是否为显示格式。如果使用每个表面的alpha,请检查SDL_DisplayFormatAlpha或可能的SDL_DisplayFormat