İOS oyunları için Objective-C veya C ++?


18

Objective-C ve C ++ programlamasında oldukça eminim, ancak Objective-C'nin kullanımını biraz daha kolay, doğada daha esnek ve dinamik buluyorum.

İOS'ta oyun yazmak için Obj-C yerine C ++ kullanıldığında artıları ve eksileri ne olurdu? Ya da daha ziyade, C ++ ile karşılaştırıldığında Obj-C kullanımında bilinen herhangi bir sorun var mı?

Örneğin, C / C ++ ile yazılmış koda kıyasla Obj-C ile ilgili performans sorunları olabileceğinden şüpheleniyorum .


Benzer bir soru soruldu: SO
bobobobo

Yanıtlar:


21

C ++ 'a büyük bir ters: Bunu yapmaya karar verirseniz, Android / PC / DS / PSP /' ye (nispeten tercih edilen platformu buraya ekleyin) bağlanmak nispeten daha kolay olacaktır. Objective-C, tüm oyunu yeniden yazmaya karar verene kadar sizi iOS'a kilitleyecek.


10
"Kolay" kelimesine katılmıyorum. "Mümkün" daha iyi bir seçim olabilir.
3Dave

1
Evet, birçok küçük oyun için (örneğin çoğu iPhone oyunu), kodu bir platformdan diğerine çalışmaya uyarlamak yerine her şeyi yeni platform için sıfırdan yeniden yazmak daha iyidir. Sağlam bir MVC mimarisi bu acıyı en aza indirir, ancak bir maç-3 oyunu için kim onu ​​rahatsız eder?
jhocking

3
Nispeten kolay! Alternatif imkansız ise, o zaman "son derece zor" nispeten kolaydır;)
ZorbaTHut

blog.vucica.net/2011/06/… android için Objective C uygulamaları oluşturma hakkında konuşuyor. Sadece Linux ve Linux Objc'i bir iPhone kadar kolay çalıştırabilir.
Feloneous Cat

Objektif c kullanmak sizi kilitlemez. XNU çekirdeğine özgü işlevleri kullanmak. Gclang bir sebepten dolayı orada.

16

Burada gerçek bir artı veya eksileri yoktur, en azından hiçbiri bir programcıyı bir dilde diğerini kullanmak zorunda bırakmaya zorlamamalıdır.

Performans sorun olmamalı. İyi bir Obj-C programcısıysanız, iç döngülerde çok fazla mesajla ağır bir kaldırma yapmanız pek olası değildir, bu da C'deki bu iç döngüleri gerçekten yazacağınız anlamına gelir. seviye programcısı, ağır kaldırma şansı ertelemek için seçtiğiniz kütüphaneler tarafından yapılacaktır, ve onlar ne seçtiklerini merhamet olacak.

Taşınabilirlik ise bu konuda veriyorsan, gerçek bir sorun. Değilse, o zaman meh. Çapraz platform olmak sonun hepsi değil. Birincide başarılı olmak güzel olurdu :) Daha sonra her zaman bağlantı kurabilirsiniz. Yine de 1. günden itibaren çapraz platform olmayı planlamıyorsanız, sadece aynı dilde olmak sizi çok ileriye götürmez: adreslenmesi gereken platformlar arasında daha fazla gerçek fark vardır.

Projeyi bitirmek, teknoloji hakkında endişelenmekten daha önemlidir ve Obj-C'de daha üretken iseniz, Obj-C'de kalın.

Benim tercihim? Ben bir C ++ erkeğim. Gayet güzel Obj-C gibi, ama ben C ++ mutluyum ve ben bunu yazma çapraz platform kodu.


5
Projeyi en verimli olduğunuz araçlarla bitirmeye odaklanma tavsiyesine çok katılıyorum. Erken optimizasyondan kaçınmak sadece kod yazmak için geçerli değildir, hayata yaklaşmak için iyi bir yoldur.
jhocking

4

C ++ üzerinden Obj-C ile ilgili herhangi bir performans sorunu yoktur. Her ikisi de derlenmiş koddur ve Obj-C'nin C'nin bir üst kümesi olduğunu ve Obj-C ++, aynı programda Obj-C ve C ++ 'ı karıştırmak istediğinizde harika olan C ++' ın bir üst kümesidir. C ++ tarafı için güzel bir destek var). Tüm dil kombinasyonları OpenGL'yi destekler, bu nedenle herhangi bir ciddi grafik çalışması iyidir ve dilden bağımsız olarak kütüphane desteği Apple ile tamamdır.

Bununla birlikte, oyununuzun amacı nedir?

  • Sadece IOS için yazıyorsanız, endişelenmeyin ve kendinizi daha rahat hissettiğiniz dil veya kombinasyonda yazın. Benim için bu, C ++ 'nın en sevdiğim kısmı olan STL ile Obj-C ++ olur. Obj-C'yi C ++ yerine biraz tercih ettiğim için bu seçeneği kullanma eğilimindeyim.

  • Başka bir cihaza taşıma hedefi ile yazıyorsanız, çağrıların yapıldığı cihaza özgü herhangi bir şeyle (grafik, giriş, kamera, ...) ilgilenmek için C ++ dilinde bir çeviri katmanıyla Obj-C'ye yazın. uygulamanızdaki giriş noktaları.

  • Eğer en safsanız ve sadece bir dil istiyorsanız, Obj-C'ye yazın.

