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);
}
但是,这结束了被减慢到实时运行。 有没有简单的方法来实现这种效果而不会失去性能?感谢您的时间。
答
那么,你需要混合和AFAIK SDL这样做与SDL_Blitsurface的唯一方法。所以你只需要优化这个blit。我建议基准测试:
- 尝试使用SDL_SetAlpha来使用每表面alpha而不是每个像素alpha。从理论上讲,SDL的工作较少,因此您可能希望获得一些速度增益。但我从来没有比较过,过去也有过这个问题。
- 你并不需要全屏位图,只需重复一行。它应该是更少的内存密集型,也许有一个缓存增益。另外,你也可以通过在每次通过时做一半的线来减少一些平滑度(较少的像素点,并应该看起来像全局屏幕效果)。
- 为获得最佳性能,请验证您的位图是否处于显示格式。检查SDL_DisplayFormatAlpha或SDL_DisplayFormat(如果使用每表面阿尔法)
使用大于1的alpha值?它会不那么流畅但更快。 – Alink 2012-03-04 23:14:36
虽然使用大于1的alpha增量可以用于图像方法,但我希望有一种方法不同于使用预制图像。 – Shalmezad 2012-03-04 23:17:37