ป้อมปราการ Dwarf ติดตามหน่วยงานมากมายโดยไม่สูญเสียประสิทธิภาพได้อย่างไร


79

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


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

25
มันแน่นอนผลิตชะลอตัวลงอย่างเห็นได้ชัดเมื่อคุณมีโครงสร้างที่ซับซ้อนและอุโมงค์ 100 + คนแคระ
รัสเซล Borogove

3
ใช่ DF ในประสบการณ์ของฉันช้าอย่างไม่น่าเชื่อในสถานการณ์ที่คุณอธิบาย
เงินต้น

4
ทำลายบันไดหลักและชมการตกหล่นของคุณราวกับก้อนหินสักครู่หนึ่งในขณะที่คนแคระทุกคนก็โกรธแค้นในเวลาเดียวกัน
Mooing Duck

2
ฉันจะพูดสอดและยอมรับว่า DF ไม่ใช่ตัวอย่างที่ดีที่สุด ในความเป็นจริง DF เป็นที่รู้จักกันดีว่าประสบปัญหาเรื่องประสิทธิภาพ
Robert S.

คำตอบ:


110

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

คำตอบง่ายๆคือให้มีประสิทธิภาพเกี่ยวกับการประมวลผลแต่ละเอนทิตีในเกม

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

2
+1 สำหรับสิ่งนี้สำหรับการอธิบายสิ่งที่เกิดขึ้นจริง ๆ ไม่ใช่เรื่องของกราฟิกเช่นฉัน :)
แมตต์เคมพ์

4
เพื่อความเป็นธรรมฉันก็ให้ +1 ด้วยเพราะฉันลืมเรื่องนั้นไปและมันก็เป็นเรื่องจริง - เอา gfx ออกจากสมการและทำให้คอมพิวเตอร์เร็วขึ้น 2x หรือ 3x เร็วขึ้น
Kylotan

ฉันได้ยินมาว่าตอนนี้ DF ถูกมัลติเธรด แต่อย่างน้อยก็จนกระทั่งเมื่อไม่นานมานี้ทุกอย่างเสร็จในกระทู้เดียว (อาจยังไม่แน่ใจ)
Mooing Duck

@MooingDuck มันยังไม่เป็น
Tharwen

63

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

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

การเคลื่อนไหว

เมื่อพูดถึงการค้นพบสิ่งนี้มักจะเป็นปัญหาที่ยากมากในการแก้ปัญหาสำหรับพื้นที่ขนาดใหญ่เช่นแผนที่ DF สามารถทำได้ (มากถึง 768x768x64 IIRC) อย่างไรก็ตามปัญหาสามารถทำให้ง่ายขึ้นและเร่งความเร็วด้วยวิธีการเหล่านี้:

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

ฉันจะไม่ครอบคลุมพื้นฐานของการหาเส้นทาง roguelikes ส่วนใหญ่ใช้ A * แต่มีวิธีการอื่นในการดูแลแมว หนังแมว Mmmm ..

งานส่วนบุคคล

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

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

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


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

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


1
1024X1024X32? แนวตั้งคือ 128 หรือ 256 ฉันเชื่อว่า มันใหญ่กว่า 32.
Lawton

@ Lawton ฉันเชื่อว่าฉันไม่ถูกต้องเกี่ยวกับขนาดสูงสุด แต่ความสูงนั้นไม่ถูกต้อง ฉันกำลังแก้ไขมัน ฉันโหลดเกมและเริ่มดำเนินการที่ฉันอยู่มีความสูงเพียง 45 ระดับเท่านั้น มากกว่านี้อาจเป็น 'จำลอง' แต่ฉันไม่สามารถเข้าถึงพวกเขาสำหรับการขุดหรือสร้าง
DampeS8N

@ DampeS8N ฉันเพิ่งโหลดแผนที่ขนาดกลางที่ไม่มีการแก้ไขและสามารถดูจาก +16 ถึง -156 ประมาณ 180 ระดับ ข้อยกเว้นแผนที่ 40 ระดับไม่ใช่กฎ แม้ว่าคุณจะสามารถขุดได้เพียง 40 อันเนื่องจากถูกน้ำแข็งหรือลาวาบล็อก แต่มันไม่เกี่ยวข้องเนื่องจากพื้นที่ด้านล่างยังคงเต็มไปด้วยความสนุกสนานจำลอง
Lawton

@Lawton แผนที่ของฉันอนุญาตให้ฉันเลื่อนผ่าน 45 ระดับเท่านั้น มันเป็นตัวแปรอย่างแน่นอน แต่ฉันไม่สามารถหาตัวเลขได้ง่ายในจำนวนแผนที่ที่เข้าถึงได้ นอกจากนี้ยังอาจขึ้นอยู่กับเวอร์ชันของเกมที่เราใช้ ในท้ายที่สุดมันก็ไม่สำคัญสำหรับคำตอบของฉัน
DampeS8N

มันเป็นเสาเก่า แต่ส่วนลึกของป้อมปราการคนแคระนั้นขึ้นอยู่กับชั้นตะกอน บางครั้งเปลือกโลกหนาขึ้น DF ไม่ถูกต้องทางธรณีวิทยาอย่างสมบูรณ์ แต่คนที่พวกเขาศึกษามันชอบของมืออาชีพ: D
Madmenyo

