ตามแนวคิดแล้วการเล่นซ้ำในเกมเป็นอย่างไร


145

ฉันมีความอยากรู้อยากเห็นเกี่ยวกับวิธีการเล่นซ้ำในเกม

ตอนแรกฉันคิดว่าจะมีเพียงรายการคำสั่งของผู้เล่นทุกคน / การกระทำของ AI ที่ใช้ในเกมและจากนั้นจะเล่นเกมอีกครั้งและให้เครื่องยนต์แสดงผลตามปกติ แต่ผมได้มองไปที่ไกลใน FPS / RTS เกมและเมื่อตรวจสอบอย่างระมัดระวังแม้กระทั่งสิ่งที่ต้องการอนุภาคและกราฟิก / บกพร่องเสียงมีความสอดคล้องกัน (และบกพร่องเหล่านั้นมักจะมีในที่สอดคล้องกัน)

ดังนั้นสิ่งนี้จะเกิดขึ้นได้อย่างไร ในเกมที่มีมุมกล้องคงที่ฉันคิดว่ามันอาจจะแค่เขียนทุกเฟรมของฉากทั้งหมดไปยังสตรีมที่จัดเก็บไว้และจากนั้นก็ทำการรีสตรีมกลับมา แต่มันดูไม่พอสำหรับเกมที่อนุญาตให้คุณหยุดและย้ายกล้อง รอบ คุณต้องจัดเก็บตำแหน่งของทุกสิ่งในที่เกิดเหตุ ณ เวลาใด ๆ (ไม่?) ดังนั้นสำหรับสิ่งต่าง ๆ เช่นอนุภาคนั่นคือข้อมูลจำนวนมากที่จะผลักดันซึ่งดูเหมือนจะดึงดูดความสนใจอย่างมากต่อประสิทธิภาพของเกมขณะเล่น


10
การทำซ้ำ Star Craft แบบดั้งเดิมนั้นไม่สอดคล้องกัน คุณสามารถดูเกมเดียวกันสองครั้งและดูผลลัพธ์ที่แตกต่างกันบ้าง
Andres

1
@Andres: น่าสนใจฉันไม่ได้สังเกต โดยเฉพาะอย่างยิ่งสำหรับแนว RTS ฉันคิดถึง Company Of Heroes
Steven Evers

4
เพื่อชี้แจงสิ่งที่ฉันเชื่อว่า SnOrfus ขอ: บางเกม (Uncharted 2, Halo 3, แม้แต่ Battlefield 2) อนุญาตให้คุณบันทึกเกมได้อย่างครบถ้วน หลังจากจบเกมคุณสามารถเล่นกลับด้วยความเร็วที่กำหนดและบินไปตามระดับที่มีการดำเนินการโดยดูจากตำแหน่งใดก็ได้ในแผนที่ ดังนั้นฉันคิดว่ามันเกี่ยวกับการบันทึกการเคลื่อนไหวของผู้เล่น / วัตถุทั้งหมดและไม่ใช่สิ่งที่ต้องทำกับบัฟเฟอร์วิดีโอ
Sean

1
@Sean O'Hollaren: ใช่ถูกต้อง
Steven Evers

1
จากนั้นฉันก็จะเพิ่มเกมแข่งรถที่รีเพลย์เป็นค่าเริ่มต้นเกือบ ฉันค่อนข้างแน่ใจว่ามีการบันทึกตำแหน่งของโมเดลแล้วทุกอย่างก็จะวิ่งไปตามเครื่องยนต์
d -_- b

คำตอบ:


61

ฉันคิดว่าความคิดเริ่มต้นของคุณถูกต้อง ในการสร้างการเล่นซ้ำคุณเก็บข้อมูลทั้งหมดที่ได้รับจากผู้ใช้ (รวมถึงหมายเลขเฟรมที่ได้รับ) พร้อมกับเมล็ดเริ่มต้นของเครื่องกำเนิดตัวเลขแบบสุ่มใด ๆ ในการเล่นเกมอีกครั้งคุณรีเซ็ต PRNG ของคุณโดยใช้เมล็ดพืชที่บันทึกและป้อนเอ็นจินเกมตามลำดับการป้อนข้อมูลเดียวกัน (ซิงโครไนซ์กับหมายเลขเฟรม) เนื่องจากเกมหลายเกมจะอัปเดตสถานะเกมตามระยะเวลาที่ผ่านระหว่างเฟรมคุณอาจต้องเก็บความยาวของแต่ละเฟรม


