สิ่งที่ควรมีอยู่ในกราฟฉากเกม


10

คุณช่วยฉันอธิบายได้ไหมว่าอะไรควรอยู่ในกราฟของเกม ดูรายการต่อไปนี้โปรด:

  • นักแสดงเกม? (เห็นได้ชัดว่าใช่วัตถุที่เปลี่ยนสถานะทั้งหมดควรเป็นส่วนสำคัญของกราฟฉาก)
  • เกมคงง่าย ojbects? (ฉันหมายถึงสถานที่ ojects ในพื้นหลังที่ไม่ได้รับภาพเคลื่อนไหวพวกเขาไม่ได้ชนกัน)
  • ทริกเกอร์ของเกม
  • ไฟของเกม
  • กล้องเกม?
  • กระสุนอาวุธ?
  • การระเบิดของเกมและเทคนิคพิเศษ?

วัตถุประเภทที่พิจารณาข้างต้น ตอนนี้ไปยังความครอบคลุมของกราฟฉาก:

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

@ Josh: ขอบคุณสำหรับการแก้ไขและแก้ไขคำถามของฉัน
Bunkai.Satori

คำตอบ:


4

ฉันคิดว่าการอ่านข้อมูลเกี่ยวกับเทคโนโลยีกราฟซีนอื่น ๆ ที่ดีจะทำให้คุณได้รับประโยชน์มากมาย

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

เอกสารประกอบฉากของ SceneNode:
http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_node.html

เอกสารประกอบฉากของ SceneManager: http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_manager.html

อย่างอื่นที่ควรค่าแก่การดูคือลิงค์ต่อไปนี้:
http://sgl.sourceforge.net/#features

เป็นโซลูชันกราฟฉากที่ใช้ OpenGL และหน้าคุณสมบัติที่มีแสดงโหนดทั้งหมดที่สามารถมีได้

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

นักแสดงเกม
ฉันอาจจะปฏิเสธไม่ได้ คล้ายกับ Ogre ฉันจะมีคลาส Entity พื้นฐาน (ซึ่งจะมีตรรกะเฉพาะวัตถุ) และ SceneNode ฐานพร้อมตัวชี้สมาชิก Entity เพื่อรับข้อมูลที่เหมาะสมในการแสดงวัตถุ (ตำแหน่งการวางแนว ฯลฯ )

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

เกมคงง่าย ojbects
ใช่

ทริกเกอร์ของเกม
ไม่เสียงเหมือนเกมเฉพาะสำหรับฉัน

ไฟของเกม
ใช่

กล้องเกม?
ใช่

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

การระเบิดของเกมและเทคนิคพิเศษ?
ไม่แน่นอนฉันจะให้คนอื่นตอบคำถามนั้น

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

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

สรุป
สำหรับฉันกราฟฉากสำหรับ Render ส่วนหนึ่งของลูปเกม คุณไม่ควรจับคู่การเรนเดอร์และลอจิกของคุณเข้าด้วยกันอย่างใกล้ชิดมิฉะนั้นคุณจะเจอกับปัญหาการพึ่งพา


+1 - ขอบคุณสำหรับคำตอบที่มีรายละเอียดและมีค่า ความรู้ของฉันเกี่ยวกับ SceneGraphs มาจากหนังสือการเข้ารหัสเกมเสร็จสมบูรณ์ ( amazon.com/Game-Coding-Complete-Third-McShaffry/dp/1584506806/ … ) ลิงค์ของคุณมีประโยชน์โดยเฉพาะคลาส SceneNode ของ Ogre อ้างอิงถึงบทสรุปของคุณคุณเห็นกราฟฉากเป็นวิธีที่ดีในการปรับปรุงการแปลงของวัตถุที่เชื่อมโยงในเกมหรือไม่? ทั้งคำตอบของคุณและจอชนั้นยอดเยี่ยม ฉันคิดว่าอันนี้มีข้อมูลเพิ่มเติมอยู่ในนั้นดังนั้นฉันจึงทำเครื่องหมายคำตอบที่ยอมรับแล้ว
Bunkai.Satori

@Bunkai หากคุณคิดว่าวัตถุในเกมของคุณมีวิธีการ Update () ที่พวกเขาอัปเดตเวกเตอร์สำหรับตำแหน่งปฐมนิเทศ ฯลฯ จากนั้นโหนดฉากทั้งหมดของคุณจะต้องทำคือแสดงตาข่ายและแปลงโดยใช้ GetPosition () และ GetOrientation () และแสดงไปที่หน้าจอ นี่เป็นการแยกตรรกะนักแสดงของคุณออกจากรหัสการแสดงผลซึ่งเป็นสิ่งที่คุณควรมุ่งมั่นเพื่อ
Ray Dey

9

ความชอบของฉันคือการแนะนำให้วางสิ่งต่าง ๆลงในกราฟฉาก ดูบทความนี้โดยเฉพาะโดย Tom Forsyth: " กราฟฉาก - เพียงแค่พูดว่าไม่ "

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

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

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

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

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

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

ฉันใช้วิธีการแบ่งพาร์ติชันที่เหมาะสมกับสไตล์ของเกม (quad-tree, octree, BSP, และ cetera) เพื่อจัดกลุ่ม / คัดสรรหน่วยงานเชิงตรรกะในเกมที่ควรจะ (a) ประมวลผลเฟรมนี้และ (b) เรนเดอร์ เฟรมนี้ จากนั้นฉันก็ป้อนชุดของวัตถุจากรายการ (b) ลงในระบบที่แมปวัตถุเชิงตรรกะเพื่อแสดงคำอธิบายและเรียงลำดับคำอธิบายเหล่านั้นลงในที่เก็บข้อมูลตามคุณสมบัติ (ตัวอย่างเช่นสิ่งใดก็ตามที่ใช้ความโปร่งใส ที่ควรจะแสดงผลแบบ back-to-front) จากนั้นฉันแสดงทุก bucket ตามลำดับและสำหรับ bucket แต่ละอันให้คำอธิบายทุกอย่างตามลำดับฉันเดาว่าคุณสามารถเรียกสิ่งนี้ว่า "tree" แต่มันไม่ได้แสดงสถานะปกติ / แปลงวิธีการแพร่กระจายที่กราฟฉากต้นไม้แบบดั้งเดิมทำ YYMV,


+1 สำหรับคำตอบที่ดี ฉันได้อ่านบทความที่แนะนำแล้ว โดยพื้นฐานแล้วฉันมักจะใช้ซีนกราฟเพื่ออัปเดตตำแหน่งของวัตถุที่เชื่อมโยง (ตัวอย่าง: ชุดทหารอยู่บนเรือขณะที่เรือเคลื่อนที่พวกทหารก็จะเคลื่อนที่ไปพร้อมกับมันและปืนในมือก็ขยับด้วย) ดังนั้นฉันวางแผนที่จะมีคลาสอินเทอร์เฟซ: CGameObject และวัตถุทั้งหมดที่จะใส่ลงในซีนกราฟควรเป็นส่วนหนึ่งของมัน ขอบคุณมากสำหรับคำแนะนำของคุณ
Bunkai.Satori
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.