ฉันจะรันหลายแพลตฟอร์มโดยใช้เอ็นจิ้นที่กำหนดเองได้อย่างไร


13

เอ็นจิ้นเกมเช่น Unity และ Unreal สามารถทำงานบนแพลตฟอร์มที่หลากหลายได้ ฉันสงสัยว่าพวกเขาทำอย่างไร

ฉันใช้ C ++ และ OpenGL มาระยะหนึ่งแล้วและสิ่งที่ฉันกำลังมองหาคือทรัพยากรที่จะรวมบางสิ่งที่จะทำให้ฉันสามารถทำงานบนแพลตฟอร์มที่แตกต่างกันโดยไม่ต้องเขียนใหม่ อย่าง LibGDX ที่คุณเขียนโค้ดโดยใช้ API พื้นฐานจากนั้น API จะแปลงเป็น HTML, Android, iOS และอื่น ๆ ฉันรู้ว่าฉันสามารถใช้เครื่องมืออื่นแทนการเขียนของฉันเอง แต่ฉันสนใจในประสบการณ์การเรียนรู้

คำตอบ:


26

ย้ายเครื่องยนต์ของคุณไปยังแต่ละแพลตฟอร์ม ไม่มีอะไรพิเศษเกี่ยวกับมัน หากคุณมีรหัสที่เป็น Windows เท่านั้นให้เพิ่ม #ifdef ตรรกะบางอย่างในไฟล์หรือเพิ่มไฟล์ที่สอง (ดังนั้นคุณจะมีFooWindows.cppและFooLinux.cppหรืออะไรก็ตาม) ที่ใช้ฟีเจอร์นั้นใน OS อื่น ๆ ที่คุณสนใจ .

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

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

สำหรับสิ่งต่างๆเช่น HTML5 มีเครื่องมือเช่น emscripten ที่สามารถรวบรวมแอปพลิเคชัน C ++ ให้ทำงานใน JavaScript โดยทั่วไปคุณเพียงแค่ต้องสร้างพอร์ตอื่นของเอ็นจิ้นของคุณเพื่อส่ง emscripten (เนื่องจากมันไม่สามารถใช้ไลบรารี่ C ++ / คุณลักษณะ)

คุณไม่จำเป็นต้องเขียนเกมใหม่ทั้งหมดของคุณ แต่คุณจะต้องทำการพัฒนาการเข้ารหัสและการย้ายพอร์ตสำหรับแพลตฟอร์มใหม่ที่คุณต้องการสนับสนุนอย่างแน่นอน


14
จากประสบการณ์ของผมทำงานร่วมกับซอฟแวร์ข้ามแพลตฟอร์ม (โครงการที่ใหญ่ที่สุดจะเป็น HotSpot) คุณจริงๆต้องการที่จะหลีกเลี่ยงการ ifdefs โยนรหัสผ่าน มันจะเป็นการดีกว่าถ้าคุณมีบางสิ่งที่ชอบshare/os/<linux>(หรือshare/cpu/x86) และวางโค้ดเฉพาะแพลตฟอร์มทั้งหมดลงในนั้น อย่างน้อยนั่นคือ gcc, HotSpot และ Linux kernel ทำ (ไม่ใช่กฎที่แน่นอน) ใช่คุณอาจเริ่มต้นด้วยฟังก์ชั่นเดียวที่ขึ้นอยู่กับแพลตฟอร์มและคิดว่ามันเกินความจริง แต่มันก็ไม่เคยเป็นอย่างนั้น
Voo

14

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

สิ่งที่คุณขอไม่สอดคล้อง: คุณพูด (เน้นการเน้นของฉัน)

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

แต่ยัง (เน้นที่เหมืองอีกครั้ง)

ผมทราบว่าผมสามารถใช้เครื่องมืออื่นแทนการเขียนของตัวเอง แต่ ฉันสนใจในประสบการณ์การเรียนรู้

คุณค่อนข้างจะต้องทำอย่างใดอย่างหนึ่ง: เลือกที่จะใช้ห้องสมุดบุคคลที่สามเอ็นจิ้นและ / หรือ Toolchain ที่ให้การสนับสนุนข้ามแพลตฟอร์มสำหรับคุณหรือสร้างของคุณเองโดยการเขียนโค้ดข้ามแพลตฟอร์ม (ออกแบบของคุณ เป็นเจ้าของสิ่งที่เป็นนามธรรมบนแพลตฟอร์มที่คุณมีให้คุณและใช้สิ่งที่เป็นนามธรรมสำหรับแต่ละแพลตฟอร์ม)

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


2

