หลายแพลตฟอร์มหลายเธรด: ความท้าทายที่แท้จริงคืออะไร


21

ในขณะที่ไลบรารี่อย่าง SDL มี API wrapper ข้ามแพลตฟอร์มสำหรับทำเกลียวฉันคิดว่ามันไร้เดียงสาที่จะคิดว่าสิ่งนี้นำไปสู่การพัฒนาเกมโดยตรงบนแพลตฟอร์มที่แตกต่างกันอย่างมากมาย (เดสก์ท็อป / มือถือ)

เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาการพัฒนาด้วยวิธีนี้ (ให้ข้ามเธรด API ใด ๆ ) พิจารณาดังต่อไปนี้:

  • จำนวนแกนที่แตกต่างกัน
  • ความสามารถในการประมวลผลที่แตกต่างกันอย่างมากมายต่อคอร์
  • สถาปัตยกรรมระบบที่แตกต่างโดยทั่วไปด้วยเช่น เวลาแฝงที่แตกต่างกันสำหรับการเข้าถึงแคช RAM และ I / O

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

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


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

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

1
ฉันเดาว่าความยากมาจากสิ่งที่คุณต้องการใช้เธรด เป็นสิ่งหนึ่งที่มีเธรดผู้ช่วยทำบางสิ่งอยู่ด้านข้างและอีกอันพยายามบีบบิตสุดท้ายของประสิทธิภาพจากเครื่อง 8-core .. วิธีที่ฉันเห็นเธรด SDL ส่วนใหญ่มีความหมายเป็นอย่างแรก ไม่หลัง
Jari Komppa

คำตอบ:


11

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

ในขณะที่ไลบรารี่อย่าง SDL มี API wrapper ข้ามแพลตฟอร์มสำหรับทำเกลียวฉันคิดว่ามันไร้เดียงสาที่จะคิดว่าสิ่งนี้นำไปสู่การพัฒนาเกมโดยตรงบนแพลตฟอร์มที่แตกต่างกันอย่างมากมาย (เดสก์ท็อป / มือถือ)

การพัฒนาเกมง่าย ๆ - แน่นอน มัลติเธรดที่ดีที่สุดไม่ใช่ แต่คุณไม่จำเป็นต้องใช้มัลติเธรดเพื่อสร้างเกม เพื่อให้ได้ประสิทธิภาพสูงมันช่วยได้อย่างแน่นอน แต่เกมที่ยอดเยี่ยมจำนวนมากทำงานในหัวข้อเดียว

เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาการพัฒนาด้วยวิธีนี้ (ให้ข้ามเธรด API ใด ๆ ) พิจารณาดังต่อไปนี้:

  • จำนวนแกนที่แตกต่างกัน
  • ความสามารถในการประมวลผลที่แตกต่างกันอย่างมากมายต่อคอร์
  • สถาปัตยกรรมระบบที่แตกต่างโดยทั่วไปด้วยเช่น เวลาแฝงที่แตกต่างกันสำหรับการเข้าถึงแคช RAM และ I / O

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

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

อ่านเพิ่มเติมบางส่วน:

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - ดูส่วน 'data parallel' ด้วยโมเดลนี้ข้อมูลจะถูกแบ่งออกเป็นหลาย ๆ งานที่เหมือนกันและส่งไปยังแต่ละเธรด

http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - ค่อนข้างหนาแน่นอธิบายสิ่งต่าง ๆ ในระดับระบบปฏิบัติการมากกว่าระดับเกม

http://drdobbs.com/high-performance-computing/216500409 - ไม่ใช่เกมที่เฉพาะเจาะจง แต่มีความเกี่ยวข้องอย่างสมบูรณ์ในแง่ของการบอกคุณว่าคุณต้องแบ่งงานอย่างไร

http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - ครึ่งทางของการสัมภาษณ์ครั้งนี้เป็นเรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีที่พวกเขาอพยพไปยังระบบที่อิงกับภารกิจ .


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

ขออภัยฉันคิดว่าวิธีการแบบนี้เป็นที่รู้จักกันดี ฉันจะอธิบายอย่างละเอียดในคำตอบ
Kylotan

4

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

ปัญหาที่ใหญ่ที่สุดคือ (นั่นคืองานของฉันในหมู่ผู้อื่น) เพื่อแยกแพลตฟอร์มที่จำเป็นและกำหนดรุ่นเหล่านั้นและวิธีการสร้างพวกเขา (เช่น. หน้าจอขนาดใหญ่ แต่รายละเอียดต่ำควรเป็นรุ่นที่ลดลงของหน้าจอขนาดใหญ่ / โปรไฟล์ hi หรือควรเป็น หน้าจอขนาดกลาง / โปรไฟล์โลทำหน้าจอขนาดใหญ่?)

แน่นอนว่าเราเขียนโค้ดไว้ในใจดังนั้นเกมจึงยึดติดกับขนาดหน้าจออย่างหลวม ๆ

HTH

[แก้ไข] สิ่งที่ฉันหมายถึงคือคุณต้องแยกแพลตฟอร์มเป้าหมายของคุณด้วยคุณสมบัติที่แตกต่างกัน (เช่น 1 คอร์, 2 คอร์, 1 คอร์ แต่เร็วกว่าที่เป็นสองเท่า ... ) จากนั้นเลือกจำนวนเป้าหมายเสมือนที่คุณต้องการ (เช่น " เพียงหนึ่ง "หรือ" ต่ำ, ปานกลาง, สูง ") จากนั้นวางแพลตฟอร์มทั้งหมดใน 'คุณภาพ' และสำหรับแต่ละคุณภาพให้ใช้ตัวส่วนต่ำสุดและ 'พอร์ต' รหัสเพื่อให้สอดคล้องกับข้อกำหนดเหล่านั้น (เช่นทำงานได้และรวดเร็ว พอ).

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


จากด้านบนของหัวของคุณคุณจะใช้เวลานานเท่าไรในการออกแบบและพัฒนาโครงการเพื่อรองรับการเปิดตัวหลายแพลตฟอร์มเช่นนี้ เพียงแค่ค่าเฉลี่ยคร่าวๆจะช่วย
วิศวกร

1
ในขณะที่เราทำหลายภาษา (อังกฤษ, ฝรั่งเศส, สเปน, โปรตุเกส, เยอรมันและอิตาลีในแพ็ค + ภาษาใดก็ได้ที่จำเป็นสำหรับวันที่ไต้หวันไต้หวันตุรกีรัสเซีย ... ) และเรามีแพลตฟอร์มใหม่ที่เราต้อง "พอร์ต" ทุกเกมของเราไปทุก ๆ สองสามเดือน (อ่านโทรศัพท์มือถือรุ่นใหม่) เราจะเสียเวลามากมายไม่ไปทางนี้มันจะเป็นไปไม่ได้จริง ๆ ถ้าไม่มีเทมใหญ่ การออกแบบของ 'เฟรมเวิร์ก' เสร็จสิ้นในขณะที่ฉันเรียนรู้เกี่ยวกับโทรศัพท์มือถือที่แตกต่างกัน เป็นการลงทุนที่คุ้มค่า
Valmond

1

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

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

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

เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาการพัฒนาด้วยวิธีนี้ (ให้ข้ามเธรด API ใด ๆ ) พิจารณาดังต่อไปนี้:

different numbers of cores
vastly different processing capabilities per core
A generally different systems architecture with eg. different

เวลาแฝงสำหรับการเข้าถึงแคช RAM และ I / O

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

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