Kinerja rendering untuk game Flash

11

Saya membaca di SO tentang rendering flash asli vs membuat BitmapDatabuffer bingkai kustom dan beberapa jawaban agak bertentangan, jadi saya bertanya-tanya:

  1. Apakah ini umumnya praktik terbaik untuk menuju rute buffer Bitmap khusus atau apakah lebih baik meninggalkan rendering ke mesin flash?
  2. Jika Anda menggunakan animasi vektor yang MovieClipbertentangan dengan sprite, apakah itu mengubah jawaban di atas?
  3. Jika ya, apakah itu praktik terbaik untuk menggunakan animasi berbasis sprite?

(Saya menargetkan Flash 10 jika itu membuat perbedaan)

Alconja
sumber

Jawaban:

14

1. Tidak ada praktik terbaik umum.

Jika Anda mendapatkan banyak elemen (bentuk kompleks), partikel, dll. Di dalam gim Anda, pendekatan buffer bitmap akan jauh lebih cepat. Buffer bitmap juga akan skala lebih baik dengan meningkatnya kompleksitas sprite Anda. Renderer vektor akan menjadi lebih lambat dengan bentuk yang lebih kompleks atau animasi tween (bentuk tween), namun memiliki beberapa manfaat lain:

  • Anda dapat dengan bebas mengukur aset Anda atau bahkan memperbesar tampilan tanpa kehilangan kualitas.
  • Rotasi atau transformasi lain seperti skewing akan lebih mudah dilakukan pada grafik vektor

Jadi sebagai kesimpulan, itu bermuara pada jenis permainan yang Anda bangun.

2. Menggunakan MovieClips alih-alih bitmap sprite-sheets

Saya kira Anda berarti "bitmap sprite-sheets" dan bukan kelas AS3 Sprite ?

Ini tidak membuat perbedaan, sungguh. Anda selalu dapat mengubah animasi berbasis MovieClip Anda menjadi bitmap animasi. Baik secara manual, dengan mengekspor film ke bingkai dan mengubahnya menjadi sprite-sheet , atau secara dinamis, dengan merender sprite sheet dari MovieClip Anda saat runtime. Begini cara saya melakukan ini:

  1. Buat instance dari MovieClip dan stop()itu.
  2. Buat new BitmapDataobjek dengan lebar dan tinggi yang sama dengan Movieclip.
  3. Gunakan metode draw () , untuk merender MovieClip ke BitmapData.
  4. Simpan objek BitmapData dalam Array atau Vektor.
  5. Pergi ke bingkai MovieClip Anda berikutnya dan ulangi Langkah 2 - 4, lakukan ini sampai Anda mencapai frame terakhir MovieClip Anda. Sebaiknya perbarui dua variabel dengan lebar maks dan tinggi maksimal bingkai MovieClip Anda (karena ini dapat berubah dari bingkai ke bingkai).
  6. Sekarang Anda dapat menggabungkan semua Objek BitmapData yang disimpan ke dalam Sprite-Sheet (gunakan BitmapData.copyPixels () )

3. Animasi berbasis sprite

Seperti disebutkan dalam jawaban untuk pertanyaan pertama Anda, tidak ada jawaban yang pasti untuk itu. Jika Anda perlu melakukan banyak transformasi dengan objek Anda, mis. scaling dan rotating Anda mungkin lebih baik dengan menggunakan renderer asli flash. Jika Anda mendapatkan animasi yang telah ditentukan yang dapat dipanggang menjadi sprite-sheet (secara manual atau dinamis), dan jika Anda perlu menampilkan ratusan sprite secara bersamaan, maka gunakan mesin rendering bitmap.

bummzack
sumber
When (if?) Flash mulai menggunakan akselerasi perangkat keras untuk renderingnya, renderer copyPixel mungkin akan lebih lambat daripada renderer asli.
Bart van Heukelom
6

Saya akan mengatakan bahwa jika Anda membangun game berbasis raster menggunakan sprite, lanjutkan dengan membangun solusi rendering khusus menggunakan BitmapData. Jika Anda membuat game berbasis vektor, gunakan mekanisme animasi bawaan menggunakan MovieClips.

