Bagaimana videogame menyimpan informasi di luar layar?

16

Saya mencoba membuat videogame dari awal, tetapi saya benar-benar baru dalam hal ini dan terus mengalami masalah mendasar. Yang paling penting, bagaimana videogame menyimpan informasi di luar layar? Yang saya maksud adalah, bagaimana program tahu apa yang harus ditampilkan selanjutnya ke layar? Atau bahkan, jika pemain mengubah lingkungan, bagaimana perubahan ini tetap untuk waktu berikutnya dimuat ke layar?

Misalnya, di New Super Mario Bros, jika Anda menekan tombol? memblokir dan kemudian pergi dari layar, dan kembali, itu masih tetap mengenai. Bagaimana informasi ini disimpan dan kemudian dieksekusi saat pemain memuat blok berikutnya? Mengapa tidak mereset?

Hanya beberapa pertanyaan
sumber
24
Pedantry: Di Super Mario Bros, jika Anda menekan? memblokir dan kemudian pergi dari layar, Anda tidak bisa kembali - permainan hanya menggulir dalam satu arah, dan semua pipa lungsin adalah satu arah.
Trevor Powell
61
Ketika Anda membaca dokumen teks dan menggulir ke bawah, apakah pengolah kata Anda menghapus awal dokumen?
Philipp
31
Monitor menunjukkan jendela ke gameworld. Dunia ada di luar jendela Anda - Anda tidak melihatnya.
Felsir
11
Pertanyaan pemrograman pemula yang jauh lebih khas adalah: "Bagaimana cara menampilkan informasi saya di layar?". Bekerja melalui tutorial pemrograman apa pun dan ketika Anda sampai pada pertanyaan itu, Anda seharusnya sudah memiliki jawaban untuk pertanyaan Anda.
Peter
4
Saya bertanya-tanya seperti apa lingkungan pengembangan yang Anda kerjakan sehingga menjaga hal - hal di luar layar terdengar lebih rumit daripada membuatnya di layar :) Atau apakah ini hanya pertanyaan yang murni teoretis?
Luaan

Jawaban:

59

Biasanya Anda harus memisahkan keadaan logis lingkungan permainan Anda dari representasi visual.

Pemain mungkin hanya melihat sebagian kecil dari itu di layar mereka, tetapi Anda masih menyimpan status seluruh level dalam memori dan biasanya juga menghitung mekanisme permainan untuk seluruh level. Ketika dunia Anda begitu besar sehingga ini membutuhkan terlalu banyak ram dan / atau cpu, Anda dapat menangguhkan area yang jauh ke hard drive.

Subrutin rendering Anda memeriksa bagian mana dari level saat ini di layar dan kemudian hanya menggambar itu. Apa pun yang tidak ditampilkan di layar, tetapi itu tidak berarti itu tidak diperbarui.

Philipp
sumber
37

Anda akan mundur.

Anda mulai dengan keadaan logis dari permainan Anda dan model itu. Seluruh keadaan logis dari seluruh dunia hampir pasti akan terlalu banyak untuk disimpan dalam memori sekaligus, sehingga Anda memecahnya menjadi bagian-bagian kecil yang dapat dimuat dan disimpan secara mandiri. Bagian-bagian ini sering disebut sebagai bongkahan . Potongan-potongan ini dapat membentuk dunia yang berkelanjutan, tetapi mereka juga bisa menjadi level / instance yang terpisah. Terminologi sangat bervariasi tergantung pada genre dan teknik apa yang ingin Anda gunakan.

Kemudian Anda memuat bagian-bagian yang menarik - yaitu, potongan yang ada di sekitar pemain. Potongan yang terlalu jauh disimpan ke disk / penyimpanan permanen dan diturunkan dari memori.

Dan kemudian, sebagai langkah terakhir, Anda menentukan apa yang sebenarnya terlihat dan membuat representasi visual dari kondisi gim saat ini dan menjadikannya di layar.

Tentu saja Anda akan mencoba untuk tidak membangun kembali seluruh representasi visual setiap kali tetapi menyimpannya dan menggunakannya kembali jika Anda memiliki bagian yang sudah dibangun, tetapi itu adalah prinsip utama.