หมายเลขเฟรมอาจไม่ใช่ข้อมูลอ้างอิงที่ดีเนื่องจากการเล่นซ้ำอาจมีอัตราเฟรมที่แตกต่างจากเกมสด
Ben S

5
@Ben: อัตราเฟรมไม่ได้สร้างความแตกต่างเนื่องจากหมายเลขเฟรมจะยังคงเหมือนเดิม นี่คือคำตอบที่ถูกต้อง
BlueRaja - Danny Pflughoeft

14
เฟรมกราฟิกและ 'เฟรม' ของเครื่องยนต์ (หรือการวนซ้ำ) ไม่จำเป็นต้องเหมือนกัน ในเกมรุ่นเก่าหลายรุ่นเอ็นจิ้นอัพเดทในอัตราเดียวกับกราฟิกในหนึ่งลูปหลัก ด้วยเครื่องมือที่ทันสมัยกราฟิกมักได้รับอนุญาตให้อัปเดตให้เร็วที่สุดเท่าที่ GPU อนุญาตด้วยเอ็นจิ้นที่ใช้งานได้ในระดับที่จำเป็นสำหรับความคมชัดที่ดีและสอดคล้องกันของการเปลี่ยนแปลงของเกม
Dan Bryant

3
@iamgopal: ถ้าคุณรู้สถานะของตัวสร้างตัวเลขสุ่มหลอกแล้วปัญหานั้นจะได้รับการแก้ไขแล้ว อีกวิธีหนึ่งอาจใช้การสุ่มตัวเลขเป็นรูปแบบการป้อนข้อมูลอื่น
Kylotan

1
ฉันต้องการโฆษณาว่าวิธีการนี้มีความจำเป็นที่เอ็นจิ้นเกมของคุณจะถูกกำหนดไว้และทำงานด้วยขั้นตอนเวลาที่แน่นอน ฉันเชื่อว่าเกม RTS ของ Blizzard ทั้งหมดได้ถูกสร้างขึ้นด้วยวิธีนี้ เกมที่ไม่ได้กำหนดค่าไว้จะมีข้อมูลการซิงโครไนซ์เพิ่มเติมเพื่อให้แน่ใจว่ามีความมั่นคงในระยะยาว
John Leidegren

28

ตาร์คราฟและสตาร์คราฟต์: กกสงครามมีคุณลักษณะการเล่นซ้ำ หลังจากการแข่งขันเสร็จสิ้นคุณสามารถเลือกที่จะบันทึกการเล่นซ้ำเพื่อดูในภายหลัง ในขณะที่เล่นซ้ำคุณสามารถเลื่อนไปรอบ ๆ แผนที่และคลิกที่หน่วยและสิ่งปลูกสร้าง แต่ไม่เปลี่ยนพฤติกรรมของพวกเขา

ฉันจำได้ว่าเคยดูรีเพลย์ของการแข่งขันที่เล่นในเกมดั้งเดิม แต่การเล่นซ้ำนั้นถูกดูใน Brood War สำหรับสิ่งที่ไม่คุ้นเคยเหล่านั้นสงคราม Brood มีหน่วยและอาคารดั้งเดิมทั้งหมดรวมถึงอาคารใหม่ที่หลากหลาย ในเกมดั้งเดิมผู้เล่นเอาชนะคอมพิวเตอร์โดยสร้างยูนิตที่คอมพิวเตอร์ไม่สามารถตอบโต้ได้ง่าย เมื่อฉันเล่นซ้ำใน Brood War คอมพิวเตอร์มีการเข้าถึงหน่วยต่าง ๆ ซึ่งสร้างและใช้เพื่อเอาชนะผู้เล่น ดังนั้นไฟล์รีเพลย์ที่เหมือนกันจึงส่งผลให้มีผู้ชนะที่แตกต่างกันขึ้นอยู่กับเวอร์ชั่นของ Starcraft ที่กำลังเล่นไฟล์

