Я ищу способ рисовать плавные анимации в Python. Я хочу использовать cairo, отчасти потому, что мне нравится субпиксельная фильтрация, а отчасти потому, что я знаком с API. Моим первым подходом было использование GTK.DrawingArea в качестве цели для поверхности Каира. Хотя рисование было быстрым, я не смог найти надежного способа привязать отображение / буферизацию к вертикальной синхронизации, чтобы анимация была прерывистой и ненадежной.
Мой следующий подход - попробовать PyGame. Используя примеры из wiki в качестве отправной точки, я написал простой код для анимации различных прыгающих шаров. Различные подходы на связанной странице делятся на две категории:
- Рисуем за кадром за Каир
ImageSurface, а затем использовать Numpy для
преобразовать пиксельный буфер в Pygame
поверхность.
- Совместно используйте одну и ту же память для обоих
Поверхности
Первый подход отстой для производительности, так как преобразование занимает около 10 мс, что является большей частью временного интервала, который у меня есть для кадров 60 Гц. Я запускаю код на Macbook-pro с 2,2 ГГц Core2Duo и Nvidia 8400. Время очень зависит от размера поверхности, это для окна 800x800.
Второе сближение поверхностей из упорядочения координат пикселей. И cairo, и pygame настаивают на том, что они могут использовать только порядок пикселей RGB и не поддерживают преобразование. Проблема в том, что когда я настраиваю поверхность пигмея, она использует упорядочение пикселей BGRA, что полностью меня затягивает.
Итак, теперь по вопросам:
- Можно ли изменить пиксель
формат, используемый любой библиотекой на
Mac, чтобы быть совместимым с каждым
другой
- Если это невозможно, что это
самый быстрый способ сделать преобразование
чисто на питоне?
- Если самый быстрый способ Python по-прежнему
сосет большую часть времени для
кадр, то как я могу взаимодействовать с
какой-нибудь код C для преобразования?
- В зависимости от сложности
Интерфейс для C, сколько стоит
там в использовании Pygame вместо
просто пишу интерфейс SDL на C?
.