Objective-C atau C ++ untuk game iOS?

18

Saya pemrograman cukup percaya diri dalam Objective-C dan C ++, tapi saya menemukan Objective-C agak lebih mudah digunakan dan lebih fleksibel dan dinamis.

Apa yang akan menjadi pro dan kontra ketika menggunakan C ++ bukannya Obj-C untuk menulis game di iOS? Atau lebih tepatnya, apakah ada masalah yang diketahui dengan menggunakan Obj-C dibandingkan dengan C ++?

Sebagai contoh, saya menduga mungkin ada masalah kinerja dengan Obj-C dibandingkan dengan kode yang ditulis dalam C / C ++.

Martin Wickman
sumber
Pertanyaan serupa telah diajukan pada SO
bobobobo

Jawaban:

21

Satu keuntungan besar untuk C ++: Jika Anda memutuskan untuk melakukannya, itu akan relatif mudah untuk port ke Android / PC / DS / PSP / (masukkan platform pilihan di sini). Objective-C akan mengunci Anda ke iOS hingga Anda memutuskan untuk menulis ulang seluruh permainan.

ZorbaTHut
sumber
10
Saya tidak setuju dengan kata "mudah." "Kemungkinan" mungkin merupakan pilihan yang lebih baik.
3Dave
1
Ya, untuk banyak gim yang lebih kecil (mis. Kebanyakan gim iPhone) lebih baik menulis ulang semuanya dari awal untuk platform baru daripada mencoba menyesuaikan kode dari satu platform ke platform lain. Arsitektur MVC yang solid akan meminimalkan rasa sakit ini, tetapi siapa yang akan peduli dengan itu untuk pertandingan match-3?
jhocking
3
Relatif mudah! Jika alternatifnya tidak mungkin, maka "sangat sulit" relatif mudah;)
ZorbaTHut
blog.vucica.net/2011/06/... dia berbicara tentang membangun aplikasi Objective C untuk android. Hanya saja Linux dan Linux dapat menjalankan Objc semudah iPhone.
Feloneous Cat
Menggunakan objektif c tidak akan mengunci Anda. Menggunakan fungsi yang spesifik untuk kernel XNU akan. Gclang ada karena suatu alasan.
16

Tidak ada pro atau kontra nyata di sini, setidaknya tidak ada yang harus memaksa seorang programmer merasa nyaman dalam satu bahasa harus menggunakan yang lain.

Kinerja seharusnya tidak menjadi masalah. Tidak mungkin Anda akan menulis angkat berat dengan banyak pesan di loop batin jika Anda seorang programmer Obj-C yang baik, yang berarti Anda benar-benar akan menulis loop batin dalam C. Jika Anda tidak rendah programmer tingkat, kemungkinan besar adalah pengangkatan berat akan dilakukan oleh perpustakaan apa pun yang Anda pilih untuk menunda itu juga, dan Anda akan berada di bawah kekuasaan apa pun yang telah mereka pilih untuk dilakukan.

Portabilitas adalah masalah nyata, jika Anda peduli. Jika tidak, maka meh. Menjadi lintas platform bukanlah akhir dari semuanya. Menjadi sukses pada satu pertama akan menyenangkan :) Anda selalu dapat port nanti. Jika Anda tidak berencana untuk menjadi lintas platform dengan hati-hati mulai hari pertama, hanya dengan bahasa yang sama tidak akan membuat Anda jauh: ada banyak perbedaan nyata lebih lanjut antara platform yang perlu ditangani.

Menyelesaikan proyek lebih penting daripada mengkhawatirkan teknologi, dan jika Anda lebih produktif di Obj-C maka tetaplah di Obj-C.

Preferensi saya? Saya seorang pria C ++. Aku seperti obj-C baik-baik saja, tapi aku senang di C ++, dan saya melakukan write lintas platform kode.

Chris Subagio
sumber
5
Saya sangat setuju dengan saran untuk fokus menyelesaikan proyek dengan alat apa pun yang Anda paling produktif. Menghindari pengoptimalan prematur tidak hanya berlaku pada penulisan kode, ini adalah cara yang baik untuk mendekati kehidupan.
jhocking
4

Tidak ada masalah kinerja dengan Obj-C lebih dari C ++. Keduanya adalah kode yang dikompilasi, dan ingat bahwa Obj-C adalah superset dari C, dan Obj-C ++ adalah superset dari C ++, yang sangat bagus ketika Anda ingin mencampur Obj-C dan C ++ dalam program yang sama (mudah dilakukan dan XCode memiliki dukungan yang bagus untuk sisi C ++). Semua kombinasi bahasa mendukung OpenGL, sehingga setiap pekerjaan grafik yang serius baik-baik saja dan dukungan pustaka baik-baik saja dengan Apple terlepas dari bahasa.

Yang mengatakan, apa tujuan permainan Anda?

  • Jika Anda hanya menulis untuk iOS, maka jangan khawatir dan menulis dalam bahasa apa pun atau kombinasi yang Anda rasa lebih nyaman. Bagi saya, ini adalah Obj-C ++ dengan STL karena itu adalah bagian favorit saya dari C ++. Karena saya lebih suka Obj-C sedikit daripada C ++, saya cenderung menggunakan opsi ini.

  • Jika Anda menulis dengan tujuan porting ke perangkat lain, tulis dalam C ++ dengan layer terjemahan ke Obj-C untuk menangani hal-hal spesifik perangkat (grafik, input, kamera, ...), di mana panggilan dibuat untuk titik masuk dalam aplikasi Anda.

  • Jika Anda paling murni dan hanya ingin satu bahasa, tulis dalam Obj-C.