ฉันพบแนวคิดที่น่าสนใจเสมอ ดูเหมือนว่าคุณลักษณะการเล่นซ้ำจะทำงานโดยการบันทึกอินพุตทั้งหมดของผู้เล่นและสันนิษฐานว่าคอมพิวเตอร์จะตอบสนองต่อสิ่งเร้าเหล่านั้นในลักษณะเดียวกันทุกครั้ง เมื่อผู้เล่นป้อนข้อมูลเข้าไปในตัวเล่น Starcraft ดั้งเดิมเกมจะเล่นตามที่ได้ทำในการแข่งขันดั้งเดิม เมื่อข้อมูลที่ป้อนเข้ามาถูกป้อนเข้าสู่ Brood War replayer คอมพิวเตอร์จะตอบสนองแตกต่างกันสร้างหน่วยที่แข็งแกร่งขึ้นและชนะเกม

สิ่งที่ต้องจำไว้ถ้าคุณกำลังเขียนเอ็นจิ้นเล่นซ้ำ


6
+1: น่าสนใจมาก ฉันไม่เคยได้ยินเรื่องนั้นมาก่อน ให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับวิธีการพัฒนา
Steven Evers

18

มีสองวิธีหลัก:

  1. จัดเก็บกิจกรรม (เช่นการกระทำของผู้เล่น / AI) เช่นเดียวกับที่คุณพูด
  2. การจัดเก็บสถานะ (สถานะเกมเต็มตำแหน่ง fe ของวัตถุในช่วงเวลาต่อเนื่อง)

ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ บางครั้งการจัดเก็บเหตุการณ์จะดีกว่าเพราะมักจะใช้หน่วยความจำน้อยกว่ามาก อีกด้านหนึ่งถ้าคุณต้องการให้รีเพลย์ซึ่งสามารถเล่นด้วยความเร็วที่แตกต่างกันและจากจุดเริ่มต้นที่แตกต่างกันมันจะดีกว่าในการจัดเก็บสถานะ เมื่อจัดเก็บสถานะคุณยังสามารถตัดสินใจได้ว่าจะเก็บไว้หลังจากทุกเหตุการณ์หรือเพียง 12 หรือ 25 ครั้งต่อวินาทีซึ่งอาจลดขนาดของการเล่นซ้ำและทำให้ง่ายต่อการย้อนกลับ / ไปข้างหน้าอย่างรวดเร็ว

โปรดทราบว่า "สถานะ" ไม่ได้หมายถึงสถานะกราฟิก มีอะไรเพิ่มเติมเช่นตำแหน่งหน่วยสถานะของทรัพยากรและอื่น ๆ สิ่งต่างๆเช่นกราฟิกระบบอนุภาคและอื่น ๆ มักจะถูกกำหนดไว้และสามารถเก็บไว้เป็น "ภาพเคลื่อนไหว X, เวลา Y: Z"

บางครั้งไกลจะถูกใช้เป็นรูปแบบ anticheating จากนั้นการจัดเก็บเหตุการณ์น่าจะดีที่สุดที่นี่


10

ในทางเทคนิคคุณควรเขียนโปรแกรมของคุณเพื่อกำหนดว่าจะไม่มีการสุ่ม สมมติว่าตัวละครในเกมเล็งไปที่แขนของฝ่ายตรงข้ามและยิงอาวุธจากนั้นความเสียหายในจำนวนเดียวกันควรถูกนำไปใช้กับคู่ต่อสู้ในทุกกรณี

สมมติว่าระเบิดทำให้เกิดการระเบิดที่ตำแหน่ง X อนุภาคที่เกิดจากการระเบิดนั้นควรส่งผลให้เห็นภาพเหมือนกันเสมอ หากคุณต้องการการสุ่มสร้างชุดของตัวเลขสุ่มเลือกค่าเมล็ดเมื่อเล่นเกมและบันทึกค่าเมล็ดนั้นในการเล่นซ้ำ

โดยทั่วไปแล้วการมีแบบแผนในเกมเป็นความคิดที่ไม่ดี แม้แต่สิ่งต่าง ๆ เช่นผู้เล่นหลายคนคุณไม่สามารถมีผู้เล่นครึ่งหนึ่งเห็นการระเบิดในขณะที่คนอื่นไม่สามารถทำได้เพียงเพราะพวกเขาไม่ได้รับค่าสุ่มที่ถูกต้อง

