RTS Game AI Thread


14

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

ฉันรู้วิธีการเขียนโปรแกรม ฉันยังมีความคิดที่ดีว่าฉันจะจัดโครงสร้างคลาสเกมและ AI แบบ Rule-Based (state-machine) สำหรับเครื่องเล่นคอมพิวเตอร์อย่างไร

ฉันต้องการที่จะพัฒนาหลักคำสอนซึ่งจะให้พฤติกรรมที่เฉพาะเจาะจงกับหน่วยงานที่เฉพาะเจาะจง (แต่สามารถนำมาใช้ในหลาย ๆ หน่วยในเวลาเดียวกัน) เช่น Scout, Follow the Mission Route, ดำรงตำแหน่ง (โจมตีศัตรูที่อนุมัติหรือถอยหากจม) ฯลฯ

หลักคำสอนจะใช้กับหน่วยเท่านั้นจึงจะมีมุมมองของหน่วยและไม่ทราบเกี่ยวกับการจัดทำแผนที่ทั้งหมด

Computer AI จะวิเคราะห์แผนที่ที่มองเห็นได้ทั้งหมดและตัดสินใจว่า Soctrine ใดที่จะกำหนดแต่ละหน่วยขึ้นอยู่กับกฎชุดอื่น

ฉันกำลังทำสิ่งนี้ใน C # กับ OpenGL

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

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

ถ้าฉันต้องการให้ทุกสิ่งพร้อมกันฉันควรสร้างเธรดแยกต่างหากสำหรับคอมพิวเตอร์ AI หรือไม่ หรือแม้กระทั่งด้ายแยกสำหรับทุกหน่วย?

ฉันไม่ค่อยมีประสบการณ์กับมัลติเธรด อะไรจะเป็นวิธีที่ดีที่สุดสำหรับสิ่งนี้?


ไม่เกี่ยวข้อง - พิจารณา Ogre3D แทน OpenGL หรือไม่

จริงๆแล้วไม่ฉันไม่เคยได้ยินเลย ฉันใช้ OpenGL เพราะนั่นคือสิ่งที่ฉันได้รับการสอนในชั้นเรียนของฉัน Ogre3D ทำ 2D ได้หรือไม่ ฉันคิดว่ามันเป็นไปได้ แต่เราไม่มีทางรู้ว่า ...

ใช่มันสามารถทำได้แม้จะมีชุดเครื่องมือ GUI ของตัวเอง (cegui) ตัวอย่างเช่น TorchLight สร้างขึ้นด้วย มันสามารถช่วยคุณประหยัดเวลาเพราะมันล้อมรอบ OpenGL อย่างดี ogre3d.org/tikiwiki/MOGRE

"หรือแม้แต่แยกด้ายสำหรับทุกหน่วย" ไม่มีนรก ค่าใช้จ่ายของเธรดนั้นใหญ่เกินไป สำหรับหน่วยความจำที่สงวนไว้สำหรับสแต็กของเธรด (1MB เป็นค่าเริ่มต้น) และสวิตช์ด้ายมีราคาแพงเกินไป

คำตอบ:


3

"ตั้งแต่เริ่มต้น" หมายความว่าอะไร คุณสามารถใช้บางอย่างเช่น XNA แทน DirectX ได้หรือไม่

คุณควรเรนเดอร์ประมาณ 30 ถึง 60 เฟรมต่อวินาที ไม่จำเป็นต้องมีเฟรมต่อวินาทีมากขึ้นอีก

หากการเรนเดอร์ + ลอจิกใช้เวลาน้อยกว่า 16ms ที่ 60fps มอบให้คุณก็ไม่จำเป็นต้องมีเธรด AI

หากคุณมีเวลาไม่พอในระหว่างการแสดงเฟรมคุณจะต้องคิดอย่างรอบคอบเกี่ยวกับสิ่งที่ต้องอัพเดททุกเฟรมและสิ่งที่ไม่ได้

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

AI หลักมีงานให้ทำมากขึ้นเนื่องจากต้องประมวลผลหน่วยทั้งหมดบนแผนที่และหากลยุทธ์ดังนั้นจึงควรใช้เวลาในการคำนวณมากที่สุด มันเป็นตัวเลือกแรกสำหรับเธรดแยกต่างหาก

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

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


0

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

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

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


0

ฉันกำลังทำงานกับเกม RTS ตั้งแต่เริ่มต้น ฉันยังไม่ได้ทดสอบ แต่ความคิดของฉันคือการใช้หน่วย AI ในลูปเกมหลักสำหรับทุกหน่วยที่ผู้เล่นมองเห็นได้ในปัจจุบัน (ในส่วนของหน้าจอที่ผู้เล่นเห็นจริงหรือใกล้กับขอบของหน้าจอนั้น ) เนื่องจากมีโอกาสมากที่ผู้เล่นจะย้ายหน้าจอเล็กน้อย

หน่วยอื่น ๆ จะถูกตรวจสอบในเธรดแยกต่างหากและฉันมีสองลำดับความสำคัญ: 1. หน่วยที่อยู่ในสถานที่ซึ่งผู้ใช้สามารถมองเห็นได้ถ้าเขาย้ายหน้าจอที่นั่น 2. หน่วยที่อยู่ในพื้นที่ที่ซ่อนอยู่ (ยังไม่ได้สำรวจและ "หมอกแห่งสงคราม")

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


1
ฟังดูซับซ้อนมาก

ความคิดของคุณฟังดูดียกเว้นส่วนแรกเกี่ยวกับการย้ายหน่วยเข้าและออกจากลูปเกมหลัก AI ทั้งหมดควรทำในลูปของตัวเองซึ่งคุณสามารถเลือกที่จะข้ามลูปทุกxการวนซ้ำในหน่วยที่มีลำดับความสำคัญต่ำ
Olhovsky

0

ไม่ว่าคุณจะต้องมีหลายเธรดหรือไม่ก็เป็นความคิดที่ดีที่จะเตรียม AI ให้พร้อมสำหรับการมัลติเธรด

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

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

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

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

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