ในป้อมปราการคนแคระคุณสามารถมีคนแคระสัตว์ก๊อบลินและอื่น ๆ หลายร้อยคนในเกมในแต่ละครั้งที่มี AI ที่ซับซ้อนและกิจวัตรการทำเส้นทางเดินของตัวเอง คำถามของฉันคือสิ่งนี้ทำให้เกิดการชะลอตัวที่เห็นได้ชัดอย่างไร คนแคระแต่ละคนวิ่งในเกลียวของมันเองหรือไม่?
ในป้อมปราการคนแคระคุณสามารถมีคนแคระสัตว์ก๊อบลินและอื่น ๆ หลายร้อยคนในเกมในแต่ละครั้งที่มี AI ที่ซับซ้อนและกิจวัตรการทำเส้นทางเดินของตัวเอง คำถามของฉันคือสิ่งนี้ทำให้เกิดการชะลอตัวที่เห็นได้ชัดอย่างไร คนแคระแต่ละคนวิ่งในเกลียวของมันเองหรือไม่?
คำตอบ:
ระบบใดก็ตามที่มีเธรดสำหรับอักขระจำนวนมากแต่ละตัวจะหมดทรัพยากรอย่างรวดเร็ว เธรดอาจทำให้คุณสามารถเข้าถึงคอร์โปรเซสเซอร์เพิ่มเติมได้ แต่พวกเขาไม่ได้ทำให้อะไรมีประสิทธิภาพมากขึ้นและพวกเขามาพร้อมกับค่าใช้จ่าย
คำตอบง่ายๆคือให้มีประสิทธิภาพเกี่ยวกับการประมวลผลแต่ละเอนทิตีในเกม
ป้อมปราการคนแคระไม่ได้เป็นโอเพ่นซอร์สและในขณะที่มีการคาดเดาจำนวนมากและวิศวกรรมย้อนกลับที่สามารถไปถึงวิธีการทำงานทั้งหมดฉันจะมุ่งเน้นไปที่เทคนิคพื้นฐานบางอย่างสำหรับการเพิ่มประสิทธิภาพ roguelike 3D (ไม่ใช่กราฟิกโลก 3 มิติ) ประเภทเดียวกัน
ในกรณีของวิดีโอเกมมีควันและกระจกจำนวนมากที่สร้างภาพลวงตาของความซับซ้อนจากกฎและระบบง่าย ๆ ช่วงเหล่านี้มีตั้งแต่การใช้ตัวเลขสุ่มอย่างง่ายสำหรับการเคลื่อนไหวที่ไร้จุดหมายไปจนถึงการเตรียมตาข่ายระดับสูงของโหนดสำหรับการค้นหา
เมื่อพูดถึงการค้นพบสิ่งนี้มักจะเป็นปัญหาที่ยากมากในการแก้ปัญหาสำหรับพื้นที่ขนาดใหญ่เช่นแผนที่ DF สามารถทำได้ (มากถึง 768x768x64 IIRC) อย่างไรก็ตามปัญหาสามารถทำให้ง่ายขึ้นและเร่งความเร็วด้วยวิธีการเหล่านี้:
ฉันจะไม่ครอบคลุมพื้นฐานของการหาเส้นทาง roguelikes ส่วนใหญ่ใช้ A * แต่มีวิธีการอื่นในการดูแลแมว หนังแมว Mmmm ..
หนึ่งในสิ่งสำคัญที่ทำให้หน่วย DF เป็นที่นิยมและมีชีวิตชีวาคือรายการเป้าหมายส่วนตัวของพวกเขา ในความเป็นจริงแล้วเกมโร๊คไลค์มากมายมีอยู่ในระดับพื้นฐาน โดยพื้นฐานแต่ละหน่วยมีรายการความต้องการ (และสำหรับ dorfs ของคุณงานที่พวกเขาอาจรับได้ว่าคุณกำลังขอให้ทำ) และพวกเขาจะเลือกจากพวกเขาตามบุคลิกภาพ (สถิติ)
งานบางอย่างมีข้อกำหนด การทำกระโปรงหนังต้องใช้ dorf ในร้านที่มีรายการ X ดังนั้นสิ่งเหล่านั้นทั้งหมดจะถูกตรวจสอบและเพิ่มเป็นงานในรายการของพวกเขา เรียบง่ายเหมือนที่
เนื่องจากเวลาส่วนใหญ่ของยูนิตจะอยู่ในระหว่างการขนส่งการตรวจสอบว่ายูนิตใดที่ทำงานได้เร็วมากมีเพียงไม่กี่ยูนิตเท่านั้นที่จะเป็นตัวเลือกในช่วงเวลาใดก็ตามดังนั้นโดยรวมจึงไม่มีการชะลอตัวแม้แต่เป็นร้อยหรือ หลายพันหน่วย และจำไว้ว่าใน DF ทุกอย่างตั้งแต่ผึ้งไปจนถึง troglodytes ไปจนถึงต้นไม้เป็นหน่วย
ในการทำวิจัยเพิ่มเติมบางอย่างเห็นได้ชัดว่า DF เป็นงานที่น่ากลัวในการค้นพบโดยทั่วไป มันไม่ได้แบ่งแผนที่เป็นส่วน ๆ แต่เป็นการแบ่งแผนที่ออกเป็นส่วน ๆ หรือพื้นที่ที่เชื่อมต่อกัน (ซึ่งดีกว่าไม่แน่ใจอะไรเลย) ดังนั้นการประเมินด้านบนของฉันจึงเป็นตัวอย่างของ DF ที่ทำงานน้อยกว่าที่ฉันคิด :) ซึ่งไม่ได้บอกว่า DF เป็นอะไรที่น่าอัศจรรย์น้อยไปกว่าล้านเหตุผลอื่น ๆ
มันแสดงให้เห็นว่าสิ่งที่สำคัญในเกมคือการเล่นเกม ไม่ใช่กราฟิกไม่ใช่การเขียนโปรแกรมที่ยอดเยี่ยมไม่ใช่การเขียนที่ยอดเยี่ยมไม่ใช่เพลงที่ยอดเยี่ยมไม่ใช่แม้แต่อินเทอร์เฟซ ไม่มีอะไรที่จะสำคัญเท่ากับ 1% ของเกม
จากหน้านี้ :
ดี [การหาเส้นทาง] ดูน่าทึ่งตั้งแต่ตอนที่ฉันมีตัวละครมากมายที่ทำในครั้งเดียว
TA: คนแคระส่วนใหญ่เคลื่อนไหวด้วย A * พร้อมกับการแก้ปัญหาระยะทางตามถนนปกติ ส่วนที่ยุ่งยากคือมันไม่สามารถเรียก A * ได้หากพวกเขาไม่รู้ว่าพวกเขาสามารถไปถึงที่นั่นได้ล่วงหน้าหรือมันจะจบลงด้วยการทำให้แผนที่ท่วมตัวและฆ่าโปรเซสเซอร์
ฉันไม่รู้ว่านี่เป็นวิธีที่เขาป้องกันไม่ให้"ท่วมแผนที่"หรือไม่ แต่วิธีปกติในการทำเกมนี้คือการใช้ A * ที่เรียกว่าHierarchical Path-Finding A *หรือ HPA * แนวคิดคือการแบ่งตารางออกเป็นชิ้น ๆ น้อยลง แต่มีขนาดใหญ่กว่าจำนวนมากจากนั้นใช้ A * เพื่อค้นหาเส้นทางที่ดีที่สุดจากแต่ละก้อนไปยังกลุ่มที่อยู่ใกล้เคียง คุณสามารถใช้สิ่งนี้เพื่อสร้างกราฟที่เล็กกว่าซึ่งเรียกใช้ A * สำหรับแต่ละหน่วย
คุณยังสามารถจัดกลุ่มชิ้นส่วนเหล่านั้นให้เป็นชิ้นที่ใหญ่ขึ้นซึ่งเป็นที่มาของ "ลำดับชั้น"
อัลกอริทึมนี้ค้นหาเส้นทางที่ใกล้ที่สุดเท่านั้น แต่สำหรับเกมเช่น Dwarf-Fortress ที่ปกติแล้วก็โอเค มันยังคงรับประกันว่าจะหาเส้นทางถ้ามี; และเมื่อไม่มีเส้นทางมันจะท่วมกราฟขนาดเล็กลงเท่านั้นซึ่งจะช่วยประหยัดเวลาได้อย่างมาก
นอกจากนี้ยังมีสิ่งที่เป็นนามธรรมของ HPA * ที่เกี่ยวข้องกับหน่วยงานที่สามารถไปมากกว่าภูมิประเทศ แต่ไม่บางคนอื่น ๆ(เช่นหน้าผาซึ่งอากาศหน่วยสามารถสำรวจมากกว่า แต่พื้นหน่วยไม่สามารถ) มันเรียกว่าHAA *และมีบทความที่สามารถเข้าถึงได้มากอธิบายมันนี่
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับขั้นตอนวิธี pathfinding ต่างๆที่นี่
หากมีสิ่งใดเป็นสิ่งที่ตรงกันข้าม - สิ่งทั้งหมดทำงานในหนึ่งเธรดและตอนนี้ก็กดปุ่มจุดที่กลายเป็นปัจจัยการปิดกั้น (ครั้งสุดท้ายที่ฉันตรวจสอบ!)
เหตุผลที่รวดเร็วคือไม่มีกราฟิกแฟนซี มันหลอกลวง แต่สิ่งสำคัญที่ทำให้ช้าลงคือการวาดสิ่งต่าง ๆ (คิดขึ้นไปสองในสามของเฟรมในชื่อ AAA) เนื่องจากป้อมปราการของคนแคระนั้นค่อนข้างเรียบง่ายจึงใช้เวลาที่เหลือในการทำสิ่งที่น่าสนใจ
ผมไม่ทราบว่าเป็นรหัส 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 จะตอบสนองน้อยลงเรื่อย ๆ แต่ผู้เล่นอาจสังเกตเห็นได้ในกรณีที่รุนแรงเท่านั้น