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?
Jawaban:
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
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.
sumber
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
OnEnterFrame
acara 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
goto
pernyataan 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.
sumber
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
/.h
memunculkan thread terpisah untuk loop Anda.sumber