Sprite sebagai Aktor


12

Saya tidak berpengalaman dalam pertanyaan Pengembangan Game, tetapi sebagai programmer. Dalam bahasa Scala, Anda dapat memiliki multi-tasking yang dapat diskalakan dengan Aktor, sangat stabil, seperti yang saya dengar. Anda bahkan dapat memiliki ratusan ribu dari mereka berjalan sekaligus tanpa masalah.

Jadi saya pikir, mungkin Anda bisa menggunakan ini sebagai kelas dasar untuk 2D-Sprite, untuk keluar dari game-loop yang harus melalui semua sprite dan memindahkannya. Mereka pada dasarnya akan bergerak sendiri, dikendalikan oleh peristiwa.

Apakah itu masuk akal untuk sebuah game? Setelah multitasking seperti itu? Bagaimanapun, ini akan berjalan pada JVM, meskipun itu seharusnya tidak menjadi masalah saat ini.

EDIT:

Setelah mencoba-coba sebentar, saya perhatikan hanya ada satu keuntungan nyata untuk ide ini: Dukungan Multicore. Loop game sederhana hanya akan berjalan pada satu inti dan akan bekerja melalui semuanya secara berurutan.

Karena komputer modern, bahkan di rumah, saat ini memiliki dua atau lebih inti built-in, saya pikir itu adalah ide yang baik untuk memungkinkan pemrogram game untuk secara efisien menggunakan core lainnya. Setelah semua, saya pikir biasanya pemain hanya akan menjalankan permainan pada mesin delapan-inti, jadi mengapa tidak.

Keuntungan lain yang saya lihat adalah bahwa di Scala, Anda dapat memiliki RemoteActors, yang dapat diperlakukan dengan cara yang sama tetapi dijalankan di komputer lain. Jadi mungkin ini bisa menyederhanakan permainan jaringan juga.

Saya berniat membangun itu ke dalam mesin Scala 2D saya sesegera mungkin.


Saya akan sangat tertarik mengetahui bagaimana ini terjadi. Saya telah melihat Scala beberapa kali tetapi tidak pernah terjun ke dalamnya sebelumnya.
Davy8

Banyak yang akan berpendapat bahwa untuk dukungan multi-core eksplisit, Anda lebih baik dengan utas daripada proses (dan proses model aktor Scala). Ini karena Anda dapat memanfaatkan memori bersama di utas. Tentu saja, itu rawan kesalahan dengan cara yang model Actor tidak.
Kylotan

Aktor scala multiplexing di atas kumpulan utas, sehingga mereka bisa lebih ringan dari utas. Ini berarti mereka dapat memanipulasi memori bersama untuk berkomunikasi, asalkan disinkronkan dengan benar. Jika Anda menggunakan aktor jarak jauh, maka mereka mungkin berada pada proses yang berbeda, dan satu-satunya cara untuk berkomunikasi adalah mengirim pesan.
axel22

Jawaban:


7

Saya tidak mencoba, tetapi saya seorang programmer Scala, dan saya akan mengatakan bahwa ini bukan pendekatan terbaik. Sprite harus dianimasikan secara sinkron. Aktor tidak memiliki jaminan bahwa mereka akan dieksekusi secara adil - beberapa sprite mungkin lebih cepat daripada yang lain, yang bukan yang Anda inginkan. Anda mungkin ingin menggunakan penghalang untuk menyinkronkannya, tetapi kemudian - mengapa menggunakan aktor. Jika Anda hanya mengandalkan pesan yang lewat, menerapkan sinkronisasi semacam ini (menerapkan penghalang untuk 1000+ aktor) adalah hal yang berlebihan.

Masalah lainnya adalah - untuk apa Anda menggunakan passing pesan? Apakah Anda memerlukan sprite untuk berkomunikasi? Anda bisa mengirim pesan oleh aktor utama, memberi tahu setiap sprite untuk pindah ke frame berikutnya, tetapi dalam hal kinerja, itu magnitude dan magnitude lebih dari memanggil metode secara langsung dan beralih melalui seperangkat sprite.

