Latar Belakang: Saya memiliki latar belakang pengembangan yang luas, tetapi terakhir kali saya membuat kode permainan adalah beberapa tahun yang lalu. Keahlian Javascript saya sangat terbatas, dan saya bermaksud untuk memperbaikinya dengan membangun permainan sederhana - Tetris, Pac-man, atau sesuatu dengan tingkat kerumitan itu.
Pertanyaan: Tampaknya bagi saya bahwa pilihan mendasar yang perlu saya buat adalah apakah saya harus memberikan <canvas>
elemen atau tidak.
Dengan kanvas, saya memiliki alat dasar untuk memberikan titik, garis, dan hal-hal yang lebih kompleks di atas itu. Agaknya ada, atau akan ada, juga berbagai kerangka kerja untuk membantu hal ini.
Tanpa kanvas, saya bisa menyimpan objek saya di pohon DOM, seperti halaman web biasa, hanya cukup kompleks, dengan banyak elemen yang tumpang tindih.
Apakah satu pendekatan lebih baik dari yang lain? Apakah mereka saling eksklusif? Bagaimana saya tahu harus memilih yang mana?
sumber
Tentang DOM
DOM bekerja cukup baik untuk 2D jadul, yang berarti tidak menggunakan rotasi gambar atau penskalaan. Sebenarnya ada alat untuk kedua pekerjaan ini, tetapi Anda tidak dapat mengandalkan mereka untuk bekerja dengan baik.
Untuk gim, Anda harus mengandalkan mesin tata letak peramban sesedikit mungkin, artinya gunakan
position:absolute
untuk menempatkan objek. Usahakan sejauh mungkin untuk tidak membuat dan menghancurkan objek DOM sepanjang waktu, jika Anda membutuhkan jumlah objek yang sangat bervariasi, Anda mungkin ingin kumpulan elemen DOM yang tidak aktif diaturdisplay:none
, siap untuk dihidupkan kembali saat diperlukan.DOM vs kanvas
Dengan pangsa pasar kanvas menyusut IE8 menjadi pilihan yang lebih dan lebih menarik, untuk sebagian besar permainan itu mungkin pilihan yang baik. Tetapi untuk beberapa pekerjaan, DOM adalah alat yang lebih mudah digunakan, Anda dapat menggunakan beberapa aliran dokumen jika diperlukan, Anda dapat menangkap klik langsung oleh objek yang diberikan, mudah untuk mengintegrasikan bilah gulir.
Sulit untuk menutupi perbedaan kinerja, itu tergantung pada pekerjaan dan akan sangat bervariasi dari browser ke browser.
sumber
position:absolute
, itu poin yang bagus.Sepenuhnya tergantung pada jenis permainan, meskipun kanvas cocok untuk "sebagian besar" dari mereka.
Manajemen DOM menjadi sangat buruk pada titik tertentu, semakin banyak elemen yang Anda dapatkan semakin lambat, semakin banyak elemen yang Anda gunakan untuk bergerak dengan sangat lambat.
Mengelola pesanan pemuatan aset dengan elemen IMG adalah ... non-trival (kesalahan intersepsi pada protokol yang sengaja dipatahkan pada tag gambar: D).
Meskipun, untuk game dengan sebagian besar citra statis dan jumlah efek rendah, saya tetap menggunakan DOM. Yang lainnya, kanvas adalah pilihan pertama (Poin dan mengklik barang, meskipun hitmaps adalah cerita yang berbeda).
Kanvas sangat cepat akhir-akhir ini (bahkan pada iPhone), hampir tidak ada alasan untuk tidak menggunakannya.
sumber
Jika Anda membuat game HTML5, kanvasnya jauh lebih baik. Inilah alasannya:
Sisi bawah - Animasi - Meskipun ada banyak perpustakaan hebat untuk animasi, saya suka animasi CSS3. Sangat mudah untuk dibuat, dimanipulasi, dan dipicu. Ada berbagai peretasan untuk membuat animasi CSS3 berfungsi dengan objek dengan kanvas, tetapi saya curiga kebanyakan orang memilih untuk tidak menggunakan metode itu.
Semoga berhasil dengan gim Anda, dan saya berharap dapat melihat apa yang Anda hasilkan!
sumber
Jika Anda mempertimbangkan untuk menargetkan browser seluler, khususnya Android, dan game tersebut mengandung grafik bergerak, hindari animasi DOM. Browser stok di Android tidak berguna, meskipun itu adalah webkit. Lihat utas masalah Android ini sebelum Anda mulai: "Render mengerikan CSS3 dan animasi Javascript di Browser dan WebView" .
Kanvas itu sendiri mungkin tidak lebih cepat, tetapi ada kerangka kerja untuk meminta akselerasi perangkat keras untuk animasi kanvas, misalnya CocoonJS . Ada tautan ke video di situs, yang menunjukkan keuntungan kinerja yang dapat Anda capai dengan menggunakan kerangka kerja (tapi saya tidak diizinkan memposting lebih dari dua tautan, karena alasan tertentu).
sumber
Jawaban sederhana: WebGL dengan fallback kanvas.
Jawaban bernuansa: Jika game Anda memiliki banyak teks, overlay layer teks HTML. Pixi.js adalah kerangka tampilan yang diperkeras dengan beberapa tambahan berguna yang berfungsi dengan baik untuk ini.
sumber
Ingat DOM singkatan dari model objek dokumen . Anda ingin menggunakannya untuk membuat game hanya dalam situasi yang sangat jarang dan lebih suka kanvas dalam banyak kasus.
Bahkan jika gim Anda memiliki persyaratan grafis yang kecil, melakukannya di DOM akan memiliki kinerja yang buruk; apapun yang lebih dari Tetris mungkin akan berjalan buruk.
Saya punya contoh dunia nyata: Ketika saya membuat implementasi Conway's Game of Life, saya mulai dengan tabel 500x500, mengubah warna latar sel. Dalam versi ini, Glider tidak berjalan pada lebih dari 30 fps, pola yang lebih besar menghasilkan hampir tidak lebih dari 1. Dalam versi kanvas saya dari permainan ini, sekarang mungkin untuk menjalankan patters yang jauh lebih besar (populasi 1000 dan lebih) dengan lancar di ~ 30 fps.
Juga, ini juga harus menjadi kasus untuk SVG (Scalable Vector Graphics), walaupun saya tidak pernah mencobanya dalam praktik.
Sunting : Saya harus mengakui bahwa contoh saya tidak terlalu baik (karena tables = bad). Tetapi poin utamanya masih benar: manipulasi DOM adalah untuk dokumen. Peramban harus mencari CSS dan mengalokasikan lebih banyak memori saat Anda mengerjakan elemen. Tidak masuk akal untuk lebih cepat dari kanvas.
sumber