เหตุใดเกมจึงโหลดซ้ำทั้งระดับเมื่อเริ่มระดับใหม่


47

ข้อมูลมีการปรับเปลี่ยนจริงมากในระหว่างการเล่นหรือไม่?

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

มันเห็นได้ชัดเจนมากขึ้นบนคอนโซล แต่มันไม่ได้สังเกตได้ในเกมพีซี


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

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

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

@MSalters ส่วนใหญ่จะเกี่ยวกับสถานะของเกมมากกว่าทรัพยากรคุณอาจไม่จำเป็นต้องโหลดการใช้งานทั่วไปอีกต่อไป แต่ยิ่งศัตรูที่คุณฆ่าไปแล้ว - วัตถุที่มันต้องถูกทำลายและโหลดใหม่ในสถานะเริ่มต้น (แม้ หากพื้นผิวของเขายังคงถูกเก็บไว้ในหน่วยความจำอย่างดี)
Tom 'Blue' Piddock

ฉันคิดว่ามีคนเล่น Wing Commander III ในระบบเดิม
Erik Reppen

คำตอบ:


54

ตอนนี้ - เป็นคำถามที่เรียบง่าย แต่น่าสนใจที่จะแก้ไขปัญหา

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

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

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

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

  • ลบ gibs ที่สร้างขึ้นแบบไดนามิกสำหรับผนังนั้น (แต่ไม่ลบออกจากสถานะที่คุณโหลด)
  • ลบผลกระทบของอนุภาคสำหรับฝุ่นจากรูกระสุน
  • แทนที่ / ซ่อมแซมผนังเพื่อกำจัดหลุมที่คุณสร้างขึ้น
  • รีเซ็ตกระสุนของผู้เล่น
  • ฯลฯ ...

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

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

ดังนั้นสำหรับระดับเนื้อหาขนาดใหญ่ - การโหลดสถานะเดียวแทนที่จะทำการคำนวณและ "กรอกลับ" หนึ่งรายการ:

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

