c - Spritesheet 动画与视频渲染

标签 c opengl sdl-2 ogg-theora

我正在使用 SDL2 用 C 语言开发游戏,我的问题是该游戏是全高清的,并且具有长(180 帧)角色动画,会生成非常大的 Sprite 表。我有一个 7326x7250px 的 Sprite 表,我必须将其分解为 16 个 2048x2048px 的 Sprite 表,这样我就可以在平板电脑上播放它(它们的最大纹理大小的下限为 2048x2048)。

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

最佳答案

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

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

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

关于c - Spritesheet 动画与视频渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067427/

相关文章:

c++ - SDL2 RenderCopy 多个纹理与单个表面

c - C 逐个字符读取文件并比较这些字符

c++ - OpenGL 不渲染颜色

C++ VBO 渲染问题

c++ - 为什么我会收到 "was not declared in this scope"错误?

canvas - 如何使SDL(2)在调整大小时刷新convas内容?

c - libxml2如何处理碎片

c - Windows 指针位图未正确更新

c - C 中的嵌套循环 strtok_r 通过用 ';' 和 ' ' 分隔出现问题

c++ - Float/Double 比较在太阳系模拟中不起作用