ทำทุกอย่างที่กำหนดไว้และคุณควรจะดี


1
แล้ว AI ล่ะ AI ไม่สุ่มหรือไม่
Jesse Jashinsky

18
นั่นไม่จำเป็นจริงๆ ใช้หมายเลขหลอกแบบสุ่ม seeded สำหรับเหตุการณ์สุ่มทั้งหมดและบันทึก seed ในไฟล์ replay วิธีนี้จะสร้างหมายเลข "สุ่ม" ที่เหมือนกันระหว่างการเล่นซ้ำ
Ben S

13
-1 สำหรับความเข้าใจผิดที่ชัดเจนว่า "การสุ่ม" ทำงานในคอมพิวเตอร์อย่างไร
BlueRaja - Danny Pflughoeft

10
อืม .... ไม่ .... ฉันรู้ดีว่าไม่มีสิ่งใดในแบบแผน "ของจริง" อย่างไรก็ตามคนส่วนใหญ่พยายามที่จะหลีกเลี่ยงปัญหานี้โดยการตั้งค่าการสุ่มของพวกเขาเป็นบางอย่างเช่นเวลาของระบบ อย่างไรก็ตามสิ่งที่ฉันพูดคือสิ่งนี้ไม่ควรทำ ฉันไม่สนใจว่าเขาใช้ระบบ API หรือตารางตัวเลขสุ่มที่กำหนดไว้ล่วงหน้า สิ่งที่ฉันพูดในตอนแรกนั้นถูกต้อง ทุกฟังก์ชั่นในเครื่องยนต์ของเขาควรให้ผลลัพธ์ที่เหมือนกันตามอินพุต เวลาไม่ควรเป็นปัจจัย
ทิโมธี Baldridge

2
ถ้าอนุภาคไม่มีปฏิสัมพันธ์กับกลไกเกมในทางที่มีความหมายใด ๆ มันก็ไม่สำคัญว่า RNG จะแตกต่างกันสำหรับพวกมันหรือไม่ สิ่งนี้จะช่วยในกรณีของการจำลองเครือข่ายที่ซิงค์ (เช่นในกรณีของเกม RTS ส่วนใหญ่และเกมประเภทอื่น ๆ มากมาย) เนื่องจากการจำลองมีการซิงค์ทุกเฟรมน้อยกว่า อัปเดตเป็นรายบุคคล)
RCIX

10

เมื่อได้รับสถานะเริ่มต้นและชุดของการกระทำที่มีการประทับเวลาเพียงแค่ดำเนินการตามลำดับเนื่องจากการกระทำที่บันทึกไว้ควรจะเกิดขึ้นซ้ำอีกครั้ง

ในการรับเหตุการณ์สุ่มให้เกิดขึ้นซ้ำกันให้ใช้หมายเลขหลอกเทียมที่บันทึกไว้แล้วบันทึกเมล็ดในไฟล์เล่นซ้ำ

ตราบใดที่คุณใช้อัลกอริทึมเดียวกันเพื่อสร้างตัวเลขสุ่มจากเมล็ดคุณสามารถสร้างเหตุการณ์ทั้งหมดได้เหมือนที่เกิดขึ้นในเกมสดโดยไม่จำเป็นต้องมีสแนปช็อตเต็มรูปแบบของสถานะเกม

สิ่งนี้จะต้องดูการเล่นซ้ำตามลำดับแต่มันค่อนข้างปกติสำหรับการเล่นเกม (ดู Starcraft 2) หากคุณต้องการอนุญาตให้เข้าถึงไทม์ไลน์แบบสุ่มคุณสามารถถ่ายรูปสแนปชอตแบบเต็มช่วงเวลาที่กำหนด (พูดทุกนาที) เพื่อกระโดดไปรอบ ๆ ไทม์ไลน์ในระดับที่กำหนดไว้


หากคุณทำการเพาะซ้ำทุก ๆ จำนวนวินาที (พูด 5 หรือ 10) มันจะง่ายพอที่จะบันทึกในสตรีมการเล่นซ้ำของคุณและอนุญาตให้กระโดดไปข้างหน้าหรือข้างหลัง (ไปยัง PRNG "คีย์เฟรม" หลัก)
Wedge

