Saya agak penasaran bagaimana replay dapat diimplementasikan dalam sebuah game.
Awalnya, saya berpikir bahwa hanya akan ada daftar perintah dari setiap tindakan pemain / ai yang diambil dalam permainan, dan kemudian 'memainkan kembali' permainan dan membiarkan mesin membuat seperti biasa. Namun, saya telah melihat tayangan ulang di FPS / RTS game, dan setelah pemeriksaan hati-hati bahkan hal-hal seperti partikel dan grafis / gangguan terdengar konsisten (dan orang-orang Glitches umumnya di konsisten).
Jadi, bagaimana ini bisa terjadi? Dalam permainan sudut kamera tetap saya pikir itu mungkin hanya menulis setiap bingkai dari seluruh adegan ke aliran yang disimpan dan kemudian hanya memutar ulang aliran kembali, tetapi itu sepertinya tidak cukup untuk permainan yang memungkinkan Anda untuk menjeda dan memindahkan kamera sekitar. Anda harus menyimpan lokasi semua yang ada di adegan di semua titik waktu (Tidak?). Jadi untuk hal-hal seperti partikel, itu banyak data yang harus ditekan yang sepertinya merupakan hasil signifikan dari kinerja permainan saat bermain.
sumber
Jawaban:
Saya pikir pemikiran awal Anda benar. Untuk membuat replay, Anda menyimpan semua input yang diterima dari pengguna (bersama dengan nomor bingkai di mana ia diterima) bersama dengan benih awal dari setiap generator nomor acak. Untuk memutar ulang game, Anda mengatur ulang PRNG menggunakan benih yang disimpan dan memberi makan mesin permainan dengan urutan input yang sama (disinkronkan ke nomor bingkai). Karena banyak gim akan memperbarui status gim berdasarkan jumlah waktu yang melewati antar frame, Anda mungkin juga perlu menyimpan panjang setiap frame.
sumber
Starcraft dan Starcraft: Brood War memiliki fitur replay. Setelah pertandingan selesai, Anda dapat memilih untuk menyimpan replay untuk dilihat nanti. Saat memutar ulang, Anda dapat menggulir di sekitar peta dan mengklik unit dan bangunan, tetapi tidak mengubah perilaku mereka.
Saya ingat suatu kali menonton tayangan ulang pertandingan yang telah dimainkan di gim asli, tetapi tayangan ulang itu dilihat dalam Perang Brood. Bagi mereka yang tidak terbiasa, Perang Merenung berisi semua unit dan bangunan asli, serta berbagai yang baru. Dalam permainan aslinya, pemain telah mengalahkan komputer dengan menciptakan unit yang tidak bisa dengan mudah dilawan komputer. Ketika saya memainkan replay di Brood War, komputer memiliki akses ke berbagai unit, yang dibuat dan digunakan untuk mengalahkan pemain. Jadi file replay yang sama persis menghasilkan pemenang yang berbeda tergantung pada versi Starcraft mana yang memainkan file tersebut.
Saya selalu menemukan konsep yang menarik. Tampaknya fitur replay bekerja dengan merekam semua input pemain, dan mengasumsikan bahwa komputer akan merespons rangsangan tersebut dengan cara yang persis sama setiap kali. Ketika input pemain dimasukkan ke replayer Starcraft asli, permainan dimainkan persis seperti di pertandingan asli. Ketika input persis yang sama dimasukkan ke replayer Perang Brood, komputer bereaksi berbeda, menciptakan unit yang lebih kuat, dan memenangkan permainan.
Sesuatu yang perlu diingat jika Anda sedang menulis mesin replay.
sumber
Ada dua metode utama:
Itu tergantung pada apa yang ingin Anda lakukan. Terkadang menyimpan acara lebih baik, karena ini biasanya membutuhkan lebih sedikit memori. Di sisi lain jika Anda ingin memberikan replay yang dapat dimainkan pada kecepatan yang berbeda dan dari titik awal yang berbeda, lebih baik untuk menyimpan status. Saat menyimpan status, Anda juga dapat memutuskan apakah menyimpannya setelah setiap acara atau hanya 12 atau 25 kali per detik - ini dapat mengurangi ukuran ulangan Anda dan membuatnya lebih mudah untuk memundurkan / memajukannya.
Perhatikan bahwa "keadaan" tidak berarti keadaan grafis. Lebih seperti sesuatu posisi unit, keadaan sumber daya dan sebagainya. Hal-hal seperti grafik, sistem partikel dan sebagainya biasanya bersifat deterministik dan dapat disimpan sebagai "animasi X, waktu Y: Z".
Terkadang replay digunakan sebagai skema anticheating. Maka menyimpan acara mungkin yang terbaik di sini.
sumber
Secara teknis Anda harus menulis mesin Anda untuk menjadi deterministik, itu bukan keacakan. Dengan asumsi karakter dalam permainan mengarah ke lengan lawan, dan menembakkan senjata, maka jumlah kerusakan yang sama harus diterapkan pada lawan dalam semua kasus.
Dengan asumsi bom meledak di lokasi X, partikel yang dihasilkan oleh ledakan itu harus selalu menghasilkan hasil visual yang sama. Jika Anda membutuhkan keacakan, buat satu set angka acak, pilih nilai seed ketika game dimainkan, dan simpan nilai seed itu di replay.
Secara umum memiliki keacakan dalam permainan adalah ide yang buruk. Bahkan untuk hal-hal seperti multipemain, Anda tidak bisa membuat setengah pemain Anda bisa melihat sekitar ledakan sementara yang lain tidak bisa hanya karena mereka tidak mendapatkan nilai acak yang tepat.
Buat semuanya deterministik, dan Anda harus baik-baik saja.
sumber
Mengingat keadaan awal dan serangkaian tindakan dengan stempel waktu , cukup ikuti urutannya karena tindakan yang direkam seharusnya terjadi, putar ulang.
Untuk mendapatkan peristiwa acak agar terjadi kembali persis sama, gunakan nomor pseudo-acak yang diunggulkan dan simpan benih dalam file replay.
Selama Anda menggunakan algoritma yang sama untuk menghasilkan angka acak dari seed, Anda dapat membuat ulang semua peristiwa seperti yang terjadi di game langsung tanpa memerlukan snapshot penuh dari kondisi permainan.
Ini akan membutuhkan replay untuk ditonton secara berurutan , tetapi itu cukup normal untuk replay game (lihat Starcraft 2). Jika Anda ingin mengizinkan akses acak ke timeline, Anda dapat mengambil snapshot keadaan penuh pada interval yang ditetapkan (katakan setiap menit), untuk melompati timeline dengan granularity yang ditetapkan.
sumber
NVidia PhysX (mesin simulasi fisika yang sering digunakan dalam game) mampu merekam keadaan fisik adegan penuh dari waktu ke waktu. Ini memasukkan semua input mengemudi dari mesin gim, yang berarti Anda tidak perlu melacak seed number acak seperti yang disarankan orang lain. Jika Anda mengambil dump adegan ini, Anda dapat memutar ulangnya di alat luar (disediakan oleh NVidia), yang sangat berguna untuk melacak masalah dengan model fisik Anda. Namun, Anda juga dapat menggunakan aliran fisika yang sama untuk menggerakkan mesin grafis Anda, yang kemudian memungkinkan Anda untuk memiliki kontrol kamera normal, karena hanya fisika yang mengemudi grafik yang telah direkam. Dalam banyak permainan, ini termasuk efek partikel (PhysX mencakup beberapa sistem partikel yang sangat canggih.) Adapun suara, saya menduga itu direkam kata demi kata (sebagai aliran suara), tetapi saya '
sumber
Ide awal Anda benar, dan untuk efek yang sangat kompleks, mereka tidak diingat secara eksklusif. Sebagai contoh, sistem replay Warcraft 3 tidak menyimpan keadaan animasi, atau efek partikel dalam kasus efek acak, dll. Selain itu, sebagian besar hal dapat dihitung secara komputasi dari titik awal dengan cara deterministik, jadi untuk sebagian besar sistem yang menggunakan variabel acak (ledakan partikel yang memberikan offset acak, misalnya), yang Anda perlukan hanyalah waktu efeknya, dan seed acak. Anda kemudian dapat menghasilkan kembali efek tanpa benar-benar tahu apa yang akhirnya akan tampak seperti .. mengetahui bahwa itu sedang melalui jalur kode deterministik.
Memikirkannya secara konseptual murni, untuk memutar ulang timeline peristiwa, yang Anda butuhkan adalah tindakan pengguna. Program akan bereaksi dengan cara yang persis sama, kecuali dalam kasus variabel acak. Dalam skenario ini, Anda bisa mengabaikan keacakan (apakah BENAR-BENAR penting jika efeknya terlihat sama persis, atau dapatkah mereka dihasilkan secara acak), atau menyimpan nilai seed dan memalsukan keacakan.
sumber
Lemparkan dua pence saya.
Tergantung pada apa yang Anda inginkan, replay dapat dilakukan via
Sebagian besar waktu, orang ingin replay interaktif, jadi 2. adalah cara untuk pergi. Kemudian tergantung pada kendala Anda, ada sejumlah cara untuk mengoptimalkan proses ini
Ini benar-benar topik yang menarik. Saya ingat bahwa satu judul peluncuran untuk Wreckless Xbox asli memiliki fitur pemutaran yang bagus. Sayangnya, lebih dari satu kali pemutaran ulang akan gagal;)
oh ya, bagaimana mungkin ada yang melupakan Blinx Time Sweeper ! ulangan interaktif hebat yang dimasukkan ke dalam mekanik permainan aktual!
* = tampaknya ada beberapa komentar mengenai waktu melangkah. saya menggunakan "simulasi" di sini untuk menangkap fitur ini. pada intinya, mesin Anda harus mampu menghasilkan kerangka waktu yang terpisah. bahkan jika kerangka replay membutuhkan waktu lebih lama atau lebih singkat daripada aslinya, sistem harus memahami bahwa waktu yang sama telah berlalu. ini berarti merekam langkah-waktu bingkai dengan setiap input yang direkam, dan memasok delta ini ke jam mesin Anda.
sumber
Mungkin Anda bisa Cukup menyimpan setumpuk perintah yang dikirim oleh masing-masing pemain. Jadi, alih-alih menyimpan bahwa bom meledak pada titik dan waktu tertentu, atau bahwa mobil tertentu dihancurkan, Anda cukup menyimpan penekanan tombol yang dikirim oleh masing-masing pemain. Kemudian, dalam tayangan ulang, Anda cukup mensimulasikan gim seperti yang akan terjadi dengan pers tersebut. Saya merasa seperti itu memiliki potensi untuk mengambil lebih sedikit ruang, tetapi saya tidak pernah bekerja pada sistem replay seperti itu.
Pertanyaan yang menarik. Saya akan tertarik pada bagaimana hal itu dilakukan dalam permainan profesional.
sumber
Dan Bryant
Itulah tepatnya yang saya pikirkan pada awalnya ketika saya mencoba mencari tahu bagaimana mereka membuatnya sehingga permainan ulang selalu sama setiap kali. Dengan Doom saya berpikir betapa acaknya pemotretan: D. Menyimpan nomor acak apa pun yang digunakan, saya tahu itu bisa menjadi solusi. Itu sebelum saya menemukan kertas pdf tentang teknologi Crysis. Beberapa tekstur suara di sana dan disposisi rumput atau pohon, tampaknya menggunakan pseudorandomisasi dengan seed reversible tetap untuk membuatnya sehingga Anda tidak melihat perubahan disposisi kebisingan, pohon dan rumput kapan pun Anda melihatnya!
Menghindari sekaligus menyimpan jutaan pohon dan posisi poros rumput. Rupanya urutan acak semu dapat memutar ulang sama kapan saja, karena logika diperbaiki, untuk hanya membuat urutan angka acak palsu secara statistik.
sumber
Masalah memiliki replay yang konsisten adalah sama (well, lebih mudah) seperti memiliki game multiplayer yang konsisten.
Seperti yang disebutkan sebelumnya, replay dalam game RTS disimpan dengan merekam semua input (yang memiliki efek. Scrolling tidak berpengaruh.) Multiplayer mentransmisikan semua input juga
Merekam semua input bukan hanya menebak - ada perpustakaan untuk membaca replay Warcraft3 dengan mengungkapkan ini.
input menyertakan cap waktu untuk jawaban ini.
sumber
Saya akan percaya bahwa pada peningkatan tertentu permainan akan mengambil snapshot dari keadaan segalanya (SEMUANYA). Kemudian ketika replay sedang terjadi penggunaan sederhana linear-interpolasi dapat digunakan untuk mengisi "lubang". Setidaknya begitulah menurut saya itu akan dilakukan.
Anda benar bahwa merekam input tidak dapat diandalkan / tidak menjamin output yang sama. Permainan pasti harus melacak keadaan semua objek (atau setidaknya yang penting)
sumber