วิดีโอเกมจะเก็บข้อมูลไว้ที่หน้าจอนอกได้อย่างไร


16

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

ตัวอย่างเช่นใน New Super Mario Bros ถ้าคุณกดปุ่ม? ปิดกั้นแล้วออกจากหน้าจอและกลับมาก็ยังคงถูกโจมตี ข้อมูลนี้ถูกเก็บไว้อย่างไรและดำเนินการในครั้งต่อไปที่ผู้เล่นโหลดบล็อก? ทำไมมันไม่รีเซ็ต


24
Pedantry: ใน Super Mario Bros ถ้าคุณกดปุ่ม? บล็อกและจากนั้นออกจากหน้าจอคุณไม่สามารถกลับมาได้ - เกมจะเลื่อนไปในทิศทางเดียวและท่อรูปโค้งทั้งหมดเป็นทิศทางเดียว
เทรเวอร์พาวเวลล์

61
เมื่อคุณอ่านเอกสารข้อความและเลื่อนลงตัวประมวลผลคำของคุณลบการเริ่มต้นของเอกสารหรือไม่
ฟิลิปป์

31
จอภาพแสดงหน้าต่างเข้าไปใน gameworld โลกอยู่นอกหน้าต่างของคุณคุณไม่เห็นมัน
Felsir

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

4
ผมสงสัยว่าสิ่งที่ชนิดของสภาพแวดล้อมการพัฒนาคุณกำลังทำงานกับว่าสิ่งที่เก็บรักษาปิดเสียงหน้าจอที่มีความซับซ้อนมากขึ้นกว่าที่พวกเขาได้รับในหน้าจอ :) หรือจะเป็นเพียงแค่นี้เป็นคำถามทางทฤษฎีอย่างหมดจด?
Luaan

คำตอบ:


59

โดยปกติคุณควรแยกสถานะตรรกะของสภาพแวดล้อมเกมของคุณออกจากการแสดงภาพ

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

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


37

คุณกำลังย้อนกลับไป

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

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

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

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


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

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


7
ชิ้น? ฉันต้องการโทรผู้ที่มีขนาดเล็กชิ้นระดับ
gbjbaanb

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

3
@gbjbaanb 'Level' เป็นคำที่ล้าสมัยและ 'chunk' นั้นครอบคลุมมากขึ้นและมีแนวคิดที่แตกต่างอย่างชัดเจน ไม่ใช่ทุกชิ้นที่เป็นระดับและไม่ใช่ทุกระดับเป็นชิ้น
Lilienthal

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

1
@Lilienthal แน่ใจ แต่ฉันคิดว่าระดับการใช้งานทั่วไปยังคงอยู่และมีหลายเกมที่ยังมีแนวคิด - ฉันไม่แน่ใจว่ามีหนึ่งในนั้นปรากฏหน้าจอ "โหลดอัน" เมื่อเรียก "เวที" ใหม่แล้วผู้เล่นลัดเลาะพวกเขา ดังนั้นจึงอาจเป็นเรื่องที่เข้าใจได้มากขึ้นโดยเฉพาะ OP ที่เป็นคนใหม่สำหรับเกมมากกว่าศัพท์เทคนิคที่เขาอาจไม่เคยเห็นมาก่อน
gbjbaanb

6

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

แต่ในระบบเก่าบางระบบคุณจะเก็บข้อมูลไว้นอกจอ จะมีหน่วยความจำวิดีโอขนาด 400x300 พิกเซลสำหรับการแสดงผลขนาด 320x200 และคุณจะกำหนดวิวพอร์ตให้เป็น ("เริ่มที่ X = 10 Y = 30") ดังนั้นคุณสามารถเลื่อนหน้าจอโดยเพียงแค่ปรับการลงทะเบียน คุณไม่จำเป็นต้องใช้เงินเป็นแสนรอบเพื่อย้ายไบท์ไปรอบ ๆ คุณเพียงแค่เปลี่ยนตำแหน่งที่ฮาร์ดแวร์วิดีโอเริ่มอ่าน

NES มีสิ่งนี้รวมกับระบบแบบเรียงต่อกัน: http://wiki.nesdev.com/w/index.php/PPU_scrolling

NES ไม่เคยสร้างภาพเต็มในหน่วยความจำเพราะมันมี RAM ไม่เพียงพอ มีอาร์เรย์ RAM ที่กำหนดชุดไพ่สองหน้าจอ หนึ่งไบต์ต่อชนิดของกระเบื้อง ฮาร์ดแวร์วิดีโอเงยหน้าขึ้นมองไทล์และพิกัดออฟเซ็ต X / Y เพื่อตัดสินใจว่าพิกเซลใดควรปรากฏที่จุดใด


6
ในขณะที่ความจริงนั้นเป็นรายละเอียดของการใช้งาน - หลักการสำคัญยังคงอยู่ที่คุณมีสถานะทางตรรกะบางอย่างและทำให้มัน (และ ofc อย่างที่ฉันบอกว่าแคชบางส่วนของมันแล้วเตรียมบางสิ่งที่จะเข้ามาในมุมมองต่อไปเป็นต้น)
Polygnome

2
@Polygnome เอ่อฉันได้เขียนเกมมากมายที่หน้าจอเป็นสถานะของเกม มันวิเศษมากที่คุณสามารถทำอะไรกับ VRAM ขนาด 4,000 ไบต์! :)
Luaan

1

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

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

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

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

นี่คือวัสดุเริ่มต้นที่ดี:


0

ในระดับนี้เป็นหน้าที่ของวิธีการแสดงผล 3D ตัวอย่างเช่น OpenGL จะเลือกรูปทรงเรขาคณิตโดยอัตโนมัตินอกช่วง -1.0, +1.0 ในพื้นที่หน้าจอ XY (Z มีความซับซ้อนมากขึ้น แต่คล้ายกัน) เรขาคณิตที่ถูกคัดออกจะไม่สร้างชิ้นส่วน (ประมาณพิกเซล) และจะไม่กลายเป็นภาพจริงแม้จะถูกส่งไปยังระบบเพื่อแสดงผล ไม่ว่าในกรณีใดมันเป็นไปไม่ได้ที่จะเขียนลงในพื้นที่ว่างนอกหน้าต่างแสดงผล (หากทุกอย่างทำงานได้อย่างที่ควรจะเป็น)

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

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

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

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

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


นอกเหนือจากเทคนิค LoD แล้วมันเป็นการดีที่จะเพิ่ม Scenegraph ให้กับคำตอบนี้ซึ่งโลกจะถูกจัดขึ้นในหน่วยความจำและ 'CPU ที่คัดสรร' ตามสิ่งที่อยู่ในมุมมอง
gbjbaanb

0

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

เกมที่ใช้ video RAM โดยตรงเพื่อจุดประสงค์ของรัฐนั้นอยู่ในช่วง '80s ใน 8-bit หรืออาจเป็นในยุค 16 บิต แต่ถ้าคุณไม่ได้พัฒนาสำหรับแพลตฟอร์มนั้นหรือสำหรับ µC ซึ่งทำให้ RAM ใน KB แทน ของ GB ลืมมันไป

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

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