Ini berlaku untuk semua program yang memiliki output. Jika Anda menulis sebuah program dengan GUI normal, seperti editor teks, Anda mungkin akan memodelkan dokumen tersebut, dan kemudian GUI akan menentukan status dan bagian-bagian dokumen yang terlihat dan merendernya untuk disaring. Atau isi bidang formulir dengan tepat, atau yang lain.

Inti utamanya adalah: Pikirkan di mana dan bagaimana Anda menyimpan data terlebih dahulu (mungkin bersama-sama dengan cara merepresentasikannya). Hampir setiap program harus berurusan dengan penyimpanan data. Hanya ada sedikit kasus di mana Anda tidak menyimpan data apa pun.

Polygnome
sumber
7
potongan? Saya akan memanggil potongan-potongan kecil tingkat .
gbjbaanb
3
Ini bagus, kecuali untuk "sehingga Anda memecahnya menjadi bagian yang lebih kecil yang dapat dimuat dan disimpan secara mandiri. Bagian ini sering disebut sebagai potongan", yang tampaknya khusus untuk permainan dengan dunia yang sangat besar. Banyak game tidak perlu melakukan hal seperti itu. Saya tidak akan terkejut jika Anda bisa memasukkan semua data level ke memori untuk setiap sidescroller 2D yang pernah dibuat.
user253751
3
@gbjbaanb 'Level' adalah istilah yang bertanggal dan 'chunk' jauh lebih komprehensif dan konsep yang dibedakan dengan jelas. Tidak semua chunk adalah level dan tidak semua level chunk.
Lilienthal
3
Saya pikir cara yang bermanfaat untuk memikirkannya adalah bahwa secara teknis harus memungkinkan untuk memainkan seluruh permainan tanpa satu piksel yang dirender, yaitu keseluruhan permainan terpisah dari representasi visual.
Nathan K
1
@Lilienthal yakin, tapi saya pikir level masih dalam penggunaan umum, dan banyak game masih memiliki konsep - Saya tidak yakin salah satu dari mereka mengeluarkan layar "loading chunk" ketika mengambil "arena" baru kemudian pemain melewatinya. Oleh karena itu mungkin lebih dimengerti, terutama untuk OP yang baru mengenal permainan daripada istilah yang relatif teknis yang mungkin belum pernah dilihatnya sebelumnya.
gbjbaanb
6

Seperti yang orang lain katakan, Anda menyimpan peta (misalnya dalam sebuah array) dan menggambar bagian yang terlihat ke layar, dan tidak membaca kembali dari layar.

Tetapi dalam beberapa sistem lama Anda benar-benar akan menjaga data dari layar. Akan ada, katakanlah, 400x300 piksel memori video untuk tampilan 320x200, dan Anda akan menentukan viewport ke dalamnya ("mulai dari X = 10 Y = 30"). Jadi Anda bisa menggulir layar dengan hanya menyesuaikan register. Anda tidak perlu menghabiskan seratus ribu siklus yang diperlukan untuk memindahkan byte, Anda hanya perlu mengubah di mana perangkat keras video mulai membacanya.

NES memiliki ini, dikombinasikan dengan sistem berbasis ubin: http://wiki.nesdev.com/w/index.php/PPU_scrolling

NES tidak pernah membangun gambar penuh dalam memori, karena tidak memiliki cukup RAM. Sebagai gantinya, ada susunan RAM yang mendefinisikan satu set ubin selebar dua layar. Satu byte per jenis ubin. Perangkat keras video mencari ubin dan offset offset X / Y untuk memutuskan piksel apa yang akan muncul di titik mana pun.

pjc50
sumber
6
Meskipun benar, itu adalah detail implementasi - prinsip utamanya adalah Anda masih memiliki beberapa keadaan logis dan merendernya (dan ofc seperti yang saya katakan cache beberapa bagiannya, sudah menyiapkan beberapa hal yang akan datang ke sudut pandang berikutnya dll).
Polygnome
2
@ Polygnome Yah, saya telah menulis banyak game di mana layarnya adalah keadaan permainan. Sungguh menakjubkan apa yang dapat Anda lakukan dengan 4.000 byte VRAM! :)
Luaan
1