อย่างไรก็ตามตัวอย่างเคาน์เตอร์เกมต่อสู้ (ตัวอย่างชีวิตจริงที่ยอดเยี่ยมเป็นสตรีทไฟท์เตอร์ 4) อาจไม่จำเป็นต้องโหลดเนื้อหาทั้งหมดนั้นเพื่อเริ่มต้นระดับใหม่ ผู้เล่น 2 คนสภาพแวดล้อมของระดับและตัวนับเลเวลที่เรียบง่ายส่วนใหญ่จะไม่เคลื่อนไหว (สุขภาพของผู้เล่นจะเกิดขึ้นที่ 100% ทุกรอบตัวจับเวลาจะรีเซ็ตเป็น 90 วินาทีและระดับไม่มีรูกระสุน [หรือไม่! ) ดังนั้นการรีเซ็ตระดับเป็นเรื่องของการทำให้นักสู้มีสุขภาพที่สมบูรณ์และทำให้สภาพแวดล้อมกลับสู่ตำแหน่งเดิม (เช่นผู้เข้าชมในบางระดับ)

ดังนั้นสำหรับเกมต่อสู้เมื่อทำการแข่งขัน (ไม่ไปจากรอบต่อรอบ) คุณต้อง:

  • รีเซ็ตสุขภาพและพลังงานเป็นค่าสูงสุดหรือค่าเริ่มต้น (เหมือนกันต่อตัวอักษรเสมอ)
  • รีเซ็ตตัวจับเวลา
  • รีเซ็ตตำแหน่งเริ่มต้นของตัวละคร
  • รีเซ็ตภูมิประเทศเป็นสถานะเริ่มต้น (ไม่มีรูกระสุนเพื่อแก้ไขหรือโหลดซ้ำ!)

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

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

ฉันหวังว่านี่จะทำให้คำถามของคุณมีแสงสว่าง


7
คำตอบที่ดี ... ด้านเหยียดหยามของฉันจะใส่ของคุณ: "ทำงานน้อยลงสำหรับจุด devs' ที่สูงขึ้นในรายการ ... แต่บางทีการดำเนินงานของเครื่องยนต์ที่อาจจะดีกว่า.
ตาข่าย

3
นอกจากนี้สิ่งที่เกี่ยวกับการกู้คืนข้อผิดพลาด? NPC ไม่เคลื่อนไหวเนื่องจากข้อบกพร่องในระบบทางกายภาพหน่วยความจำรั่ว ฯลฯ แม้ว่าเกมจะถูกทดสอบอย่างละเอียดสิ่งต่าง ๆ ยังคงเกิดขึ้นและต้องมีวิธีรีเซ็ตเกมให้อยู่ในสภาพที่รู้จักและใช้งานได้
Sulthan

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

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

1
+1 ฉันแค่ต้องการชี้แจงว่าการรีโหลดระดับและโหลดระดับ - ถ้าการรีโหลดเกิดขึ้นทุกอย่างและเริ่มต้นด้วยการโหลดครั้งใหม่ - ไม่จำเป็นต้องเขียนโค้ดใหม่เพื่อให้บรรลุเป้าหมายการเล่นเกม ระบบการกรอกลับนั้นเป็นรหัสชุดใหม่ที่ไม่น่าสนใจและเนื่องจากมันขึ้นอยู่กับสถานะของตัวแปรจึงเป็นการยากที่จะทำการดีบัก ตัวอย่าง: "การแก้ไขข้อผิดพลาด: เริ่มต้นระดับใหม่หลังจากวางหมวกกันน็อกด้านบนของระเบิดหลังจากที่ขีปนาวุธระเบิดภายใน 200 พิกเซลของน้ำไม่ทำให้เกิดความผิดพลาดบนเดสก์ท็อปอีกต่อไป" ในระยะสั้นคุณจะต้องมีเหตุผลที่ดีจริงๆที่จะรบกวน
BrianH

14

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

เกมสามารถจัดเก็บระดับและสถานะเริ่มต้นแยกจากกันเพื่อให้รัฐสามารถได้รับการฟื้นฟูและเป็นไปได้มากว่าจะมีหลายเกมที่ทำเช่นนั้น แม้การสตรีมแบบนี้จะช้ากว่าที่เคยเก็บไว้ในหน่วยความจำสักหน่อย

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

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

สิ่งต่าง ๆ อาจเปลี่ยนไปอย่างมากด้วยคอนโซลรุ่นต่อไปและหน่วยความจำ 8GB หรือพวกเขาอาจยังคงเหมือนเดิมด้วยโมเดลและวัสดุที่มีความละเอียดสูงกว่าและวัตถุที่ใช้งานในเกมจำนวนมาก เวลาจะบอกเอง. เนื่องจากเกมพีซีโดยทั่วไปกำหนดเป้าหมายเครื่องที่มี RAM 2GB และ VRMB 512MB (แม้ว่าจะมีหลายค่าจนถึงค่าที่ใหญ่กว่า) คอนโซล 8GB รุ่นใหม่นั้นค่อนข้างหรูหราเท่าฐานขั้นต่ำสุด เราน่าจะเห็นการเปลี่ยนแปลงไปสู่เกมที่ต้องการ CPU / OS 64 บิตและ RAM 4-8GB พร้อม VRAM 1-2GB ในอีกไม่กี่ปีข้างหน้า การจัดเก็บหลายสถานะในหน่วยความจำสำหรับการจับภาพอย่างรวดเร็วควรง่ายกว่ามาก


+1 ข้อมูลที่ยอดเยี่ยมและคำอธิบายที่ดีว่าทำไมคอนโซลจึงช้าลงอย่างเห็นได้ชัดเมื่อทำการโหลดซ้ำ
Tom 'Blue' Piddock

7

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

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

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


3
คุณอาจต้องการตรวจสอบคำตอบของฌอนเพื่อดูตัวอย่างของกรณีทางเทคนิคที่คุณอาจต้องการโหลดระดับใหม่กว่า "รีเซ็ต" มัน
SpartanDonut

2

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

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

Dungeon Siege อยู่ในใจ (นักพัฒนาเคยอ้างว่าการจัดการหน่วยความจำใช้พลังการประมวลผลมากกว่าการเล่นเกมจริง) MMORPGS ส่วนใหญ่ทำมัน Shooters ที่มีสภาพแวดล้อมแบบเปิดต้องทำ ... ในกรณีนี้การเริ่มต้นของ ระดับ (หรือแม้กระทั่งจุดเกิดใหม่เมื่อ 30 วินาทีที่แล้ว) อาจจะไม่อยู่ในความทรงจำอีกต่อไป

บ่อยครั้งที่การรีโหลดใหม่เป็นวิธีที่ง่ายที่สุดวิธีที่ถูกที่สุดและอาจเป็นวิธีที่เร็วที่สุด

แก้ไข: นี่คือบทความเกี่ยวกับกลไกการโหลดของ Dungeon Siege: โลกต่อเนื่องของ Dungeon Siege


จุดดีฉันไม่ได้คิดถึงระดับต่อเนื่องหรือไร้รอยต่อ นั่นจะต้องใช้ระบบการโหลดในระดับที่แตกต่างอย่างสิ้นเชิง
Tom 'Blue' Piddock

2

ด้วยคำตอบที่ยอดเยี่ยมของฌอนและบลูเกี่ยวกับข้อ จำกัด ของแพลตฟอร์มแบบฟิสิคัลและการตัดสินใจในเชิงปฏิบัติฉันจะขยายความคิดเห็นไปสู่แนวทางที่แตกต่าง:

ทำไมคุณน่าจะแค่โหลดระดับอย่างสมบูรณ์

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

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

ตอนนี้จะเกิดอะไรขึ้นเมื่อคุณต้องการเพิ่มคุณสมบัติ "ระดับการเริ่มต้นใหม่" ดี...

unloadLevel(currentLevel);
loadLevel(currentLevel);
startPlay();

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

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

อ่า แต่ตอนนี้ระดับของคุณเพิ่มขึ้นและพื้นผิวของคุณมีรายละเอียดมากขึ้นและเสียงประกอบได้รับการดึงใน 512kbps พร้อมช่องแยกสำหรับเสียงและดนตรีทุกชั้น (ดูเหมือนว่าเป็นความคิดที่ดีในเวลานั้น .. ) และบางอย่างเกี่ยวกับ "voxel ray ซึ่งขึ้นอยู่กับจุดกำเนิดของรัฐการติดตามการแปลงฟูริเยร์หลายมิติฟูริเยร์" ซึ่งคุณคิดว่าเป็นเพียงการสร้างขึ้นทั้งหมดและไม่ใช่ของจริงและการโหลดในระดับใช้เวลาสักพักแล้ว คุณได้ทดสอบกับคนจริงและพวกเขาแสดงความไม่พอใจในช่วงเวลาที่รอคอยซึ่งแย่กว่าเกมที่คล้ายคลึงกัน (คุณไม่คาดหวังว่าจะเป็นเมืองหลวง MMORPG ที่มีผู้เล่น 100 คนที่จะโหลดในเวลา <2 วินาทีใช่ไหม?) และมันก็เป็นปัญหา

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

แก้ไขปัญหาจริงก่อน!

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

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

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

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

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

เหตุผลที่แท้จริงเกมส่วนใหญ่ไม่สนใจ

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

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

เช่นเดียวกับในซอฟต์แวร์ตั้งแต่เกมจนถึงงานนำเสนอ Power Point - ถ้าคุณทำทุกอย่างจะหมดไปกับหน้าจอที่โหลดคนใช้เวลา 1% ในการมองแล้วนั่นจะเป็นเรื่องที่น่าเหลือเชื่อ ผลตอบแทนที่แย่มากในเวลาที่คุณลงทุน

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


0

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

เนื่องจากค่าใช้จ่ายเงินและเวลามากขึ้นโดยทั่วไปนักพัฒนาเกมไม่ทำเช่นนั้น


สิ่งนี้ไม่ครอบคลุมถึงสถานการณ์ที่ตรงกันข้ามจะต้องเกิดขึ้นเนื่องจากประเภทของเกมหรือความต้องการส่วนบุคคล เช่น Prince of Persia ที่ต้องการบันทึกสถานะของเกมเพื่อใช้ช่างเกมเฉพาะและตัวอย่างของเกมต่อสู้ที่ฉันให้ที่ต้องสามารถโหลดแต่ละรายการ / ระดับ / สถานะตัวละครเพื่อรีเซ็ตครึ่งทางผ่านการแข่งขันเพื่อเริ่ม รอบถัดไปหรือเริ่มการแข่งขันเพื่อเริ่มเกมถัดไป สิ่งเหล่านี้มีความจำเป็นเพื่อตอบสนองความต้องการของเกมในมือและเป็นสิ่งจำเป็นสำหรับนักพัฒนาเกมในการใช้เวลาและเงินมากขึ้น
Tom 'Blue' Piddock

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

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

ดังนั้นปฏิกิริยาของคุณสำหรับคำตอบแรกของฉันซึ่งเกี่ยวกับ "ไม่ต้องการรายละเอียด" ใช่ไหม? ถ้าฉันลบบรรทัดนั้นคุณจะเอา -1 แต้มกลับมาไหม
Xtro

สนุกดี - ใช่ อย่ากีดกันรายละเอียดที่เป็นไปได้ที่จะให้และโดยทั่วไปคุณจะพบว่าคำตอบของคุณได้รับการชื่นชมมากขึ้น
Tom 'Blue' Piddock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.