Saya sedang mengerjakan sidescroller 2d di PyGame. Untuk setiap peta kami menggunakan satu tekstur (ini adalah ukuran sebenarnya dari tekstur):
Lalu kami memuat gambar dengan kode ini:
sprite = pygame.image.load("Maps/MapTesting.png")
sprite.convert()
sprite = pygame.transform.scale(sprite,
(sprite.get_width()*6, sprite.get_height()*6))
Seperti yang Anda lihat, teksturnya akan meledak 6 kali untuk membuat tekstur peta yang sebenarnya. Rata-rata tekstur ini sekitar 4500x800. Tekstur ini harus dicampurkan ke layar setiap frame , karena seluruh layar kotor (berkat gulir samping). Kami melakukannya dengan menggunakan kode ini:
screen.blit(sprite, (0, 0),
(cameraposx, cameraposy, windowheight, windowwidth))
Dan itu berhasil. Masalahnya adalah itu sangat lambat: Saya mendapatkan 40 FPS yang sedikit pada PC yang layak, dan itu tanpa AI / objek aktual yang sedang terjadi, sementara kami mengincar 60 FPS. Bagaimana kita bisa mempercepat ini?
Perhatikan bahwa kode di atas dibersihkan dan dikeluarkan dari konteks. Kode lengkap dapat ditemukan di sini: https://github.com/nightcracker/PyGG2
Dan last but not least, sementara gambar di atas mungkin terlihat seperti 8-bit, ada elemen dalam game yang membutuhkan kedalaman bit lebih.
Jawaban:
Biarkan saya daftar beberapa optimasi umum dibandingkan terkait dengan Blitting piksel ke permukaan (dari pengalaman saya).
1) Biasanya gambar palet (gambar yang diindeks) saat blitted, akan menjalani satu tingkat pengalihan tambahan (untuk mendapatkan warna).
2) Data piksel warna yang sebenarnya (anggap Tanpa Alpha - say24 bit data) dapat dicairkan dengan sangat cepat karena kita dapat melakukan memcpy untuk setiap garis pemindaian gambar (jika kita menyalin bagian gambar) ke buffer bingkai perangkat Jika data yang akan dicap adalah gambar penuh, maka kita bisa langsung memcpy seluruh data yang jauh lebih cepat!
3) Blitting data pixel Alpha akan menjadi yang paling mahal karena akan termasuk menghitung setiap komponen yang dihasilkan dan kita perlu mengemasnya lagi ke data RGB. Secara sederhana, lebih banyak operasi untuk setiap piksel untuk mendapatkan warna akhir!
Saya belum pernah menggunakan pyGame sebelumnya. Tapi, sekilas tentang kode sumbernya, buat saya berasumsi bahwa ia menggunakan fungsi 'sdl' Blit di bawah tenda. Biasanya Sdl blit akan sangat cepat dan dioptimalkan, jadi buat saja bukan poin dan profil di atas sekali lagi! Semoga berhasil!
* Pembaruan: * Pengaturan tombol warna seperti menambahkan satu pemeriksaan tambahan ketika menggigit setiap piksel ke permukaan. Beberapa hal seperti ini -
Jadi, di sini jika Anda lihat, kami dibatasi untuk tidak menggunakan memcpy karena kami perlu memeriksa validitas warna setiap piksel!
sumber
set_colorkey
memasukkan tekstur peta, memberikan saluran alpha (mahal). Yangconvert
diperbaiki itu, dan sekarang saya menjalankan 150 FPS stabil pada PC omong kosong ini. Terima kasih!sprite.convert()
tidak melakukan apa yang Anda pikirkan.sprite = sprite.convert()
adalah apa yang kamu butuhkan.sumber
sprite = sprite.convert()
kode sebenarnya :)sprite = pygame.image.load("Maps/MapTesting.png").convert()