7

NVidia PhysX (เอนจิ้นการจำลองสถานการณ์ทางฟิสิกส์ที่มักใช้ในเกม) สามารถบันทึกสถานะเต็มของฉากทางกายภาพได้ตลอดเวลา สิ่งนี้รวมเอาข้อมูลการขับขี่จากเอ็นจิ้นเกมซึ่งหมายความว่าคุณไม่จำเป็นต้องติดตามการสุ่มหมายเลขตามที่คนอื่น ๆ แนะนำ หากคุณถ่ายทำฉากนี้คุณสามารถเล่นซ้ำในเครื่องมือภายนอก (จัดทำโดย NVidia) ซึ่งมีประโยชน์มากสำหรับการติดตามปัญหาที่เกิดขึ้นกับโมเดลทางกายภาพของคุณ อย่างไรก็ตามคุณสามารถใช้ลำธารฟิสิกส์เดียวกันเพื่อขับเคลื่อนเครื่องยนต์กราฟิกของคุณซึ่งจะช่วยให้คุณมีการควบคุมกล้องตามปกติเนื่องจากมีเพียงฟิสิกส์ที่ขับขี่กราฟิกที่ได้รับการบันทึก ในหลาย ๆ เกมสิ่งนี้รวมถึงเอฟเฟกต์ของอนุภาค (PhysX มีระบบอนุภาคที่ซับซ้อนมากบางอย่าง) สำหรับเสียงฉันเดาว่าจะบันทึกคำต่อคำ (เป็นสตรีมเสียง) แต่ฉัน '


4

ความคิดดั้งเดิมของคุณนั้นถูกต้องและสำหรับเอฟเฟกต์ที่ซับซ้อนจริงๆพวกมันจะไม่ถูกจดจำโดยเฉพาะ ตัวอย่างเช่นระบบการเล่นซ้ำของ Warcraft 3 ไม่ได้เก็บสถานะของภาพเคลื่อนไหวหรือเอฟเฟกต์ของอนุภาคในกรณีของเอฟเฟกต์แบบสุ่มเป็นต้นนอกจากนี้สิ่งส่วนใหญ่สามารถคำนวณได้จากจุดเริ่มต้นในลักษณะที่กำหนดดังนั้นสำหรับระบบส่วนใหญ่ ที่ใช้ตัวแปรสุ่ม (เช่นการระเบิดของอนุภาคที่ให้อ็อฟเซ็ตแบบสุ่ม) สิ่งที่คุณต้องการคือเวลาของเอฟเฟกต์และเมล็ดสุ่ม จากนั้นคุณสามารถสร้างเอฟเฟ็กต์ใหม่ได้โดยไม่ต้องรู้เลยว่ามันจะออกมาเป็นอย่างไร .. โดยรู้ว่ามันกำลังผ่านเส้นทางที่กำหนดไว้แล้ว

ให้นึกถึงแนวคิดอย่างหมดจดในการเล่นไทม์ไลน์ของเหตุการณ์ทั้งหมดที่คุณต้องการคือการกระทำของผู้ใช้ โปรแกรมจะตอบสนองในลักษณะเดียวกันยกเว้นในกรณีของตัวแปรสุ่ม ในสถานการณ์สมมตินี้คุณสามารถละเว้นการสุ่มได้ (ไม่ว่าจะเกิดขึ้นจริงหรือไม่หากเอฟเฟ็กต์มีลักษณะเหมือนกันหรือสามารถสร้างขึ้นแบบสุ่มได้อีกครั้ง) หรือเก็บค่าเมล็ดและปลอมแบบสุ่ม


3

โยนเพนนีของฉันทั้งสองเข้า

ขึ้นอยู่กับสิ่งที่คุณต้องการการเล่นซ้ำอาจทำได้ผ่าน

  1. บันทึกบัฟเฟอร์วิดีโอและเล่นซ้ำในภายหลัง
  2. การจับวัตถุระบุทุกเฟรมและเล่นซ้ำในภายหลัง

