Spritesheet 动画与视频渲染

Spritesheet animation vs Video rendering

我正在使用 SDL2 在 C 中开发游戏,我的问题是该游戏是 FullHD 并且具有生成非常大的 spritesheet 的长(180 帧)角色动画。我有一个 7326x7250 像素的精灵表,我必须将其分解为 16 个 2048x2048 像素的精灵表,这样我才能在平板电脑上播放它(它们的最大纹理尺寸下限为 2048x2048)。

考虑到这个问题,我最后想知道将动画存储在视频文件中并将每个解码帧加载到 GPU 中是否会更好。我知道解码视频帧的开销和在 GPU 上切换纹理的开销(使用 16 个 2048x2048 纹理我能够将它们存储在单个纹理数组中,在动画期间保持 GPU 状态)。有没有人试过这个并成功了?

我不认为这是一个 "real" 问题,所以我不会给出 "real" 答案。我会选择 SVG,文件会非常小,您只需将它们绘制到 SDL 表面或纹理,无论您需要什么大小。 SDL 本身不支持 SVG,因此请查看像 Cairo 这样的库。

为方便起见,我向您推荐了这篇关于 rendering SVG graphics with libSDL 的论文,该论文由 Tux Paint 的开发人员撰写。它应该可以帮助您理解总体思路。

以这种方式使用视频文件会牺牲简单性、性能、图像质量和惊人的内存(您需要流式传输一部分视频,将其转换为位图,然后将该位图上传到显卡).

几乎唯一的好处是文件大小变小了,我认为单独这样做不值得任何这些惩罚,更不用说所有这些惩罚了。你仍然有相同的纹理限制,(也许 SDL2 api 在使用视频时隐藏了这个实现细节,但它仍然是一个限制)

我不会太担心切换纹理,因为作为一个动画,你可能每帧只能切换一次纹理(并且考虑到你会在帧中切换纹理以绘制其他对象,这根本不会影响性能)也就是说,除非您有多个角色在不同的动画状态下使用相同的精灵 sheet,但即便如此,根据纹理将它们组合在一起以减少切换会更容易。