ตรงกันข้ามกับคำตอบอีกสองคำตอบ (ซึ่งเป็นคำเฉพาะ C ++ โดยชอบธรรม) มีวิธีอื่น สถาปัตยกรรมที่นึกถึง:

  • ย้ายเครื่องยนต์ของคุณ:แก้ไขหรือเขียนรหัสเพื่อให้ทำงานได้ในหลายแพลตฟอร์ม สิ่งนี้ได้รับการแก้ไขในคำตอบข้างต้น
  • เขียนอะไรบางอย่างเหนือไลบรารีข้ามแพลตฟอร์ม:นี่คือตัวอย่างของ libGDX ซึ่งทำงานบน Java Java ทำงานบนเดสก์ท็อป Android และ iOS (ผ่าน RoboVM) โดยการใช้บางอย่างเช่น Java คุณจะได้รับประโยชน์จากแพลตฟอร์มเพิ่มเติมฟรีเมื่อไลบรารี่ / เครื่องมือพื้นฐานรองรับ ในกรณีนี้เมื่อ RoboVM ออกมา libGDX (เกือบ) "เพิ่งได้ผล" บน iOS
  • เขียนตัวสร้างรหัส:นี่คือวิธีการของ Haxe และเครื่องมืออื่น ๆ คุณมีภาษาหลัก (เช่น Haxe / AS3) และคุณเขียนตัวแปลงที่สร้างผลลัพธ์สำหรับภาษาอื่น เช่น. Haxe แปลงเป็น C ++ สำหรับเดสก์ท็อป, Java (ฉันคิดว่า) สำหรับ Android เป็นต้น

โดยส่วนตัวแล้วฉันพบว่าวิธีการของ libGDX นั้นง่ายที่สุด: ค้นหาภาษาหรือแพลตฟอร์มที่ตรงกับความต้องการของคุณและเขียนไว้ด้านบน การสร้างรหัสและเอ็นจิ้นพกพานั้นซับซ้อนและเขียนได้ยาก

libGDX เป็นตัวเลือกที่ยอดเยี่ยมเนื่องจากมันได้รับความนิยมทั้งโทรศัพท์มือถือเดสก์ท็อปและเว็บ (ผ่านแอปเพล็ตหรือคอมไพเลอร์เว็บของ Google)


แม้กับ Java หรือ C # คุณจะไม่ได้รับรหัสข้ามแพลตฟอร์มอย่างน่าอัศจรรย์ คุณยังต้องรับรู้ถึงไลบรารีบุคคลที่สามที่อาจมีการขึ้นต่อกันของแพลตฟอร์ม (ตัวอย่างเช่น SlimDX หรือ SharpDX จะเป็นตัวเลือกที่ไม่ดีสำหรับโครงการ C # ข้ามแพลตฟอร์ม)

@JoshPetrie คุณจะได้รับ "ฟรี" มาก ๆ เมื่อเทียบกับการหมุนเครื่องยนต์ C ++ ของคุณเองและย้ายไปยังแพลตฟอร์มต่างๆ
ashes999

@ ashes999 ขอบคุณสำหรับคำตอบ libGDX ยอดเยี่ยมฉันใช้มัน แต่ฉันจะเขียนมันดังนั้นมันจึงทำงานข้ามแพลตฟอร์มจากนั้นใช้ CMake ฉันมีความท้าทายมากกว่าการใช้ห้องสมุดหรือเครื่องมือที่มีอยู่
DanielCollier

2

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

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

ฉันไม่แนะนำให้คุณใช้#ifdefทุกที่ในรหัสของคุณ แต่ให้สร้าง abstractions รอบ ๆ คีย์หลัก (ตัวอย่างของ primitive ดังกล่าวอาจเป็นซ็อกเก็ต TCP)

เมื่อคุณพบปัญหาใหม่ที่ต้องใช้วิธีแก้ไขปัญหาที่แตกต่างกันต่อสภาพแวดล้อมถามตัวเองว่า "ฉันสามารถแก้ปัญหานี้ได้โดยใช้เฉพาะระบบพื้นฐานข้ามแพลตฟอร์มที่ฉันได้สร้างไว้แล้ว" ถ้าคำตอบคือใช่: voila, รหัสข้ามแพลตฟอร์มง่ายๆ มิฉะนั้นคิดออกว่าคุณขาดอะไรดั้งเดิมและใช้พวกเขา


0

ถ้าคุณต้องการทำสิ่งนี้ "ตั้งแต่เริ่มต้น" เป็นประสบการณ์การเรียนรู้คุณจะต้องใช้ Win32 API ซึ่งคุณสามารถค้นหาข้อมูลเกี่ยวกับการเปิดหน้าต่างและบริบท OpenGL บน MSDN และใน OpenGL wiki ( http: // www .opengl.org / wiki / creating_an_OpenGL_Context_ (WGL) ) สำหรับ Linux จะได้รับสำเนาของคู่มือการเขียนโปรแกรม O'Reilly Xlibและคู่มืออ้างอิง Xlibและอ่านบน GLX (OpenGL Extension to X Window System) ดูที่http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

จากนั้นคุณเพียงแค่ต้องจัดหา API เดียวกันให้กับแอปพลิเคชันของคุณด้วยฟังก์ชั่นที่ทำสิ่งเดียวกัน (เช่นเปิดหน้าต่าง) แต่มีการนำไปใช้งานที่แตกต่างกันสำหรับแต่ละแพลตฟอร์ม คุณเขียนส่วนต่าง ๆ ของโปรแกรมของคุณสำหรับแพลตฟอร์มต่าง ๆ จากนั้นเกมที่คุณเขียนโดยใช้เอ็นจิ้นคุณต้องเขียนเพียงครั้งเดียว แต่มันจะทำงานบนแพลตฟอร์มที่แตกต่างกัน


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