我正在使用SDL2在C中开发游戏,我的问题是游戏是FullHD并且具有长(180帧)角色动画,这些动画会生成非常大的精灵表。我有一个7326x7250px的spritesheet,我必须分解为16个2048x2048px,所以我可以在平板电脑上播放它们(它们的最大纹理尺寸是,在下限,2048x2048)。
考虑到这个问题,我最终想知道将动画存储在视频文件中并将每个解码帧加载到GPU中会更好。我知道解码视频帧的开销以及在GPU上切换纹理的开销(使用16个2048x2048纹理,我能够将它们存储在单个纹理阵列中,在动画期间保留GPU状态)。有没人试过这个并成功了?
答案 0 :(得分:1)
以这种方式使用视频文件会牺牲简单性,性能,图像质量和令人惊讶的内存(您需要流式传输部分视频,将其转换为位图,然后将该位图上传到图形卡)。
几乎唯一的收获就是一个较小的文件大小,我认为不值得任何这些惩罚,更不用说所有这些了。你仍然有相同的纹理限制,(或许SDL2 api在使用视频时隐藏了这个实现细节,但它仍然是一个限制所有相同的)
我不担心过多地切换纹理,因为作为一个动画,你只能每帧切换纹理一次(考虑到你要切换纹理中间框架来绘制其他对象,这不会'完全影响性能)也就是说,除非你有多个角色在不同的动画状态下使用相同的精灵表,但即使这样,根据纹理将它们组合在一起也会更容易,以减少切换。
答案 1 :(得分:0)
我不相信这是一个“真实”的问题,所以我不会给出“真正的”答案。我会选择SVG,文件非常小,您只需将它们绘制到SDL曲面或纹理中,无论您需要它们的大小。 SDL本身不支持SVG,因此请查看像Cairo这样的库。
为了您的方便,我指的是rendering SVG graphics with libSDL上的这篇论文,由Tux Paint的开发人员撰写。它应该有助于你理解一般的想法。