Apakah utas terpisah untuk game loop wajib untuk game sederhana?

10

Saya baru dalam pengembangan game. Untuk belajar saya membuat ulang game ini di platform android. Anda dapat mengamati video permainan-bermain di tautan di atas. Ini adalah permainan sederhana.

Saya telah membaca banyak artikel tentang memulai dengan pengembangan game. Hampir semuanya direkomendasikan menggunakan loop game pada utas terpisah, yang masuk akal untuk game lain. Namun, untuk game khusus ini, apakah saya perlu memulai utas terpisah?

jin
sumber
Tidak yakin ini duplikat, karena ini tentang Android. Ada beberapa pertimbangan lain tentang threading dalam platform berbasis Java yang berbeda dari pertanyaan itu.
Sean Middleditch

Jawaban:

8

Gim permainan umumnya disarankan karena sederhana . Hampir semua game dapat dikembangkan dan dijalankan dengan benar dengan menggunakan loop, dan sebagian besar game membutuhkannya untuk berfungsi dengan baik.

Sebagai contoh, sebagian besar mesin fisika membutuhkan pembaruan konstan yang dapat diandalkan untuk simulasi yang tepat. Animasi dan konten dan grafik dinamis lainnya perlu diperbarui setiap perubahan, dll ... Aka sesuatu yang Anda dapatkan secara praktis gratis menggunakan loop.

Sekarang ketahuilah bahwa loop Anda tidak harus berjalan di utas terpisah. Bahkan sebagian besar game akan menjalankan loop pada utas utama untuk kesederhanaan. Bahkan proyek Android saya mengikuti prinsip ini.

Sekarang pertanyaan sebenarnya di sini adalah alternatif apa yang Anda usulkan? Jika Anda memiliki ide lain tentang cara mendapatkan input dengan andal, melakukan pembaruan, dan menggambar bingkai yang cocok untuk Anda, silakan lanjutkan! Kalau tidak, loop game mungkin merupakan cara termudah untuk memulai.


sumber
Alternatif yang saya pikirkan adalah memperbarui layar menggunakan utas utama itu sendiri karena semua aksi dilakukan secara beruntun - pemain menggesek bola warna yang sama, lalu semua bola yang disentuh menghilang, bola yang tersisa jatuh karena gravitasi bersama dengan bola pengganti.
jin
Jadi Anda tidak bertanya apakah diperlukan loop? Perhatian utama Anda adalah jika harus berada di utas terpisah, benar?
AturSams
1
benar. pertanyaan saya adalah tentang utas bukan loop. untuk permainan sederhana seperti itu (walaupun saya akan beruntung bisa membuat permainan seperti itu) apakah saya perlu menelurkan utas baru atau semuanya dapat dilakukan pada utas utama?
jin
1
Tidak, itu tidak perlu. Selama Anda memiliki loop , maka tidak perlu membuat loop kedua .
@jin Anda harus benar-benar mengubah judul dan cara Anda menulis pertanyaan Anda.
vallentin
5

Tidak , utas terpisah tidak diperlukan. Jika Anda tidak melakukan sesuatu yang terlalu intens (yang tidak terlihat seperti itu dalam permainan yang Anda perlihatkan kepada kami), semuanya dapat dilakukan di utas utama.

Utas kedua diperlukan jika Anda melakukan banyak pemrosesan atau mengalami masalah dengan UI / input menjadi tidak responsif. Misalnya, dalam game yang lebih kompleks, Anda tidak ingin UI / input menjadi tidak responsif ketika AI menghitung langkah selanjutnya. Karena permainan Anda tampaknya terutama merespons input pengguna dan memperbarui visual, utas kedua tidak diperlukan.


Menjawab pertanyaan "Is a loop required".

Tidak , tetapi alternatifnya lebih rumit, lebih sulit diterapkan dan jarang digunakan.

Game menurut definisi interaktif. Minimal, itu menunggu input dan memperbarui output. Cara paling sederhana untuk melakukannya adalah dengan loop. Tidak perlu menelurkan utas baru untuk itu.

Meskipun gim yang Anda sebutkan tampak sederhana, gim ini memiliki visual dan suara interaktif dan terus-menerus memperbarui yang didasarkan pada input pengguna.

Tidak ada banyak alternatif selain loop game. Beberapa jenis sistem berbasis interupsi dapat dimungkinkan. Namun, sistem tersebut meningkatkan kompleksitas dan mengurangi faktor-faktor lain seperti determinisme. Ada alasan mengapa loop game sangat umum, mereka mudah diimplementasikan, mudah dimengerti, fleksibel dan melakukan pekerjaan dengan baik.

MichaelHouse
sumber
Satu-satunya saat saya mengalami gangguan tingkat yang lebih rendah adalah ketika tugas HW tertentu dilakukan dan CPU / OS perlu diberitahukan sehingga mereka dapat memprosesnya dengan benar (membaca data dari disk ke dalam memori dan kemudian diberitahu bahwa itu sudah siap sehingga kami dapat kembali) kontrol ke aplikasi dan memungkinkan untuk memprosesnya) jadi saya tidak tahu apa yang Anda maksud dan salah mengartikannya.
AturSams
2

Jawab pertanyaan aktual (Apakah loop game harus berada di utas terpisah):

