我正在寻找一种在 Python 中绘制平滑动画的方法。我想使用 cairo,部分原因是我喜欢亚像素过滤,部分原因是我熟悉 API。我的第一种方法是使用 GTK.DrawingArea 作为 cairo 表面的目标。虽然绘图很快,但我找不到任何可靠的方法来将显示/缓冲与垂直同步联系起来,因此动画很不稳定且不可靠。
我的下一个方法是尝试 PyGame。使用wiki中的示例作为起点,我编写了一些简单的代码来制作各种弹跳球的动画。链接页面上的不同方法分为两类:
- 绘制到屏幕外的 cairo ImageSurface,然后使用 Numpy 将像素缓冲区转换为 Pygame 表面。
- 两个表面共享相同的内存
第一种方法的性能很差,因为转换大约需要 10 毫秒,这是我对 60 赫兹帧的大部分时间片。我在具有 2.2Ghz Core2Duo 和 Nvidia 8400 的 Macbook-pro 上运行代码。时间很大程度上取决于表面的大小,这是针对 800x800 窗口的。
第二种方法来自像素坐标的排序。cairo 和 pygame 都坚持只能使用 RGB 像素排序,不支持转换。问题是当我设置一个 pygame 表面时,它使用 BGRA 像素排序,这完全让我感到厌烦。
所以现在的问题:
- 是否可以更改 mac 上任一库使用的像素格式以相互兼容?
- 如果不可能,那么纯粹在 Python 中进行转换的最快方法是什么?
- 如果最快的 Python 方式仍然在大部分时间里占用一帧,那么我如何与一些 C 代码接口来进行转换?
- 根据 C 接口的复杂程度,使用 pygame 而不是只用 C 编写 SDL 接口有多大意义?
.