Apakah menggunakan beberapa objek kanvas merupakan praktik yang baik?


12

Kami sedang mengembangkan permainan lompat dan lari dengan HTML5 dan JavaScript dan harus membuat kerangka kerja permainan sendiri untuk ini. Di sini kami memiliki beberapa kesulitan dan ingin meminta saran kepada Anda:

Kami memiliki objek "Panggung", yang mewakili akar permainan kami dan merupakan pembungkus div global. Panggung dapat berisi beberapa "Adegan", yang juga merupakan elemen div. Kami akan menerapkan Scene untuk tugas bermain, untuk jeda, dll dan beralih di antara mereka. Oleh karena itu setiap adegan dapat mengandung beberapa "Layers", mewakili kanvas. Lapisan ini berisi "ObjectEntities", yang mewakili gambar atau bentuk lain seperti persegi panjang, dll. Setiap Objectentity memilikiCanvas sementara sendiri, untuk dapat menggambar gambar untuk satu entitas, sedangkan yang lain berisi persegi panjang.

Kami menetapkan ActiveScene di Stage kami, jadi ketika game dimainkan, hanya adegan aktif yang diambil. Memanggil activeScene.draw(), memanggil semua sublayer untuk menggambar, yang menarik entitas mereka (panggilan drawImage(entity.canvas)). Tetapi apakah ini semacam praktik yang baik? Memiliki beberapa kanvas untuk menggambar? Setiap loop game, setiap konteks layer dihapus dan ditarik lagi. Misalnya kita masih memiliki Background-Layer, ... bukankah akan lebih berguna untuk menggambar ini sekali dan tidak menghapusnya setiap kali dan menggambarnya kembali? Atau haruskah kita menggunakan kanvas global misalnya di Panggung dan cukup menggunakan kanvas ini untuk menggambar? Tapi kami pikir ini akan mahal ...


1
Mengapa Anda memiliki banyak kanvas? Jika ini merupakan pengoptimalan, mengapa Anda tidak menguji dengan dan tanpa?
Denys Séguret

1
Anda harus menghapus "pertanyaan lain". Dan jangan mempostingnya lagi, kecuali jika Anda ingin mendapatkan "Ditahan" :)
MartinTeeVarga

Jawaban:


7

Halaman ini berisi daftar optimisasi luar biasa yang dapat dibuat untuk kanvas. Pada bagian yang berlabel "Gunakan beberapa kanvas berlapis untuk adegan kompleks" ini menjelaskan mengapa memiliki beberapa objek kanvas sebenarnya lebih baik dalam banyak kasus karena Anda tidak perlu menggambar ulang objek mahal besar (gambar latar belakang) sesering yang lebih kecil, yang bergerak cepat ( proyektil). Berikut adalah tutorial untuk memulai. Singkatnya, cukup buat sejumlah kanvas untuk hal-hal yang membutuhkan gambar berbeda dan sejajarkan dengan posisi absolut:

position:absolute;
left:0px;
top:0px;

Setiap objek kanvas dapat diberi nama dan berlapis menggunakan z-index:

<canvas id="layer1" style="z-index: 1;" />
<canvas id="layer2" style="z-index: 2;" />

Akhirnya, gambarlah ke konteks yang berbeda:

function draw1() {
    context1... // draw background
}

function draw2() {
    context2... // draw character
}

function draw3() {
    context3... // draw bullets
}

2
Alangkah baiknya jika Anda bisa membuat abstrak kecil dari tautan tersebut. Kalau tidak, jawaban Anda mungkin menjadi tidak valid ketika tautan berhenti berfungsi ...
MartinTeeVarga

Terima kasih, tautan ini cukup bagus. Saya berhasil melakukan redraw area khusus yang kotor, jika objek bergerak misalnya.
user1818924

@ sm4 Poin bagus, saya akan menambahkan sesuatu.
CuddleBunny

2

Sebenarnya, Contre Jour melakukan ini. Saya tidak tahu banyak detail, tetapi Anda mungkin dapat menemukan lebih banyak catatan teknis dari mereka. Jika Anda memainkan permainan mereka, saya yakin setiap daratan yang berinteraksi dengan karakter Anda adalah kanvas.

Tampaknya menjadi ide yang bagus untuk memisahkan bagian aktif Anda dari permainan menjadi kanvas. Misalnya, jika Anda membuat RTS, bilah perintah mungkin masuk akal untuk menjadi kanvas terpisah untuk hanya menggambar ulang sesekali.


Memberitahu kami bahwa game yang dirilis melakukan ini menarik, tetapi tidak memberi tahu kami apakah itu latihan yang bagus. Mungkin para pengembang menyesali keputusan itu? Juga, beberapa sumber bukti penggunaannya akan menyenangkan.
MichaelHouse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.