Menurut saya apa yang Anda butuhkan di sini adalah semacam multitasking yang sangat ringan, dan tidak ada pesan yang lewat sama sekali. Bergulir dalam implementasi aktor-seperti Anda sendiri yang memastikan keadilan mungkin adalah cara terbaik untuk pergi jika Anda ingin memastikan ini, tapi itu terlalu banyak bekerja untuk mendapatkan terlalu sedikit. Satu hal yang perlu diperhatikan adalah pemrograman reaktif fungsional dan scala.react, saya percaya itu adalah kecocokan yang lebih baik untuk kasus penggunaan ini.

Saya telah mengimplementasikan mesin game isometrik 2d di Scala. Saya hanya menggunakan 1 aktor global untuk memperbarui sprite yang terlihat yang dianimasikan.

Anda mungkin ingin menerapkan logika game Anda menggunakan aktor - misalnya, untuk mendistribusikan perhitungan pada bagian berbeda dari peta permainan Anda ke aktor yang berbeda, sehingga mereka memperbarui keadaan game secara paralel - dan mendapatkan keuntungan kinerja. Saya tidak akan menggunakan aktor tunggal per objek game, melainkan aktor per wilayah. Jika Anda terlalu berbutir halus, kinerja akan terganggu.

Tetap saja, jika aku jadi kamu, aku akan mencobanya, hanya untuk melihat apa yang terjadi.


1

Jadi saya pikir, mungkin Anda bisa menggunakan ini sebagai kelas dasar untuk 2D-Sprite, untuk keluar dari game-loop yang harus melalui semua sprite dan memindahkannya. Mereka pada dasarnya akan bergerak sendiri, dikendalikan oleh peristiwa.

Acara apa yang menggerakkan mereka?

Apakah itu acara yang Anda pancarkan satu kali per frame?

Dan jika demikian, bagaimana ini mengubah sistem dengan cara praktis?

Ketika awalnya mempelajari orientasi objek dalam konteks C ++, saya belajar bahwa beberapa orang suka memikirkan pernyataan seperti xyz.doThis(x)makna 'mengirim pesan doThis ke xyz (dengan muatan x) dan menunggu tanggapan segera`. Jika dilihat pada level ini, tidak ada perbedaan intrinsik antara sistem berbasis peristiwa atau pesan dan sistem prosedural normal.


Aktor adalah solusi multi-utas. Komunikasi tidak sinkron. Aktor scala (konsep dari Erlang) memungkinkan program multi-core yang mudah.
Ellis

Anda memang ada benarnya, tetapi perbedaannya di sini adalah bahwa sprite berbasis Aktor tidak memblokir loop permainan saat melakukan tindakan, sedangkan metode-pendekatan menunggu sampai xyz.doThis(x)selesai. Saya pikir ini bahkan bisa membantu membuat logika game lebih cepat, terutama pada sistem multi-core.
Lanbo

Itu membuatnya lebih mudah untuk mendistribusikan penanganan entitas di beberapa core, benar. Tetapi biayanya adalah Anda tidak dapat dengan mudah merujuk dari satu aktor ke aktor lain tanpa pesan tambahan atau data tambahan yang dikirim dalam pesan. Jadi Anda dengan cepat menyadari bahwa pendekatan naif di sini tidak membantu Anda - dapatkah Anda merumuskan cara berbasis aktor untuk melakukan pembaruan?
Kylotan

Saat ini, saya bereksperimen dengan semacam pembaruan terdistribusi: Aktor saya seperti simpul dalam struktur pohon, dan memperbarui pembaruan root anak-anak, melalui distribusi pesan. Juga, keuntungan sebenarnya adalah jaringan: Di Scala, seorang Aktor dan RemoteActor (Aktor pada sistem lain) dapat diatasi dengan cara yang sama, dengan pesan yang sama.
Lanbo

Ya, tetapi masalahnya bukan pemicu pembaruan seperti itu, itu memastikan penerima pesan memiliki semua informasi yang diperlukan untuk menindaklanjutinya.
Kylotan

