【问题标题】:SDL Transparent OverlaySDL 透明覆盖
【发布时间】:2012-03-04 22:55:46
【问题描述】:

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

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

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

但它不是反向淡入淡出的矩形,而是完全白色,没有 alpha。我尝试的另一种方法涉及使用填充透明白色(alpha 值为 1)的全屏位图,并为每个爆炸Tick 像这样将其 blit 一次:

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

但是,这最终导致实时运行速度变慢。 有没有什么简单的方法可以在不损失性能的情况下实现这种效果?感谢您的宝贵时间。

【问题讨论】:

  • 使用大于 1 的 alpha 值?它会变得不那么流畅,但速度会更快。
  • 虽然使用大于 1 的 alpha 增量适用于图像方法,但我希望有一种不同于使用预制图像的方法。

标签: c++ graphics transparency sdl


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我希望有一个更优雅的解决方案,但看起来 blitting 是要走的路。
  • 为了完整起见,也许滥用 SDL_SetGamma 可以给您带来类似的效果,但这是个坏主意。此外,它在某些系统上不可靠。
猜你喜欢
  • 2016-12-10
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多