การพัฒนาเกม Android ใน c ++


26

ดังนั้นการเป็นนักพัฒนา c / c ++ เป็นหลักฉันจึงคิดเสมอว่าตัวเลือกเดียวสำหรับการพัฒนาเกมมือถือสำหรับฉันคือการใช้ iOS ซึ่งอนุญาตให้ c / c ++ (และลดวัตถุประสงค์ C)

ฉันได้ยินมาจากเพื่อนว่า Android นั้นมีชุดเครื่องมือการพัฒนาดั้งเดิมซึ่งอนุญาตให้ใช้รหัส c ++ เพื่อทำงานกับ Android

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

คำตอบ:


26

API ของ Android คือ Java ตั้งแต่ปี 2010 Google ให้บริการ NDK (SDK) สำหรับนักพัฒนา C / C ++

NDK เสนอสองวิธี:

  • สำหรับอุปกรณ์ android 1.5 คุณสามารถโหลดเอลฟ์ไลบรารีและใช้จากแอปพลิเคชัน java ผ่าน JNI บริดจ์
  • สำหรับอุปกรณ์ android 2.3 คุณสามารถใช้ NativeActivity เพื่อข้ามรหัสกิจกรรม Java สำหรับแอปพลิเคชันแบบเต็มหน้าจอ

NDK เสนอ C / C ++ API ไม่กี่:

  • libc หลอกที่เรียกว่าไบโอนิก: ฟังก์ชั่นจำนวนมากไม่สามารถใช้ได้
  • ไลบรารี pthread
  • OpenGL ES 1.x (> Android 1.5) และ OpenGL ES 2.x (Android 2.0)
  • OpenSL (รองรับอย่าง จำกัด บน Android 2.3)

แต่ API จำนวนมากเป็น Java เท่านั้น (มีให้ใน JNI ด้วย)

รุ่น NDK 5 เป็นรุ่นแรกที่ใช้งานได้สำหรับนักพัฒนา C ++ เพราะมี:

  • RTTI
  • สนับสนุนข้อยกเว้น
  • STLport
  • gdb รองรับโปรแกรมแบบมัลติเธรด

การดำเนินการที่เจ็บปวดที่สุดคือการแก้ไขข้อบกพร่องบนอุปกรณ์ Android ดังนั้นฉันจึงพัฒนาเฟรมเวิร์กหลายแพลตฟอร์มของตัวเอง (OS X, Windows, Linux, iOS และ Android) เพื่อดีบักครั้งแรกบนแพลตฟอร์มเดสก์ท็อปแพลตฟอร์ม iOS ถัดไป (บนตัวจำลอง) และสุดท้าย (Android)

android Emulator (ไม่ใช่ตัวจำลอง) มีประสิทธิภาพต่ำและไม่สามารถจำลอง OpenGL ES 2.x ฉันแนะนำอุปกรณ์จริงเพื่อการพัฒนา

คุณสามารถหาข้อมูลที่เป็นประโยชน์มากมาย:


ลิงก์ "รหัสป้อนข้อมูล" เสียหายแล้ว
Josh1billion

1
คงที่: เปลี่ยน Ellismarkov เป็น IOPixel
Ellis

9

ฉันใช้Android NDKไปยังพอร์ตสองเกม SDL + OpenGL กับ Android ได้สำเร็จและพบว่าง่ายอย่างน่าประหลาดใจ ฉันมี wrapper Java 200 บรรทัดที่สร้างบริบท GL และให้คลาสยูทิลิตี้เช่นอินพุตเสียงและการโหลดรูปภาพสำหรับรหัส C ++ เพื่อโทรกลับ โปรแกรมตัวอย่าง "San-Angeles" ใน NDK เป็นจุดเริ่มต้นที่ยอดเยี่ยม

โดยวิธีการเป็นไปได้ในการสร้างโปรแกรม C / C ++ โดยไม่ต้องมีบรรทัดของ Java แต่ฉันคิดว่ามันสะดวกในการเข้าถึงวิธีการระดับ OS บางอย่างโดยการเรียก JVM กลับมาเป็นครั้งคราว

ฉันคิดว่าถ้าเกมของคุณคอมไพล์แล้วบน Linux คุณจะรู้สึกเหมือนอยู่บ้าน มีไฟล์มากกว่า 100+ ไฟล์ในโครงการปัจจุบันของฉันมีเพียง 4 #ifdef ANDROID_NDKคำสั่งเท่านั้น (ภาพและเสียงที่เกี่ยวข้องกับคลาส)

ในความเป็นจริงเวลาส่วนใหญ่ที่ใช้ในการย้ายเกมเป็นเพราะข้อบกพร่องของอีมูเลเตอร์ที่รู้จักที่ฉันไม่รู้


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

1
@brainydexter: ฉันเป็นผู้ชาย commandline ที่สนุกกับ autotools ดังนั้นฉันไม่แน่ใจว่าฉันจะเป็นประโยชน์กับคุณมาก แต่ท่อของฉันเป็นดังนี้: มั่นใจANDROID_NDK_ROOTตั้งไว้ว่ามันอยู่ใน$PATH(ร่วมกับ[sdk_location]/toolsและ[sdl_location]/platform-tools); ไปที่ไดเรกทอรีโครงการ รวบรวมรหัส NDK โดยใช้ndk-build; รวบรวมรหัส Java และสร้างแพคเกจโดยใช้ant compile; ant installอัปโหลดไปยังจำลองหรืออุปกรณ์ที่เชื่อมต่อการใช้ สำหรับโอเพนซอร์สเครื่องยนต์ฉันยังไม่ได้ตัดสินใจ แต่ตอนนี้ฉันกำลังเผยแพร่โค้ดบนบล็อก
sam hocevar

ขอบคุณสำหรับลิงค์! ฉันจะจับตาดูบล็อกของคุณ
brainydexter

4

Android รองรับแอพพลิเคชั่นดั้งเดิมตั้งแต่รุ่น 1.5 ถึงAndroid NDKซึ่งควรครอบคลุมกลุ่มเป้าหมายของคุณได้เป็นอย่างดี คุณยังต้องการแอปพลิเคชัน Android Java ที่โหลดแอปพลิเคชันของคุณผ่าน JNI และส่งต่อเช่นการป้อนข้อมูลและการโทร

มี NDK หลายรุ่น แต่คุณสามารถใช้ NDK ล่าสุดแล้วเลือก API เป้าหมายที่คุณต้องการสนับสนุน ตั้งแต่ Android เวอร์ชั่น 2.3 คุณสามารถทำสิ่งต่าง ๆ ได้มากขึ้นและต้องการรหัส Java น้อยลง แต่การสนับสนุนอุปกรณ์สำหรับ 2.3 นั้นมี จำกัด มาก

การพัฒนา Android C / C ++ แบบเนทีฟเป็นวิธีแก้ปัญหาการทำงานอย่างน้อยสำหรับเกมแบบเต็มหน้าจอและความพยายามในการพอร์ตแอพพลิเคชั่น C / C ++ OpenGL ES ที่มีอยู่นั้นค่อนข้างเล็ก

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