วิธีที่ดีในการจัดการ AI แบบ offscreen หรือไม่


16

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

  • สมมติว่ามี 10 ห้องในโลก
  • และสมมุติว่าโลกนี้มีผู้อยู่อาศัย 10 รายการ
  • และแต่ละเอนทิตี้ก็มี "กิจวัตรประจำวัน" ของตัวเองซึ่งมันทำหน้าที่บางอย่างในห้องและอาจนำทางระหว่างห้องด้วย

เนื่องจากผู้เล่นสามารถอยู่ในห้องเดียวในเวลาเดียวเป็นวิธีที่ดีในการติดตามการกระทำที่หน่วยงานอื่นกำลังดำเนินการในห้องอื่นนอกจอ?

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

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

หลังจากระดมสมองซักพักฉันมาถึงตัวเลือกที่สาม แต่ฉันสงสัยว่าบางทีอาจมีวิธีที่รู้จักหรือดีกว่าในการจัดการสิ่งต่าง ๆ เหล่านี้


1
คำถามนี้ทำให้ฉันนึกถึงdev-blog ที่ฉันอ่านสำหรับเกมชื่อ Project Zomboid
Sumurai8

คำตอบ:


12

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

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

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

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

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


1

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

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

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

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

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