SDL透明覆盖

问题描述:

我想在SDL中创建一个假的“爆炸”效果。为此,我希望屏幕能够从当前的屏幕上消失,然后褪色成白色。SDL透明覆盖

本来,予想过使用SDL_FillRect像这样(其中explosionTick是当前alpha值):

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

但是,而不是相反的衰落矩形,它显示了完全白色不带alpha。另一种方法我尝试涉及使用填充有透明白色(为1的α值)的全屏幕的位图,并且一旦的blit它为每个explosionTick像这样:

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

但是,这结束了被减慢到实时运行。 有没有简单的方法来实现这种效果而不会失去性能?感谢您的时间。

+0

使用大于1的alpha值?它会不那么流畅但更快。 – Alink 2012-03-04 23:14:36

+0

虽然使用大于1的alpha增量可以用于图像方法,但我希望有一种方法不同于使用预制图像。 – Shalmezad 2012-03-04 23:17:37

那么,你需要混合和AFAIK SDL这样做与SDL_Blitsurface的唯一方法。所以你只需要优化这个blit。我建议基准测试:

  • 尝试使用SDL_SetAlpha来使用每表面alpha而不是每个像素alpha。从理论上讲,SDL的工作较少,因此您可能希望获得一些速度增益。但我从来没有比较过,过去也有过这个问题。
  • 你并不需要全屏位图,只需重复一行。它应该是更少的内存密集型,也许有一个缓存增益。另外,你也可以通过在每次通过时做一半的线来减少一些平滑度(较少的像素点,并应该看起来像全局屏幕效果)。
  • 为获得最佳性能,请验证您的位图是否处于显示格式。检查SDL_DisplayFormatAlpha或SDL_DisplayFormat(如果使用每表面阿尔法)
+0

谢谢。我希望有一个更优雅的解决方案,但它看起来像blitting是要走的路。 – Shalmezad 2012-03-05 01:54:54

+0

只是要完成,也许滥用SDL_SetGamma可以给你类似的效果,但这是一个坏主意。另外它在某些系统上不可靠。 – Alink 2012-03-05 02:08:58