คนส่วนใหญ่ต้องการเล่นซ้ำแบบโต้ตอบดังนั้น 2. เป็นวิธีที่จะไป จากนั้นขึ้นอยู่กับข้อ จำกัด ของคุณมีหลายวิธีในการเพิ่มประสิทธิภาพกระบวนการนี้

  • ตรวจสอบให้แน่ใจว่าระบบเป็นแบบจำลองที่กำหนดขึ้นได้ * ซึ่งทุกอินพุตสร้างผลลัพธ์ที่สอดคล้องและคาดหวัง
  • หากจำเป็นต้องมีการสุ่มให้แน่ใจว่าตัวเลขสุ่มอาจจะทำซ้ำอย่างแน่นอนในเวลาต่อมา [ดูที่เพาะด้วย Pseudo จำนวนสุ่มปั่นไฟ PRNG หรือการใช้กระป๋องชุดสุ่ม]
  • แบ่งองค์ประกอบของเกมออกเป็น "ช่าง" และองค์ประกอบ "ความงาม" องค์ประกอบเชิงกลส่งผลกระทบต่อผลลัพธ์ [เช่นคอลัมน์ที่ตกลงมาและเส้นทางปิดกั้น] องค์ประกอบด้านความงามมีไว้เพื่อแสดงและไม่ส่งผลต่อกระบวนการตัดสินใจใด ๆ ในระบบ [เช่นผลกระทบของอนุภาคที่มองเห็นเช่นประกายไฟ]

เป็นหัวข้อที่น่าสนใจจริงๆ ฉันจำได้ว่าชื่อเรื่องการเปิดตัวสำหรับ Xbox Wrecklessดั้งเดิมนั้นมีคุณสมบัติการเล่นที่ดี น่าเสียดายที่มีมากกว่าหนึ่งครั้งการเล่นซ้ำจะทำให้ล้มเหลว;)

อ๋อใช่ใครจะลืมBlinx Time Sweeperได้ยังไง! รีเพลย์โต้ตอบที่ยอดเยี่ยมที่รวมเข้ากับช่างเกมจริง!


* = ดูเหมือนว่ามีความคิดเห็นบางส่วนเกี่ยวกับการเลื่อนเวลา ฉันใช้ "จำลอง" ที่นี่เพื่อจับภาพคุณลักษณะนี้ ที่แกนกลางเครื่องยนต์ของคุณจะต้องสามารถสร้างกรอบเวลาที่ไม่ต่อเนื่อง แม้ว่าเฟรมการเล่นซ้ำจะใช้เวลาดำเนินการนานกว่าหรือสั้นกว่ากระบวนการเดิมระบบจะต้องรับรู้ว่าเดลต้าในเวลาเดียวกันได้ผ่านไปแล้ว นี่หมายถึงการบันทึกเวลาตามเฟรมกับอินพุตที่บันทึกไว้แต่ละครั้งและส่งเดลต้านี้ไปยังนาฬิกาเครื่องยนต์


2

บางทีคุณสามารถบันทึกคำสั่งที่ผู้เล่นแต่ละคนส่งได้โดยง่าย ดังนั้นแทนที่จะบันทึกว่าระเบิดทำให้เกิดการระเบิด ณ จุดและเวลาที่แน่นอนหรือว่ารถคันใดถูกทำลายคุณเพียงแค่กดปุ่มกดที่ผู้เล่นแต่ละคนส่งมา จากนั้นในการเล่นซ้ำคุณจำลองเกมอย่างที่มันเกิดขึ้นกับสื่อเหล่านั้น ฉันรู้สึกว่ามันมีศักยภาพที่จะใช้พื้นที่น้อยลง แต่ฉันไม่เคยทำงานในระบบการเล่นซ้ำเช่นนั้น

คำถามที่น่าสนใจแม้ว่า ฉันสนใจที่จะทำในเกมระดับมืออาชีพ


2

แดนไบรอันท์

นอกจากนี้การบันทึกเมล็ดแบบสุ่มจะไม่เพียงพอสำหรับการสนับสนุนการย้อนกลับเนื่องจากความก้าวหน้าแบบสุ่มไม่ใช่ขั้นตอนที่ย้อนกลับได้หากไม่มีการสนับสนุนเป็นพิเศษในตรรกะทั้งหมดที่ใช้แบบสุ่ม มีความยืดหยุ่นมากขึ้นในการบันทึกผลลัพธ์ของการดำเนินการสุ่มเป็นส่วนหนึ่งของสตรีมเหตุการณ์

