Buat frame rate pygame lebih cepat

10

Dengan membuat profil game saya, saya melihat bahwa sebagian besar waktu eksekusi game hobi saya adalah antara blit dan flip call. Saat ini, hanya berjalan sekitar 13fps. Kartu video saya cukup baik, jadi dugaan saya adalah pygame tidak menggunakannya.

Adakah yang tahu tentang opsi grafik / tampilan yang perlu saya atur di pygame untuk membuatnya lebih cepat? Atau apakah ini hanya sesuatu yang harus saya jalani sejak saya memilih pygame?

Menghancurkan
sumber

Jawaban:

12

Jika Anda menjalankan dalam mode layar penuh, Anda dapat menggunakan pygame.HWSURFACEbendera saat Anda menginisialisasi layar untuk memberi tahu pygame untuk mencoba menggunakan permukaan perangkat keras. Saya percaya bahwa jika permukaan perangkat keras tidak dapat digunakan, pygame akan diam-diam menggunakan permukaan perangkat lunak.

Jika Anda tidak menggunakan permukaan hardware, pertimbangkan untuk menggunakan pygame.display.update(rectangle)bukan pygame.display.flip(). Ini hanya akan memperbarui persegi panjang yang diberikan daripada seluruh tampilan, yang dapat meningkatkan kinerja Anda sedikit kecuali game Anda benar-benar perlu memperbarui seluruh tampilan.

Jika Anda menggunakan perangkat keras atau permukaan OpenGL, ada juga pygame.DOUBLEBUFyang menggunakan buffer ganda perangkat keras, yang berarti bahwa fungsi menggambar Anda akan menarik ke salah satu dari dua buffer dan flip()akan menukar buffer mana yang terlihat.

talljosh
sumber
5

Satu hambatan dalam pygame sebenarnya adalah rendering font. Anda tidak harus merender teks yang sama (dengan font / warna yang sama) lebih dari satu kali, melainkan men-cache permukaan yang pernah dibuat dan menggunakannya kembali. Ambil ini ke dalam akun jika Anda menggunakan Font.render () banyak.

kemalasan
sumber
4

Selain jawaban talljosh, saya ingin memberikan beberapa saran lagi:

Hindari rotasi dan penskalaan dimanapun Anda bisa. Operasi semacam itu dilakukan murni pada CPU dan cenderung sangat, sangat lambat.

Jika Anda melakukan pembacaan / modifikasi pixel langsung, gunakan Surface.get_buffer()metode dan bekerja dengannya, daripada menggunakan Surface.set_at()/get_at()metode.

Cody Brocious
sumber
2

Komentari semua output konsol uji yang Anda miliki. Ini dapat mengurangi framerate secara drastis, terutama jika Anda menghasilkan antara rotasi dan penskalaan, seperti yang dikatakan Cody di atas.

kymully
sumber
2

Benar bahwa Pygame tidak menggunakan kemampuan akselerasi 3D kartu video Anda. Ini karena didasarkan pada SDL yang memiliki batasan yang sama. Salah satu alternatifnya adalah menulis ulang gim Anda dalam sistem seperti pyglet yang tidak mendukung spanduk akselerasi OpenGL, untuk menemukan pustaka yang serupa hanya untuk grafis, atau untuk menulis sendiri kode OpenGL untuk ini.

Kylotan
sumber
Pyglet sangat bagus.
Bebek Komunis
1

Satu hal yang sangat sederhana untuk dilakukan adalah menggunakan psyco . Saya tidak tahu berapa banyak itu akan membantu, tetapi karena yang diperlukan hanyalah

 import psyco
 psyco.full()

untuk mulai berlari, Anda bisa mencobanya.

Nikwin
sumber
Psyco benar-benar tidak akan banyak membantu dengan kode Python idiomatik modern. Gunakan PyPy jika Anda menginginkan JIT (tidak yakin apakah PyGame berfungsi di sana).
coderanger
Pygame tidak berfungsi di bawah PyPy, tetapi Pyglet melakukannya di sana.
coderanger