Nah, jika Anda mengajukan pertanyaan semacam ini, Anda akan memiliki jalan panjang untuk sampai ke titik di mana Anda bisa membuat permainan. Tetapi, sampai ke inti pertanyaan Anda, program ini dapat menyimpan keadaan berbagai hal dalam variabel yang ada di bagian belakang program Anda. Mari kita lihat beberapa contoh.

Mario Brothers (atau yang serupa) menyimpan status level Anda saat ini. Itu mungkin termasuk seberapa jauh Anda telah pergi sebelum Anda mati, jika sebuah blok dihantam atau tidak. Dalam arti yang lebih berorientasi objek, permainan hanya mengatakan "menjadi blok di sini" dan blok ada. kemudian ketika Anda menekan blok, blok mengubah keadaan internalnya sendiri untuk mengatakan "Saya terkena". Data seperti itu dapat disimpan dalam berbagai cara.

Pengolah kata Anda menyimpan datanya dalam struktur data. Sekarang ada banyak dari ini dan banyak cara mereka dapat diimplementasikan, tetapi mungkin menggunakan beberapa bentuk pohon. Di pohon Anda memiliki setidaknya satu simpul. Apa pun yang ditambahkan sebelum masuk ke kiri. Apa pun yang ditambahkan setelah itu, langsung ke kanan. Setelah Anda menambahkan tiga node Anda memiliki dua dari mereka menggantung simpul tengah. Dan pohon itu dapat tumbuh lebih besar dengan potongan-potongan baru ditambahkan di mana saja dan pohon itu akan dibangun kembali. Contoh pohon Atau pikirkan game penembak di mana musuh Anda berkeliaran. Masing-masing dari mereka memiliki variabel yang melacak lokasi, kehidupan, dll. Sehingga ketika Anda melukai satu, ia akan ingat bahwa itu terluka.

Semua hal ini membutuhkan pengetahuan tentang struktur data. Ini jauh melampaui apa yang Anda lihat di layar. Saya sarankan membaca tentang array, daftar, hash (kadang-kadang disebut kamus atau peta) dan kemudian kembali ke masalah Anda.

Berikut beberapa bahan awal yang bagus:

BSD
sumber
0

Sampai batas tertentu, ini adalah fungsi bagaimana 3D dirender. Sebagai contoh, OpenGL akan secara otomatis memilih geometri di luar rentang -1.0, +1.0 dalam ruang layar XY (Z lebih kompleks tetapi serupa). Geometri yang dimusnahkan tidak pernah menghasilkan fragmen (sekitar piksel) dan karenanya tidak pernah berubah menjadi citra aktual, meskipun dikirim ke sistem untuk dirender. Bagaimanapun, tidak mungkin untuk menulis ke ruang di luar jendela render (jika semuanya berfungsi sebagaimana mestinya).

Dalam beberapa konteks, cukup mengandalkan perilaku ini sebagai pengoptimalan. Namun, Anda masih harus melewatkan semua data game Anda melalui setidaknya satu tahap rendering (vertex shaders) sebelum kartu video dapat mengetahui apa yang terlihat. Dalam sesuatu seperti, katakanlah, Skyrim, itu tidak praktis. Anda tidak hanya harus mengirim setiap simpul di dunia melalui jalur render, tetapi Anda harus memuat setiap simpul ke memori sistem / video. Itu tidak efisien, jika mungkin.

Jadi, banyak game akan menggunakan culling berbasis CPU. Mereka biasanya akan menerapkan semacam sistem LOD (level of detail), di mana kualitas dan keberadaan aset dipengaruhi oleh seberapa penting mereka dinilai berada dalam konteks tertentu. Jaring piramidal mungkin merupakan perkiraan yang dapat diterima untuk gunung jika Anda berada 50 mil jauhnya. Jika Anda tidak dapat melihatnya sama sekali (seperti diblokir oleh pegunungan lain), bahkan tidak perlu memuatnya. Ada sejumlah metode yang lebih kompleks untuk melakukan hal ini yang merupakan topik yang saya rasa tidak relevan secara langsung dengan kedalaman yang diminta oleh pertanyaan ini, tetapi lihat tessellation untuk salah satu contoh paling umum.