50

จากหน้านี้ :

ดี [การหาเส้นทาง] ดูน่าทึ่งตั้งแต่ตอนที่ฉันมีตัวละครมากมายที่ทำในครั้งเดียว

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

ฉันไม่รู้ว่านี่เป็นวิธีที่เขาป้องกันไม่ให้"ท่วมแผนที่"หรือไม่ แต่วิธีปกติในการทำเกมนี้คือการใช้ A * ที่เรียกว่าHierarchical Path-Finding A *หรือ HPA * แนวคิดคือการแบ่งตารางออกเป็นชิ้น ๆ น้อยลง แต่มีขนาดใหญ่กว่าจำนวนมากจากนั้นใช้ A * เพื่อค้นหาเส้นทางที่ดีที่สุดจากแต่ละก้อนไปยังกลุ่มที่อยู่ใกล้เคียง คุณสามารถใช้สิ่งนี้เพื่อสร้างกราฟที่เล็กกว่าซึ่งเรียกใช้ A * สำหรับแต่ละหน่วย

การค้นหาเส้นทางแบบลำดับชั้น

คุณยังสามารถจัดกลุ่มชิ้นส่วนเหล่านั้นให้เป็นชิ้นที่ใหญ่ขึ้นซึ่งเป็นที่มาของ "ลำดับชั้น"

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

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

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับขั้นตอนวิธี pathfinding ต่างๆที่นี่


3
ฉันพบวิดีโอนี้จากผู้พัฒนา RimWorld ที่ให้ความกระจ่างมาก มันเป็นเกมที่คล้ายกันในขณะที่อยู่ใน 2D เท่านั้น เขาอธิบายพื้นฐานเบื้องหลังการค้นพบเส้นทางและประโยชน์ของการแยกแผนที่ออกเป็นภูมิภาค youtube.com/watch?v=RMBQn_sg7DA
ฝ่าบาท

18

หากมีสิ่งใดเป็นสิ่งที่ตรงกันข้าม - สิ่งทั้งหมดทำงานในหนึ่งเธรดและตอนนี้ก็กดปุ่มจุดที่กลายเป็นปัจจัยการปิดกั้น (ครั้งสุดท้ายที่ฉันตรวจสอบ!)

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


8
จุดข้อมูลหนึ่งที่สนับสนุนสิ่งนี้คือการเขียน OpenGL ย้อนหลังซึ่งผมจำได้ว่าทำให้อัตราเฟรมเพิ่มขึ้นอย่างมาก ดังนั้นแม้แต่การทำกราฟิกสไปรต์แบบง่าย ๆ ที่ DF สร้างผลกระทบได้อย่างมีประสิทธิภาพ
millimoose

3
+1 Strip graphics = เวลาว่างมากสำหรับการคำนวณการเล่นเกม
Laurent Couvidou

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

มันอาจดูเหมือนคำตอบงี่เง่าในตอนแรก แต่นี่ถูกต้องลองนึกภาพสิ่งที่สามารถทำได้ด้วย 4-12gb gram และพลัง GPU 4-12tflops GPU หากคุณไม่จำเป็นต้องวาดแบบดั้งเดิมที่ซับซ้อนไม่ต้องใส่พื้นผิวเปลี่ยนเวกเตอร์ 3 มิติเป็น พิกเซล 2 มิติ,
เงา

10

ผมไม่ทราบว่าเป็นรหัส DF แต่ปริมาณของเอไอเอสไม่ได้จริงๆประทับใจผมเพราะสิ่งที่คนมักจะดูแลว่าAI ไม่จำเป็นต้องมีความแม่นยำ มันทำงานได้อย่างสมบูรณ์แบบในการทำสิ่งต่าง ๆ ส่วนใหญ่เพียงไม่กี่วินาทีทุก ๆ นอกจากนี้ยังสามารถใช้การคำนวณที่ไม่แม่นยำ ความไม่สมบูรณ์บันทึกผลการปฏิบัติงานเป็นจำนวนมาก คุณสามารถรันรูทีนการตัดสินใจได้ 100 หน่วยทุก ๆ 100 มิลลิวินาทีหรือคุณสามารถเรียกใช้งานได้ 1,000 หน่วยต่อวินาทีมันจะใช้เวลา CPU เท่ากัน แต่ก็ดี ... คุณมี 10 ครั้งต่อหน่วย

นี่เป็นตัวอย่างง่ายๆว่าสามารถจัดการหน่วยได้มากแค่ไหน:

int curUnit;
Array<Unit> units;
[...]
while([...]) // Game Loop
{
  [...game logic...]
  // process 10 AIs per Frame
  for(int i=0; i++; i<10)
  {
    curUnit++
    if(curUnit == units.length()) curUnit=0;
    if(curUnit < units.length())
      units[curUnit].processAI();
  }

  // Update the position of all units, this should be as optimized as possible
  foreach(Unit& unit in units){ unit.move(); };

  [...graphics...]
}

AI จะตอบสนองน้อยลงเรื่อย ๆ แต่ผู้เล่นอาจสังเกตเห็นได้ในกรณีที่รุนแรงเท่านั้น


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