Secara konseptual, bagaimana replay bekerja di dalam game?

145

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.

Steven Evers
sumber
10
Replays Kerajinan Bintang Asli sebenarnya TIDAK konsisten. Anda bisa menonton pertandingan yang sama dua kali, dan melihat beberapa hasil yang agak berbeda.
Andres
1
@Andres: Menarik, saya tidak memperhatikan. Khususnya, untuk genre RTS, saya memikirkan Company Of Heroes.
Steven Evers
4
Untuk memperjelas apa yang saya yakini ditanyakan oleh SnOrfus: Beberapa game (Uncharted 2, Halo 3, bahkan Battlefield 2) memungkinkan Anda untuk merekam game secara keseluruhan. Setelah permainan selesai, Anda dapat memainkannya kembali dengan kecepatan yang ditentukan dan terbang melalui level saat aksi berlangsung, melihatnya dari posisi apa pun di peta. Jadi saya menganggap ini tentang merekam gerakan semua pemain / objek dan bukan sesuatu yang berkaitan dengan buffer video.
Sean
1
@Sean O'Hollaren: Ya, itu benar.
Steven Evers
1
Lalu saya juga akan menambahkan untuk game balap mobil di mana replay hampir default. Saya cukup yakin lokasi model dicatat dan kemudian semuanya dijalankan melalui mesin.
d -_- b

Jawaban:

61

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.

Peter Ruderman
sumber
Nomor bingkai mungkin bukan referensi yang baik karena tayangan ulang mungkin berjalan pada framerate yang berbeda dari game langsung.
Ben S
5
@ Ben: Framerate tidak membuat perbedaan, karena nomor bingkai akan tetap sama. Ini jawaban yang benar.
BlueRaja - Danny Pflughoeft
14
Frame grafis dan 'frame' engine (atau iterasi) tidak harus sama. Dalam banyak game yang lebih tua, mesin diperbarui pada tingkat yang sama seperti grafik, dalam satu loop master Dengan mesin modern, grafik sering diperbolehkan untuk memperbarui secepat GPU memungkinkan, dengan mesin berdetak pada tingkat yang diperlukan untuk resolusi dinamika permainan yang baik dan konsisten (seringkali mesin fisika).
Dan Bryant
3
@iamgopal: jika Anda mengetahui keadaan generator nomor pseudo-acak, maka masalah itu sudah terpecahkan. Metode lain mungkin untuk memperlakukan angka acak sebagai bentuk input lain dan menyimpannya di samping penekanan tombol dan sejenisnya.
Kylotan
1
Saya ingin mengiklankan bahwa pendekatan ini mengharuskan mesin game Anda deterministik dan beroperasi dengan langkah waktu yang tetap. Saya percaya semua game RTS Blizzard telah dibangun dengan cara ini. Game non-deterministik akan mencakup data sinkronisasi tambahan untuk memastikan konsistensi dalam jangka panjang.
John Leidegren
28

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.

Bobwise
sumber
6
+1: Sangat menarik. Saya belum pernah mendengar tentang itu. Memberikan beberapa wawasan yang baik tentang bagaimana mereka mengembangkannya.
Steven Evers
18

Ada dua metode utama:

  1. Menyimpan acara (seperti tindakan pemain / ai) - seperti yang Anda katakan.
  2. Menyimpan status (keadaan gim penuh, lokasi objek, pada saat-saat berurutan).

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.

liori
sumber
10

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.

Timothy Baldridge
sumber
1
Bagaimana dengan AI? Apakah AI tidak acak?
Jesse Jashinsky
18
Itu benar-benar tidak perlu. Gunakan nomor pseudo-acak yang diunggulkan untuk semua acara acak dan simpan benih dalam file replay. Dengan begitu, angka "acak" yang sama akan dihasilkan selama pemutaran ulang.
Ben S
13
-1 untuk kesalahpahaman yang jelas tentang bagaimana "keacakan" bekerja di komputer
BlueRaja - Danny Pflughoeft
10
um .... tidak .... Saya sangat sadar bahwa tidak ada keacakan "benar". Namun kebanyakan orang mencoba menyiasatinya dengan mengatur seed acak mereka menjadi sesuatu seperti waktu sistem. Namun yang saya katakan adalah hal seperti itu tidak boleh dilakukan. Saya tidak peduli apakah dia menggunakan sistem API atau tabel angka acak yang sudah ditentukan sebelumnya. Apa yang saya katakan pada mulanya benar. Setiap fungsi di mesinnya harus menghasilkan hasil yang sama berdasarkan inputnya. Waktu seharusnya tidak menjadi faktor.
Timothy Baldridge
2
Jika partikel tidak memiliki interaksi dengan mekanik game dengan cara yang berarti, maka tidak masalah jika RNG berbeda untuk mereka. Ini akan membantu dalam kasus simulasi yang disinkronkan dengan jaringan (seperti halnya di sebagian besar game RTS, dan banyak genre game lainnya), karena ini sedikit kurang simulasi harus menyinkronkan setiap frame (efek partikel hanya mendapatkan diperbarui secara individual).
RCIX
10

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.