นั่นคือสิ่งที่ฉันคิดในตอนแรกเมื่อฉันพยายามคิดว่าพวกเขาทำมันอย่างไรเพื่อให้เกมเล่นซ้ำทุกครั้ง ด้วย Doom ฉันคิดว่าการสุ่มยิงเป็นอย่างไร: D เก็บเลขสุ่มใด ๆ ที่ใช้ไปฉันพบว่ามันอาจเป็นวิธีแก้ปัญหา นั่นคือก่อนที่ฉันจะเจอกระดาษ PDF เกี่ยวกับเทคโนโลยี Crysis เสียงพื้นผิวบางอย่างมีเสียงรบกวนและการเคลื่อนไหวของหญ้าหรือต้นไม้ดูเหมือนว่าจะใช้ pseudorandomization กับเมล็ดที่กลับด้านได้เพื่อให้คุณไม่เห็นการเปลี่ยนแปลงเสียงต้นไม้และหญ้าเมื่อใดก็ตามที่คุณมอง!

หลีกเลี่ยงในเวลาเดียวกันเพื่อจัดเก็บต้นไม้นับล้านและตำแหน่งเพลาหญ้า เห็นได้ชัดว่าหลอกลำดับสุ่มสามารถเล่นซ้ำได้ตลอดเวลาในขณะที่ตรรกะได้รับการแก้ไขเพียงแค่ทำลำดับสุ่มตัวเลขทางสถิติปลอม


หากคุณต้องการดึงดูดความสนใจของแดนให้เพิ่มความคิดเห็นภายใต้การสนับสนุนของเขามิฉะนั้นเขาอาจจะไม่เห็นมัน
halfer

อาจเป็นเพราะฉันเป็นแขก แต่ฉันไม่เห็นฟังก์ชั่น "เพิ่มความคิดเห็น" ใด ๆ ในโพสต์หลัก Dan ตอบกลับให้ตอบคนเดียวของ Dan ฉันเห็นว่ามีฟังก์ชั่นแก้ไขปรับปรุงแม้สำหรับโพสต์ที่ไม่ใช่ของฉัน แต่ใช้งานได้อย่างไร
Antonymous

เป็นคำถามที่ดี! มันดูเหมือนว่าที่นี่ที่คุณต้องการ 50 คะแนนตัวแทนแสดงความคิดเห็นในคำถามหรือคำตอบอื่น ๆ กว่าของคุณเอง - ขอโทษของฉัน 50 เป็นเรื่องง่ายมากที่จะได้รับ - เพียงไม่กี่ผลงานที่มีประโยชน์มักจะบรรลุเป้าหมายนั้น ใช่คุณสามารถแก้ไขคำถามของคนอื่น ๆ และคำตอบ แต่การแก้ไขของคุณจะถูกตรวจสอบโดยผู้อื่นจนกว่าคุณจะไปดูปี 2000 ของคุณสิทธิ์ของแผนภูมิที่นี่
halfer

1

ปัญหาของการมีการเล่นซ้ำที่สอดคล้องกันนั้นเหมือนกัน (ดีขึ้นง่ายกว่า) เช่นเดียวกับเกมที่มีผู้เล่นหลายคนที่สอดคล้องกัน

ดังที่คนอื่น ๆ กล่าวไว้ก่อนการเล่นซ้ำในเกม RTS จะถูกเก็บไว้โดยการบันทึกอินพุตทั้งหมด (ที่มีผลการเลื่อนไม่มีผล) ผู้เล่นหลายคนส่งสัญญาณอินพุตทั้งหมดเช่นกัน

การบันทึกอินพุตทั้งหมดไม่เพียง แต่คาดเดา - มีห้องสมุดสำหรับอ่าน Warcraft3 รีเพลย์ด้วยการเปิดเผยสิ่งนี้

การป้อนข้อมูลรวมถึงการประทับเวลาสำหรับคำตอบนี้