Alasan orang sering merekomendasikan menggunakan utas terpisah adalah karena mereka tidak ingin pemrosesan yang berat mengganggu interaktivitas UI. Anda adalah satu-satunya yang dapat mengetahui apakah utas terpisah diperlukan untuk gim Anda . Ini sepenuhnya tergantung pada mesin dan kerangka kerja jika loop game utama dalam desain Anda saat ini dapat mengganggu waktu respons UI. Kupikir kamu pada umumnya menganggap itu tidak akan (dalam proyek kecil) kecuali kamu punya alasan untuk berpikir sebaliknya.

Alasan lain untuk menyimpan kode di utas terpisah adalah untuk menjaga kode tetap modular dan sederhana. Memiliki dua potongan kode yang tidak terkait dicampur bersama sering dapat menyebabkan kode menjadi kurang mudah dibaca dan dikelola dalam jangka panjang.

Apakah loop game perlu dijalankan di utas terpisah itu sendiri? Mungkin. Jika ada masalah dengan waktu respons atau kode dan Anda perlu beberapa item UI untuk merespons terlepas dari proses yang berat atau Anda hanya ingin memecah kode menjadi tugas-tugas spesifik yang terjadi secara bersamaan karena alasan desain, maka ikutilah. Namun, ini dianggap sebagai praktik pemrograman tingkat lanjut .

Contoh sederhana tapi mungkin bukan contoh yang bagus untuk diilustrasikan adalah permainan dua pemain. Anda mungkin ingin menjalankan dua instance kelas yang menangani input pengguna dan mengonversi untuk menyatakan perubahan pada instance karakter pemain.

Beberapa kerangka kerja mendorong / mengharuskan Anda untuk memanfaatkan dan sistem berbasis acara / interupsi seperti yang dilakukan ActionScript3.0. Dalam hal ini kode loop biasanya akan pergi ke OnEnterFrameacara atau sesuatu yang serupa yang terjadi 20 - 60 atau 120 kali per detik.


Jawab pertanyaan awal (Apakah saya memerlukan loop utama):

Semuanya bermuara pada program counter . Jika Anda membuat gim yang akan menjalankan lebih dari jumlah waktu yang telah ditentukan dan tidak akan menghasilkan kode saat berjalan, maka Anda perlu meminta pc pengguna Anda untuk mengulangi beberapa instruksi yang telah diproses dan apa yang mungkin akan berubah di sementara itu adalah negara (nilai-nilai yang disimpan dalam objek dan global permainan).

Karena Anda tahu Anda perlu mengulangi instruksi, ada beberapa cara untuk menyelesaikan tugas ini dan terus memproses instruksi yang sama. Semua metode ini melibatkan memindahkan penghitung program kembali ke instruksi yang saat ini relevan. Pernyataan aliran kontrol yang paling umum yang menyebabkan kode diulang disebut loop, yang lain adalah gotopernyataan yang jarang digunakan dalam kode modern dan memiliki efek yang serupa dalam kasus ini (sama sekali tidak relevan dengan Anda).

Jadi untuk menjawab pertanyaan Anda sebelumnya, apakah Anda memerlukan satu loop? Ya, benar.

AturSams
sumber
1
Sejauh yang saya tahu, kerangka kerja berbasis acara, seperti AS3, masih memiliki loop permainan yang berjalan di bawahnya. Saya berbicara tentang gangguan level bawah, bukan kerangka kerja yang mengimplementasikan sistem acara.
MichaelHouse
Hmm .. Saya tidak berpikir orang sering menggunakan interupsi tingkat yang lebih rendah dalam game. AFAIK mereka terutama digunakan oleh CPU untuk memantau operasi IO. Saya sedang memikirkan abstraksi tingkat yang lebih tinggi sebagai praktik desain di mana Anda merespons input pengguna atau aktivitas perangkat keras (tanpa polling) daripada menjalankan beberapa instruksi setiap frame dan kemudian memberitahu HW untuk memberikan hasilnya.
AturSams
1
Ya, orang tidak lagi sering menggunakannya. Seperti yang saya katakan, mereka lebih sulit digunakan dan kami memiliki cara yang lebih baik dalam melakukan berbagai hal sekarang. Saya mengerti apa yang Anda katakan, dan itu tentu cara yang berbeda untuk memikirkan sesuatu, tetapi hanya pada permukaan yang tampak berbeda, di bawah itu adalah jenis loop yang sama.
MichaelHouse
Saya setuju dengan @ Byte56 itu bermuara pada satu lingkaran, kecuali kita berbicara tentang peristiwa tingkat kernel yang menggunakan interupsi IO.
concept3d
1
Saya tahu itu, tetapi sebagian besar dari semua yang kami lakukan adalah sama di bawah permukaan (seperti saya katakan, mengubah nilai program counter). Ini bukan rahasia dan saya tunjukkan dalam jawabannya. Pemrograman berbasis peristiwa tampaknya berbeda karena kami memindahkan penghitung program ke fungsi yang berbeda ketika berbagai peristiwa terjadi. Jelas ada kemungkinan polling loop untuk memeriksa apakah peristiwa ini baru-baru ini terjadi tetapi sebagai prinsip desain tampaknya berbeda.
AturSams
0

Hanya dengan menambahkan jawaban orang lain di sini, sesuatu yang tidak seorang pun telah secara eksplisit menyebutkan: Jika Anda mengambil risiko menjalankan loop game Anda di utas kedua dan itu menjadi tidak responsif, Anda berisiko OS menghentikan aplikasi Anda. Karena itu disarankan untuk menggunakan utas terpisah. Oleh karena itu (misalnya) NDK native_app_glue.c/ .hmemunculkan thread terpisah untuk loop Anda.

Insinyur
sumber