Diğerleri diğer kütüphanelerden (fizik ve benzeri) bahsetti. Bahsettiğiniz dil seçeneklerinden herhangi birine (Obj-C, C ++ veya Obj-C ++) bunlardan herhangi birine erişmekle ilgili kesinlikle hiçbir sorun yoktur. Ayrıca herhangi bir dilde bu kütüphanelerle ilgili herhangi bir performans sorununuz olmayacaktır.

Bir uyarı: İletiyi geçen bir işaretçi dolaylı çağrı var. Bunun miras olarak ne kadar yorumlanabileceğinden emin değilim, çünkü bunun miras alınan bir C ++ yöntem çağrısı ile tam olarak aynı olduğundan eminim. Bunu açıklığa kavuşturan var mı?

Umarım yardımcı olur,

Lee.


1
İyi puan, ama gerçekten Vector3Dsınıfınızı Obj-C'de yazmak ister misiniz ? Bağırsak hissim bana bunun kötü performansa yol açabileceğini söylüyor.
Martin Wickman

1
Sadece bu kadar. Obj Cı olduğu C değil performans sorunu. XCode ile standart başlık dosyalarına giderseniz, temel türlerin sadece C yapıları olduğunu göreceksiniz.
Lee

2
Obj-C ile yüklenen ileti C ++ 'dan biraz daha yüksektir çünkü daha dinamiktir. Kesinlikle "tamamen aynı" DEĞİLDİR. örneğin: bkz. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent

1

Tam olarak ne programladığınıza bağlıdır . Esas olarak mevcut fizik ve grafik motorlarını kullanan oyun mantığı ise, obj-c ile daha rahatsanız c veya c ++ kullanmak için herhangi bir neden göremiyorum. Eğer render veya fizik dersleri yayıyoruz olacak, muhtemelen c veya c ++ kullanarak olanlar yazmak. Harika ve en popüler iOS oyun kütüphanelerinden biri olan Cocos2d obj-c'de yazılmıştır.

Bu okumaya bir göz atın - ilgili bölüm "iş bölümü", ne zaman daha yüksek bir dilde kod yazacağınıza ve ne zaman daha düşük seviye kullanacağınıza karar vermenize yardımcı olabilir: Oyunlarda yönetilen kod

Objektif-c yükü C # yakınında hiçbir yerde olmamalı ve hatta (iOS'ta) yönetilmemesine rağmen, mantığın hala geçerli olduğuna inanıyorum ve iOS çalıştıran cihazlar da MSIL'i yorumlayacak PC kadar güçlü değil :)


2
Obj-C, iOS'ta yönetilen kod değil. Örneğin (ve özellikle) Obj-C, OSX için programlama yaparken bir çöp toplayıcıya sahiptir, ancak iOS'ta bir çöp toplayıcıya sahip değildir.
jhocking

@jhocking asla yönetildiğini söylemedim, c ++ yerine obj-c kullanırken hala ek yük var mı? Ben c # vs c ++ bahsetti mi obj-c vs ​​c ++ yakınında hiçbir yerde oldu
Zaky Alman

Obj-C hakkında konuşurken "Oyunlarda Yönetilen Kod" adlı bir bağlantı yayınladığınızda Obj-C'nin yönetilen kod olduğunu düşündüğünüz anlamına gelir. OSX'te, sadece iOS'ta değil. Java, bazı platformlarda makine koduna derlenmiş ancak diğerlerinde JVM'de çalıştırılmış gibi.
jhocking

oh ve Obj-C'nin C ++ ile karşılaştırıldığında herhangi bir ek yükü olup olmadığını bilmiyorum. Bu yüzden kendime bir cevap göndermiyorum.
jhocking

1
@jhocking no sir :) "Mesele şu ki, Objective-C'deki tutma / bırakma modeli, bellek yönetiminden temel bir GC'ye kabaca bir orta yoldur, bu yüzden zaten eğrinin önündesiniz." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky Alman

1

Bu çalışma , CPU yoğun bir oyunda gerçekten performans elde etmek için C kullanmanız gerektiğini söylüyor. Bağlantılı makale, çalıştırabileceğiniz bir XCode projesi ile tamamlandı.

İnanıyorum Sonuçta geçerli: Kullanım Objective-C (tüm sonra, iPhone'un fonksiyonlarına etkileşimde bulunmak zorunda nerede her yerde trambolin koyarak herkes için iyi olamaz ), ancak döngüler gelince, vektör nesne sınıfları gibi şeyler, ya da yoğun dizi erişimi, iyi performans elde etmek için C ++ STL veya C dizileri ile sopa.

Yani görmek tamamen aptalca olurdu position = [[Vector3 alloc] init] ;. Sadece bir konum vektörü gibi temel nesnelerde referans sayıları kullanırsanız performans artışı istersiniz.

Ayrıca bkz.

karşılaştırmalar


Downvoter? Lütfen açıkla.
bobobobo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.