Jika Anda pergi dengan membangun solusi render khusus, Anda cukup banyak melepaskan diri dari Flash menggunakan ActionScript saja untuk mencapai apa yang Anda butuhkan. Mesin flixel menggunakan metode ini dan itu cukup bagus. Saya lebih suka menulis mesin saya sendiri dari awal, tetapi Anda mendapatkan idenya.

Mengikuti mekanisme animasi Flash bawaan berfungsi paling baik untuk game berbasis vektor karena Anda dapat dengan mudah membuat aset perpustakaan Anda sebagai MovieClips yang kemudian dapat Anda instantiate di ActionScript sesuai permintaan. Anda menggunakan garis waktu yang disediakan klip video untuk menangani animasi dan memindahkan lokasi sprite sesuai. Semua Pertempuran! game seperti Adventure Quest Worlds menggunakan metode ini. Terlihat bagus juga.

Saya berasumsi pertanyaan terakhir Anda mengacu pada penggunaan kelas Sprite bukan kelas MovieClip untuk animasi vektor. Sprite adalah MovieClip tanpa timeline, jadi Anda akan kehilangan kenyamanan mengatur animasi untuk Anda.

Consty
sumber
3

Meskipun diyakini bahwa blitting lebih cepat, saya belum melihat adanya tolok ukur yang membuktikan hal ini. Beberapa pengembang lebih suka blitting karena memungkinkan mereka untuk memperlakukan Flash sebagai lebih dari mesin virtual umum, dan mengontrol render sendiri. Namun, jika Anda menyukai daftar tampilan bawaan (yang saya lakukan), Flash dapat dengan senang hati bergerak, menskalakan, memutar, dan menerapkan efek yang bagus untuk ratusan objek Display di layar (mis. MovieClips, Sprite, Bitmap) pada kecepatan bingkai tinggi, jadi sepanjang ukurannya cukup kecil, misalnya masing-masing kurang dari 200x200 piksel. Anda dapat menggunakan MovieClips tanpa menggunakan vektor. Sebagian besar game akan menggunakan aset bitmap, sistem mana pun yang mereka gunakan. Tetapi kadang-kadang berguna untuk tata letak dan menggerakkan aset bitmap pada timeline, terutama jika Anda bekerja dengan desainer spesialis Flash daripada artis piksel. Dengan mengatur kualitas panggung ke RENDAH Anda akan mendapatkan kinerja yang lebih baik dengan mengorbankan transformasi yang lebih buruk. Flash tidak akan membuat objek apa pun yang mati layar, sehingga tidak memperlambat Anda.

Di mana Flash bisa lambat bergerak dan mengubah bitmap yang sangat besar - misalnya jika Anda memiliki level pengguliran yang sangat besar, atau banyak lapisan paralaks. Pendekatan hibrid dalam menggunakan MovieClips untuk objek game Anda sambil memisahkan latar belakang dari buffer layar mungkin lebih cepat, dan akan memungkinkan Anda untuk memiliki level yang jauh lebih besar, sambil tetap memungkinkan kemudahan penggunaan Sprite dan MovieClips standar.

Iain
sumber
Bentuk vektor yang kompleks juga dapat berdampak signifikan pada kinerja. Jika Anda mendapatkan MovieClips animasi dengan banyak gradien, dan jika Anda tidak memperhatikan tingkat detail bentuk vektor Anda, maka itu akan menarik lebih lambat daripada bitmap.
bummzack
Anda dapat menggunakan MovieClips tanpa menggunakan vektor. Sebagian besar game akan menggunakan aset bitmap, sistem mana pun yang mereka gunakan. Tetapi kadang-kadang berguna untuk tata letak dan menggerakkan aset bitmap pada timeline, terutama jika Anda bekerja dengan desainer spesialis Flash daripada artis piksel.
Iain
Ya untuk game flash, saya merekomendasikan untuk tidak menggunakan gradien untuk apa pun yang akan menjadi vektor dan ditampilkan dengan mem-flash setiap frame, selain beberapa hal pada HUD dan sprite pemain. Gradien makan kinerja cepat.
AttackingHobo
Beberapa rendering dan pembaruan tolok ukur: 8bitrocket.com/2007/12/23/…
Max Dohme