Yang lain berbicara tentang perpustakaan lain (fisika dan semacamnya). Sama sekali tidak ada masalah dengan mengakses semua itu dari salah satu pilihan bahasa yang Anda bicarakan (Obj-C, C ++, atau Obj-C ++). Anda juga tidak akan memiliki masalah kinerja dengan pustaka tersebut dalam bahasa apa pun.

Peringatan: Ada panggilan tipuan pointer dengan passing pesan. Saya tidak yakin seberapa banyak Anda dapat menafsirkannya sebagai overhead, karena saya cukup yakin itu persis sama dengan panggilan metode C ++ yang diwarisi. Adakah yang bisa menjelaskan hal ini?

Semoga itu bisa membantu,

Lee.

Lee
sumber
1
Poin bagus, tetapi apakah Anda benar-benar ingin menulis Vector3Dkelas di Obj-C? Perasaan saya memberi tahu saya bahwa hal itu dapat menyebabkan kinerja yang buruk.
Martin Wickman
1
Hanya itu saja. Obj-C adalah C. Bukan masalah kinerja. Jika Anda pergi ke file header standar dengan XCode, Anda akan menemukan tipe yang mendasarinya hanya C struct.
Lee
2
Pesan overhead dengan Obj-C sedikit lebih tinggi daripada C ++ karena lebih dinamis. Jelas BUKAN "persis sama". contoh: lihat developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent
1

Tergantung apa tepatnya Anda pemrograman. Jika itu terutama logika game menggunakan fisika dan mesin grafis yang ada, saya dapat dengan aman mengatakan saya tidak melihat alasan untuk menggunakan c atau c ++ jika Anda lebih nyaman dengan obj-c. Jika Anda akan meluncurkan rendering atau kelas fisika saya mungkin akan menulis yang menggunakan c atau c ++. Cocos2d - yang luar biasa dan salah satu perpustakaan permainan iOS paling populer ditulis di obj-c.

Lihatlah bacaan ini - bagian yang relevan adalah "pembagian kerja", mungkin dapat membantu Anda memutuskan kapan akan membuat kode dalam bahasa tingkat yang lebih tinggi dan kapan menggunakan tingkat yang lebih rendah: Kode yang dikelola dalam permainan

Sementara overhead objektif-c tidak boleh berada di dekat C # dan bahkan tidak dikelola (di iOS), saya percaya logika masih berlaku, dan perangkat yang menjalankan iOS juga tidak sedekat PC yang akan menafsirkan MSIL :)

Bahasa Jerman Zaky
sumber
2
Obj-C bukan kode yang dikelola di iOS. Misalnya (dan khususnya) Obj-C memiliki pemulung saat pemrograman untuk OSX, tetapi tidak memiliki pemulung di iOS.
jhocking
@jhocking saya tidak pernah mengatakan itu dikelola, bukankah masih ada overhead saat menggunakan obj-c sebagai lawan dari c ++? Saya memang menyebutkan c # vs c ++ itu tidak ada di mana dekat obj-c vs ​​c ++
Zaky German
Ketika Anda memposting tautan yang disebut "Managed Code in Games" saat berbicara tentang Obj-C maka saya menganggap itu berarti Anda berpikir Obj-C adalah kode yang dikelola. Yang ada di OSX, hanya saja tidak di iOS. Agak konyol itu, seolah-olah Java dikompilasi ke kode mesin pada beberapa platform tetapi berlari di JVM pada yang lain.
jhocking
oh dan saya tidak tahu apakah Obj-C memiliki overhead dibandingkan dengan C ++. Itu sebabnya saya tidak memposting jawaban sendiri.
jhocking
1
@jhocking no sir :) "Masalahnya adalah, model penahan / rilis di Objective-C kira-kira merupakan jalan tengah dari tidak ada manajemen memori ke GC dasar sehingga Anda sudah di depan kurva." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky German
1

Studi ini mengatakan untuk benar-benar mendapatkan kinerja dalam permainan intensif CPU, Anda harus menggunakan C. Artikel yang ditautkan lengkap dengan proyek XCode yang dapat Anda jalankan.

Saya percaya intinya adalah: Gunakan Objective-C di mana Anda harus berinteraksi dengan fungsi iPhone (setelah semua, menempatkan trampolin di mana-mana tidak baik bagi siapa pun) ), tetapi ketika datang ke loop, hal-hal seperti kelas objek vektor, atau intensif akses array, tetap dengan C ++ STL atau array C untuk mendapatkan kinerja yang baik.

Maksud saya itu benar-benar konyol untuk dilihat position = [[Vector3 alloc] init] ;. Anda hanya meminta hit kinerja jika Anda menggunakan referensi mengandalkan objek dasar seperti vektor posisi.

Lihat juga perbandingan ini,

comparisons

bobobobo
sumber
Downvoter? Tolong jelaskan.
bobobobo