Bagaimana cara kerja Pipa Input?

8

Saya menemukan artikel ini tentang mengimplementasikan pipa input untuk Android, tetapi saya tidak begitu mengerti cara kerjanya. Saya juga tidak sepenuhnya memahami konsep pemrograman pipeline atau pool. Bisakah seseorang menjelaskan konsep-konsep ini dan bagaimana mereka bekerja sebagai pipa input ini?

TMV
sumber

Jawaban:

5

Saya belum melihat kodenya secara mendalam tetapi ide dasarnya adalah bahwa peristiwa input tidak sinkron di Android, yang berarti mereka bisa terjadi kapan saja. Anda tidak ingin menginterupsi kode loop utama Anda untuk memproses acara masukan karena dapat memperlambat game Anda dan mungkin mengubah keadaan game Anda dengan cara yang tidak terduga.

Pendekatan tradisional yang digunakan dalam Lunar Lander sampel adalah memiliki blok yang disinkronkan di sekitar loop utama dan di sekitar masing-masing penangan input Anda untuk memastikan bahwa mereka tidak akan pernah terjadi pada saat yang sama. Ini mungkin pendekatan yang valid untuk gim kecil, tetapi karena gim Anda semakin rumit, Anda akan mendapati bahwa gim ini sangat tidak efisien dan mungkin tidak berfungsi dengan benar.

Artikel ini menyarankan pendekatan yang lebih baik untuk menyimpan peristiwa input dalam antrian, dan memprosesnya pada titik yang diketahui di loop utama Anda. Penangan input cukup mendorong acara (setelah membungkusnya dalam sebuah InputObject yang menggambarkannya) ke akhir antrian, dan mereka kemudian diproses dalam metode processInput di utas permainan.

Penulis artikel sebenarnya menggunakan dua antrian, antrian input dan kumpulan objek input. Kumpulan objek input dalam aktivitas utama digunakan karena kami tidak ingin terus membuat objek input baru setiap kali kami mendapatkan event input. Ini buruk karena peristiwa input sering terjadi dan membuat banyak objek akan menyebabkan pengumpul sampah sering berjalan, yang membuat game Anda berombak dan tidak responsif. Pendekatan yang lebih baik adalah membuat kumpulan objek sekali (pada dasarnya antrian) dan mengambil objek dari antrian saat Anda membutuhkannya dan mengembalikannya ke antrian saat Anda selesai. Untuk itulah antrian dalam kegiatan utama. Antrian lainnya adalah antrian input di utas game yang sebenarnya berisi peristiwa input yang diterima dan yang diproses loop game menggunakan metode processInput.

Antrian kumpulan akan selalu memiliki jumlah objek tetap (ditentukan oleh konstanta INPUT_QUEUE_SIZE yang bisa 30 misalnya) yang dialokasikan dalam metode createInputObjectPool saat aktivitas dibuat, sedangkan antrian input akan memiliki jumlah variabel peristiwa input yang diumpankan oleh aktivitas dan dikembalikan ke antrean kumpulan setelah diproses menggunakan metode returnToPool. Antrian ini adalah ArrayBlockingQueue s yang merupakan antrian normal (pertama masuk pertama keluar) diimplementasikan menggunakan array (sebagai lawan dari daftar terkait misalnya) yang akan memblokir, dalam keadaan di mana antrian normal akan meluap dan underflow, sampai antrian siap untuk operasi.

Firas Assaad
sumber
Jawaban bagus, +2 kalau bisa