在OS-X上将Cairo Surface快速转换为Pygame的方法
我在找一种方法来在Python中绘制流畅的动画。我想用cairo,部分原因是我喜欢它的子像素过滤效果,部分原因是我对这个API比较熟悉。我的第一种尝试是使用GTK.DrawingArea作为cairo表面的目标。虽然绘制速度很快,但我找不到可靠的方法将显示/缓冲与垂直同步连接起来,所以动画看起来很卡顿,不太稳定。
接下来我尝试了PyGame。根据wiki上的示例,我写了一些简单的代码来动画化各种弹跳的球。链接页面上的不同方法可以分为两类:
- 先绘制到一个离屏的cairo ImageSurface,然后用Numpy将像素缓冲区转换为Pygame表面。
- 让两个表面共享同一块内存。
第一种方法在性能上很糟糕,因为转换大约需要10毫秒,这几乎占用了我在60赫兹帧率下的所有时间。我在一台2.2GHz Core2Duo的Macbook Pro上运行代码,配有Nvidia 8400。这个时间非常依赖于表面的大小,这里是针对一个800x800的窗口。
第二种方法涉及到像素坐标的顺序。cairo和pygame都坚持只能使用RGB像素顺序,并不支持转换。问题是,当我设置一个pygame表面时,它使用的是BGRA像素顺序,这让我很困扰。
所以现在有几个问题:
- 在Mac上,有没有可能改变任一库使用的像素格式,使它们能够兼容?
- 如果不可能,纯用Python进行转换的最快方法是什么?
- 如果最快的Python方法仍然占用了大部分帧的时间,那我该如何与一些C代码接口来进行转换?
- 根据与C的接口复杂程度,使用pygame的意义有多大,是否不如直接用C编写SDL接口?
.
2 个回答
0
这些链接可能对你有帮助:pygame #cairo,squirtle svg pygame
还有一个讨论串:在PyGame应用中渲染SVG
1
这个教程也可能对你有帮助:http://www.pygame.org/wiki/CairoPygame