0

Itu pendekatan yang keren untuk berpikir tentang memperbarui objek game Anda. Saya tidak tahu Scala, tapi saya katakan mencobanya dan lihat bagaimana hasilnya, dan bahkan lebih baik kirim hasil Anda!

Pertanyaan utama yang muncul di benak saya adalah: Bagaimana Anda mengelola seberapa sering beberapa objek game diperbarui dibandingkan yang lain? Apakah Anda perlu khawatir tentang aktor sprite mengambil terlalu banyak siklus sehingga sistem rendering tidak punya waktu untuk menggambar bingkai setiap 1 / 60th | 30th | 24th per detik?

Hal lain yang perlu dipertimbangkan adalah bagaimana ini akan mempengaruhi resolusi interaksi pemain vs AI yang bergantung pada urutan urutan peristiwa yang sangat cepat. Tergantung pada jenis permainan, ini mungkin tidak mungkin tidak akan peduli banyak.


Hal yang hebat tentang Aktor Scala adalah mereka didorong oleh pesan. Masing-masing dari mereka memiliki pesan / acara-antrian sendiri. Saya tidak yakin apakah 'Draw' harus berupa pesan atau metode panggilan. Saya pikir itu akan menjadi yang terakhir, sehingga Sprite dapat diambil kapan saja, tidak peduli keadaan antrian acara mereka. Dan mereka dapat saling mengirim pesan untuk memastikan semuanya diselesaikan dalam urutan tertentu.
Lanbo

Hati-hati di sana, saya tidak berpikir setiap sprite memiliki metode Draw atau acara akan berguna, kecuali mungkin sebagai bendera untuk mengaktifkan visibilitas. Dalam fase render loop game, urutan sprite yang diberikan ke layar memiliki efek besar pada hasilnya. Jika Anda memiliki satu sprite yang terletak di depan yang lain (dimensi berada di arah monitor), Anda ingin yang satu digambar kedua. Saya melihat Aktor Scala berguna untuk bagian pembaruan / logika dari loop game.
michael.bartnett

Biasanya, Anda hanya memiliki metode menggambar di sana, jadi dengan menerapkannya seperti itu seharusnya tidak ada banyak perbedaan dengan cara normal berurusan dengan sprite.
Lanbo

Ah oke, saya salah mengerti apa yang Anda gambarkan. Saya entah bagaimana membayangkan sprite mengubah diri mereka kapan saja dan bagaimanapun mereka mau. Beri tahu kami bagaimana hasilnya!
michael.bartnett

0

Ya, saya juga bukan programmer, tapi saya tidak melihat masalah dengan proposal Anda. Saya bahkan tidak memikirkan cara mengembangkan aktor seperti itu.

Ini mungkin sebuah tantangan, karena IA harus sangat akurat, untuk menghindari perilaku yang tidak diinginkan, tetapi selain itu, saya melihat itu adalah proposal yang cukup bagus


0

Jika dengan sprite yang Anda maksud entitas game maka yakin.

Entitas game tidak boleh menggambar dirinya sendiri. Mereka harus memperbarui pegangan grafis yang menjelaskan di mana dan bagaimana mereka harus ditarik. Sistem render atau grafik adegan atau apapun gambar aslinya. Ada satu kartu grafis, lebih lanjut kartu grafis harus disinkronkan setiap 16ms. Pengaturan seperti itu tidak berfungsi dengan baik untuk pemrosesan asinkron yang didistribusikan.

Sistem render harus menjadi satu aktor (atau mungkin pasangan jika Anda rumit). Saat entitas gim memperbarui pegangan grafis, ia mengirim pesan ke sistem render. Sistem render, dapatkah mereka membuat segala macam keputusan dan / atau optimisasi, misalnya rendering batch, oklusi, smoothing jitter fisika, dll.

Saya bukan pengembang Scala, tapi saya sudah melakukan banyak hal dengan Erlang. Jadi jika beberapa terminologi Scala saya salah, mohon maafkan saya.

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.