วิธีที่ยอดเยี่ยมในการจำลองเอนทิตีจำนวนมากภายในโลกของเกม


33

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

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

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

นำไปใช้กับตัวอย่างการย่อยก่อนหน้าของฉันซึ่งหมายความว่า:

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

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

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

คำตอบ:


10

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

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


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

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

14

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

สองคำตอบ: การสำรวจหรือข้อความระบบ

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

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


10

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

ตัวอย่างเช่น:

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

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

การจำลองพฤติกรรมเป็นเรื่องสนุกสำหรับการทำงาน แต่มักจะเก็บประสบการณ์ของผู้ใช้ไว้ในใจเสมอ


ใช่ผู้เล่นจะสามารถบอกความแตกต่างได้และมีเอฟเฟกต์บางอย่างที่เกี่ยวกับการเล่นเกม แต่มันเป็น 'กลไก' มากกว่าเพื่อความสนุกในขณะนี้ ประเภทของระบบบาดแผลในป้อมปราการคนแคระซึ่งมีรายละเอียดมาก แต่ไม่สำคัญ แต่อย่างที่คุณพูดไปแล้วมันสนุกมากที่ได้ทำงานและนั่นคือจุดสนใจหลักของฉันในตอนนี้
Marc Müller

9

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

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


2

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


1

มีรูปแบบการออกแบบสำหรับสิ่งนี้ ฉันคิดว่ามันเรียกว่าวัตถุฐานข้อมูล?

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

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

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

มันคล้ายกับการใช้ผู้แทนจากแอนิเมชั่น


3
รูปแบบ Flyweight คุณหมายถึงอะไร
topright

0

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


ฉันคิดว่ามันจะทำให้สิ่งต่าง ๆ ซับซ้อนเพราะมันจะต้องเป็นไปได้สำหรับหลายสิ่งที่จะเกิดขึ้นภายในสัตว์ ตัวอย่างเช่นเพียงเพราะกระเพาะอาหารกำลังย่อยบางสิ่งไม่ได้หมายความว่าหัวใจหยุดเต้นหรือสัตว์หยุดเดิน แน่นอนว่าคุณสามารถกำหนดชุดของรัฐซึ่งแต่ละฟังก์ชั่นที่ใช้ในการพิจารณา แต่จำนวนของรัฐจะมีขนาดใหญ่อย่างบ้าคลั่ง
Marc Müller

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