SDL透明覆盖

SDL Transparent Overlay

本文关键字:覆盖 透明 SDL      更新时间:2023-10-16

我想在SDL中创建一个假"爆炸"效果。为此,我希望屏幕从目前的状态变为白色。

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

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

但它不是一个反向渐变的矩形,而是完全白色的,没有alpha。我尝试的另一种方法是使用一个充满透明白色(阿尔法值为1)的全屏位图,并为每次爆炸闪电一次

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

但是,这最终导致实时运行速度减慢。有没有什么简单的方法可以在不损失性能的情况下达到这种效果?谢谢你抽出时间。

好吧,你需要混合和AFAIK,SDL唯一的方法就是使用SDL_Blitsurface。所以你只需要优化闪电战。我建议对这些进行基准测试:

  • 尝试使用SDL_SetAlpha来使用每表面alpha而不是每像素alpha。理论上,SDL的工作量较小,因此您可能希望获得一些速度提升。但我从来没有比较过它,过去也有一些问题
  • 你并不真的需要一个全屏位图,只需重复一个粗行即可。它应该不那么占用内存,而且可能会增加缓存。此外,你可能会通过在每次通过时做一半的线来伪造一些平滑度(需要闪电战的像素更少,看起来仍然像全局屏幕效果)
  • 为了获得最佳性能,请验证位图是否为显示格式。如果使用逐曲面alpha,请选中SDL_DisplayFormatAlpha或SDL_Display Format