Inti sesungguhnya dari hal ini adalah bahwa visual hanyalah produk dari permainan. Data aktual tidak ada hubungannya langsung dengan apa yang Anda lihat atau tidak lihat sebagian besar waktu, dan data disaring oleh berbagai tahap untuk menghapus informasi asing sebelum mengenai titik di mana gambar ditulis ke layar. Bergantung pada desain mesin, visual bisa sangat dipisahkan dari logika permainan yang sebenarnya, sejauh sesuatu seperti memiliki antarmuka 2D dan 3D ke permainan yang sama adalah suatu kemungkinan. Bahkan mungkin bagi banyak mesin game untuk berjalan tanpa hasil apa-apa; terkadang ini digunakan untuk menguji game AI.

Di situlah segalanya menjadi rumit. Dalam sesuatu yang sederhana seperti game Mario, tidak terlalu mahal untuk menghitung pergerakan semua musuh di level, bahkan jika mereka tidak terlihat. Dalam konteks modern, apa yang terjadi di luar layar adalah pertanyaan aktual yang menjadi pertimbangan serius. Jika ada beberapa kota seluruh NPC, bagaimana Anda menangani bagaimana mereka berperilaku ketika mereka sepenuhnya dimusnahkan - seperti ketika pemain berada di kota yang berbeda? Apakah Anda benar-benar ingin menghitung ratusan keputusan NPC di seluruh peta? Jawabannya biasanya tidak, tetapi pendekatan yang tepat untuk mencapai tidak melakukannya dapat bervariasi, dan dapat berdampak pada permainan.

Penting untuk dicatat bahwa ini adalah cara kerja sekarang . Gim-gim Mario lama itu sendiri kemungkinan diprogram dengan cara yang sangat berbeda (saya tidak dapat berbicara dengan cara yang tepat), mengingat keterbatasan perangkat keras yang ekstrem pada saat itu. Konsep 3D tidak ada saat itu; namun saat ini hampir semua gim, bahkan yang sepenuhnya 2D, menggunakan rendering 3D dalam beberapa bentuk, bahkan jika mereka tidak tahu mereka melakukannya. Perangkat keras video modern adalah yang pertama 3D, dan rendering 2D (setidaknya ketika menggunakan perangkat keras dengan benar) hanya mengabaikan dimensi ke-3.


sumber
Selain teknik LoD, ada baiknya menambahkan scenegraph ke jawaban ini - di mana dunia dapat disimpan dalam memori dan 'CPU culled' berdasarkan apa yang ada dalam tampilan.
gbjbaanb
0

Untuk menjawab pertanyaan Anda: video game menjaga keadaan dunia game dalam beberapa struktur data abstrak yang tidak ada hubungannya dengan layar. Ini kemudian ditampilkan ke layar sesuai kebutuhan (yaitu, tergantung di mana pemain berada).

Game yang menggunakan RAM video secara langsung untuk keperluan negara sekitar tahun 80-an di 8-bit, bahkan mungkin di era 16-bit, tetapi kecuali Anda mengembangkan untuk platform itu atau untuk beberapa μC yang menghitung RAM dalam KB sebagai gantinya GB, lupakan saja.

Yang mengatakan, Anda tampaknya sangat baru dalam segala hal yang berkaitan dengan pemrograman, atau pertanyaan tidak akan muncul. Saya menyarankan untuk melakukannya langkah demi langkah, memprogram hal-hal yang sangat mudah terlebih dahulu; mungkin sesuatu yang hanya memiliki input / output tekstual (petunjuk sederhana dan semua itu). Sejujurnya, saat saya melakukannya sekitar 30 tahun yang lalu, jadi saya tidak punya sumber daya yang bagus untuk Anda, tetapi perpustakaan lokal Anda mungkin lebih baik daripada internet untuk memberi Anda awal yang sangat baik dalam pemrograman.

AnoE
sumber