ไม่มันไม่ใช่เกม MP ที่สอดคล้องกัน (หรือง่ายกว่า) เมื่อคุณเล่น MP เกมมักต้องการให้ทุกคนมีเกมรุ่นเดียวกันซึ่งไม่จำเป็นต้องเป็นกรณีสำหรับเซสชันที่จัดเก็บไว้ (เนื่องจากอาจถูกเก็บไว้กับเกมรุ่นเก่ากว่า) นี่เป็นสิ่งสำคัญอย่างยิ่งหากผู้เล่นคนใดคนหนึ่งเป็นฝ่ายตรงข้าม AI แค่คิดว่าคุณเล่นเกมที่หน่วยมีจุดโจมตีอีกหนึ่งจุดในเวอร์ชันใหม่กว่าในเวอร์ชันที่ถูกบันทึกไว้ สิ่งนี้อาจนำไปสู่ผลลัพธ์ที่แตกต่างอย่างสิ้นเชิง
drakon

-1

ฉันเชื่อว่าในบางครั้งเกมจะจับภาพสถานะของทุกสิ่ง (ทุกอย่าง) จากนั้นเมื่อการรีเพลย์กำลังเกิดขึ้นการใช้การแก้ไขเชิงเส้นแบบง่ายสามารถใช้เพื่อเติมลงใน "หลุม" อย่างน้อยนั่นคือวิธีที่ฉันคิดว่ามันจะทำ

คุณถูกต้องว่าการบันทึกอินพุตจะไม่น่าเชื่อถือ / ไม่รับประกันผลลัพธ์เดียวกัน เกมนี้ต้องติดตามสถานะของวัตถุทั้งหมด (หรืออย่างน้อยสิ่งสำคัญ)


2
ไม่การป้อนอินพุตเดียวกันจะส่งผลเหมือนกันทุกครั้งเป็นครั้งแรก คุณต้องตรวจสอบให้แน่ใจว่าคุณได้รับเวลาที่ถูกต้องป้อนข้อมูลเข้าระหว่างเฟรมเดียวกันกับที่ได้รับมา การบันทึกสถานะเกมทั้งหมดเป็นระยะอาจต้องใช้หน่วยความจำขนาดมหึมาและให้ผลลัพธ์ที่ไม่สอดคล้องเช่นกัน
Peter Ruderman

@ ปีเตอร์ "การป้อนค่าอินพุตเดียวกันจะส่งผลให้เกิดผลลัพธ์เดียวกัน": ไม่ มีองค์ประกอบสุ่มในเกมหลายเกมซึ่งอาจแตกต่างกันในแต่ละครั้งที่เล่นซ้ำ คุณต้องติดตามมากกว่าอินพุต
houbysoft

นั่นเป็นเรื่องจริง คุณต้องเก็บเมล็ดของ PRNG ของคุณด้วย (ดูคำตอบของฉันสำหรับคำถามนี้)
Peter Ruderman

1
ฉันรู้ว่ามันคือประสิทธิภาพและการใช้หน่วยความจำ แต่ถ้าคุณพลาด 1 สิ่งเล็ก ๆ น้อย ๆ ไปจนถึงอินพุตหรือเครื่องกำเนิดไฟฟ้าแบบสุ่ม ... หรืออะไรก็ตามจริงๆ
Bob Fincheimer

@ BlueRaja ความคิดสแนปชอตของหน่วยความจำของ Bob นั้นไม่จำเป็นว่าจะต้องใช้ความละเอียดสูงแม้ว่าเอ็นจิ้นที่ดีสามารถบันทึกสถานะ 'deltas' แทนการเข้ารหัสหน่วยความจำทั้งหมดสำหรับการวนซ้ำทุกครั้ง นี่อาจจะง่ายกว่าที่จะรองรับในระดับเครื่องยนต์ นอกจากนี้การบันทึกเมล็ดแบบสุ่มจะไม่เพียงพอสำหรับการสนับสนุนการย้อนกลับเนื่องจากความก้าวหน้าแบบสุ่มไม่ใช่ขั้นตอนที่ย้อนกลับได้หากไม่มีการสนับสนุนเป็นพิเศษในตรรกะทั้งหมดที่ใช้แบบสุ่ม มีความยืดหยุ่นมากขึ้นในการบันทึกผลลัพธ์ของการดำเนินการสุ่มเป็นส่วนหนึ่งของสตรีมเหตุการณ์
Dan Bryant
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.