Ben S
sumber
Jika Anda menabur kembali setiap jumlah detik tertentu (katakanlah 5 atau 10) itu akan cukup mudah untuk merekam dalam aliran replay Anda dan juga memungkinkan untuk melompat ke depan atau ke belakang (ke PRNG "frame kunci" pada dasarnya).
Wedge
7

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 '

Dan Bryant
sumber
4

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.

Stefan Valianu
sumber
3

Lemparkan dua pence saya.

Tergantung pada apa yang Anda inginkan, replay dapat dilakukan via

  1. Merekam buffer video dan memutar ulang nanti,
  2. Menangkap status objek setiap frame dan memutar ulang nanti,

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

  • memastikan sistem adalah simulasi deterministik *, sehingga setiap input menghasilkan output yang konsisten dan diharapkan
  • jika diperlukan pengacakan, pastikan nomor acak dapat direproduksi tepat di lain waktu [lihat penyemaian dengan Pseudo Random Generator Angka PRNG, atau gunakan set acak kaleng]
  • membagi elemen permainan menjadi elemen "mekanik" dan "estetika". elemen mekanik mempengaruhi hasil [misalnya kolom jatuh dan menghalangi jalan], elemen estetika diperlihatkan dan tidak memengaruhi proses pengambilan keputusan apa pun dalam sistem [misalnya efek partikel visual seperti percikan].

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.

johnny g
sumber
2

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.

ThirdD3gree
sumber
2

Dan Bryant

Selanjutnya, merekam benih acak tidak akan cukup untuk mendukung mundur, karena perkembangan acak bukanlah prosedur yang dapat dibalik tanpa dukungan khusus dalam semua logika yang mengandalkan keacakan. Lebih fleksibel untuk merekam hasil operasi acak sebagai bagian dari aliran acara.

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.

Antonim
sumber
Jika Anda ingin menarik perhatian Dan pada hal ini, tambahkan komentar di bawah kontribusinya - jika tidak, ia kemungkinan tidak akan melihatnya.
halfer
Mungkinkah karena saya hanya seorang tamu, tetapi saya tidak dapat melihat fungsi "tambahkan komentar" di pos induk, Dan menjawab, apalagi balasan Dan. Saya melihat ada fungsi edit-tingkatkan, bahkan untuk posting yang bukan, milik saya, tetapi bagaimana cara kerjanya?
Antonymous
Ah, pertanyaan bagus! Ini tampaknya di sini bahwa Anda perlu 50 poin rep mengomentari pertanyaan atau jawaban lain selain Anda sendiri - saya minta maaf. 50 sangat mudah diperoleh - hanya beberapa kontribusi yang bermanfaat biasanya akan mencapainya. Ya, Anda dapat mengedit pertanyaan dan jawaban orang lain, meskipun hasil edit Anda akan ditinjau oleh orang lain hingga Anda mencapai tahun 2000. Lihat bagan hak istimewa Anda di sini .
halfer
1

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.

Franky
sumber
Tidak, ini tidak sama (atau lebih mudah) dengan game MP yang konsisten. Saat Anda bermain MP, gim biasanya mengharuskan setiap orang memiliki versi gim yang sama, yang belum tentu berlaku untuk sesi yang disimpan (karena mungkin disimpan dengan versi gim yang lebih lama). Ini sangat penting jika salah satu pemain adalah lawan AI. Bayangkan saja Anda memutar ulang permainan di mana sebuah unit hanya memiliki satu titik serangan lagi di versi yang lebih baru daripada versi yang direkam. Ini dapat mengarah pada hasil yang sama sekali berbeda.
drakon
-1

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)

Bob Fincheimer
sumber
2
Tidak, mengumpankan input yang sama akan menghasilkan hasil yang sama persis dengan yang pertama kali. Anda hanya perlu memastikan bahwa Anda mendapatkan pengaturan waktu yang benar, mengumpankan input di antara frame yang sama di mana ia awalnya diterima. Menyimpan seluruh kondisi permainan secara berkala dapat membutuhkan jumlah memori yang sangat besar dan menghasilkan hasil yang tidak konsisten juga.
Peter Ruderman
@ Peter, "memberi makan input yang sama akan menghasilkan hasil yang persis sama": tidak. Ada elemen acak di banyak permainan, yang bisa berbeda setiap kali replay dimainkan. Anda perlu melacak lebih dari input.
houbysoft
Itu benar. Anda juga perlu menyimpan benih PRNG Anda (lihat jawaban saya untuk pertanyaan ini).
Peter Ruderman
1
saya tahu itu adalah kinerja dan memori, tetapi jika Anda melewatkan 1 hal kecil sejauh input atau generator acak ... atau benar-benar apa pun, ulangan akan berbunyi pada garis singgung yang mengerikan!
Bob Fincheimer
@BlueRaja, ide snapshot memori Bob tidak serta merta dibuat-buat, meskipun mesin yang baik dapat merekam 'delta' daripada meng-encode semua memori untuk setiap iterasi. Ini mungkin lebih mudah untuk didukung di tingkat mesin. Selanjutnya, merekam benih acak tidak akan cukup untuk mendukung mundur, karena perkembangan acak bukanlah prosedur yang dapat dibalik tanpa dukungan khusus dalam semua logika yang mengandalkan keacakan. Lebih fleksibel untuk merekam hasil operasi acak sebagai bagian dari aliran acara.
Dan Bryant