适用于iOS游戏的Objective-C还是C ++?


18

我对使用Objective-C和C ++进行编程非常有信心,但是我发现使用Objective-C在某种程度上更容易使用,并且本质上更加灵活和动态。

使用C ++代替Obj-C在iOS上编写游戏时,优缺点是什么?或者,与C ++相比,使用Obj-C是否存在任何已知问题?

例如,与使用C / C ++编写的代码相比,我怀疑 Obj-C可能存在性能问题。


Answers:


21

C ++的一大优势:如果您决定这样做,则移植到Android / PC / DS / PSP /(在此处插入所选平台)将相对容易。在决定重写整个游戏之前,Objective-C会将您锁定在iOS中。


10
我不同意“简单”一词。“可能”可能是一个更好的选择。
3Dave 2011年

1
是的,对于许多较小的游戏(例如,大多数iPhone游戏),最好是从头开始为新平台重新编写所有内容,而不是尝试从一个平台改编代码以在另一个平台上工作。可靠的MVC架构可以最大程度地减少这种痛苦,但是谁会为三消游戏而烦恼呢?
jhocking 2011年

3
比较容易!如果没有其他选择,那么“极端困难”相对容易;)
ZorbaTHut 2011年

blog.vucica.net/2011/06/…他谈论了为Android构建Objective C应用程序。仅仅是Linux,Linux可以像iPhone一样轻松地运行Objc。
Feloneous Cat

使用目标c不会锁定您。使用特定于XNU内核的函数将可以。Gclang在那里是有原因的。

16

这里没有真正的利弊,至少没有一个应该迫使程序员习惯一种语言而不得不使用另一种语言。

性能不应该成为问题。如果您是一名优秀的Obj-C程序员,那么您不太可能在内部循环中编写大量繁重的消息,这意味着您真的会在C中编写这些内部循环。级别的程序员,很可能繁重的工作将由您选择延迟的任何库来完成,而您将受其选择所做的一切摆布。

可移植性 如果您在乎它,则一个实际问题。如果没有,那么。跨平台并不是最终目标。首先取得成功将是一件好事:)您以后可以随时移植。如果您从第一天开始就没有计划跨平台,只是使用相同的语言就不会让您走得太远:需要解决的平台之间还有很多其他的实际差异。

完成项目比为技术烦恼更重要,如果您在Obj-C方面的工作效率更高,那么请留在Obj-C。

我的偏爱?我是C ++人。我很喜欢Obj-C,但是我对C ++很满意,并且确实编写了跨平台代码。


5
我非常同意建议,将重点放在使用您最高效的工具完成项目上。避免过早的优化不仅适用于编写代码,而且是一种接近生活的好方法。
jhocking 2011年

4

C ++上的Obj-C没有性能问题。两者都是经过编译的代码,并且回想起Obj-C是C的超集,而Obj-C ++是C ++的超集,当您想在同一程序中混合Obj-C和C ++时,这非常有用(易于操作和XCode对C ++方面有很好的支持)。所有语言组合都支持OpenGL,因此任何认真的图形工作都可以,并且不管语言如何,Apple都可以支持库。

也就是说,您的游戏目的是什么?

  • 如果您仅是为IOS编写的,那么请不要担心,并以自己喜欢的任何语言或组合编写。对于我来说,这恰好是带有STL的Obj-C ++,因为这是我最喜欢的C ++部分。由于与C ++相比我更喜欢Obj-C,因此我倾向于使用此选项。

  • 如果您打算移植到另一台设备,请使用带有转换层的C ++到Obj-C进行编写,以处理任何特定于设备的内容(图形,输入,相机等),并在其中进行调用应用程序中的入口点。

  • 如果您是最纯粹的人,并且只想要一种语言,请使用Obj-C编写。

其他人谈论了其他图书馆(物理等)。从您正在谈论的任何语言选择(Obj-C,C ++或Obj-C ++)中访问任何一个,都绝对没有问题。您也不会以任何语言使用这些库遇到任何性能问题。

注意:有一个指针间接调用与消息传递。我不确定您可以将多少解释为开销,因为我非常确定这与继承的C ++方法调用完全相同。谁能澄清一下?

希望能有所帮助,


1
好点,但是您真的要用Vector3DObj-C 编写您的课程吗?我的直觉告诉我,这可能会导致性能下降。
Martin Wickman

1
就是这样 Obj-C C。不是性能问题。如果使用XCode转到标准头文件,则会发现基础类型只是C结构。
李,

2
Obj-C的消息开销比C ++高很多,因为它更具动态性。当然不是“完全一样”。如:看developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/...
安迪·登特

1

这取决于究竟是什么你是编程。如果主要是使用现有物理和图形引擎的游戏逻辑,我可以肯定地说,如果您更喜欢obj-c,则看不到使用c或c ++的任何理由。如果要推出渲染类或物理类,我可能会使用c或c ++编写。Cocos2d-很棒,也是最流行的iOS游戏库之一是用obj-c编写的。

查看此内容-相关部分是“分工”,可能有助于您决定何时使用高级语言编写代码以及何时使用较低级别的代码游戏中的托管代码

尽管Objective-C的开销应该几乎不接近C#,甚至无法得到管理(在iOS上),但我相信逻辑仍然适用,而且运行iOS的设备也不如解释MSIL的PC强大。


2
Obj-C在iOS上不是托管代码。例如(特别是)Obj-C在为OSX编程时具有垃圾收集器,但在iOS上没有垃圾收集器。
2011年

@jhocking我从未说过它是托管的,使用obj-c而不是c ++时是否还没有开销?我确实提到过C#与C ++,但在obj-C与C ++之间
却无处可寻

当您在谈论Obj-C时发布名为“游戏中的托管代码”的链接时,我认为您认为Obj-C是托管代码。它在OSX上,而不在iOS上。有点愚蠢,就像Java在某些平台上编译为机器代码,而在其他平台上运行JVM一样。
2011年

哦,我不知道Obj-C与C ++相比是否有任何开销。这就是为什么我自己不发布答案。
2011年

1
@jhocking no先生:)“问题是,从无内存管理到基本GC,Objective-C中的保留/释放模型大约处于中间地带,因此您已经处于领先地位。” interfacelab.com/objective-c-memory-management-for-lazy-people
扎基德国

1

这项研究表明,要真正获得CPU密集型游戏的性能,您必须使用C。链接的文章随附了可以运行的XCode项目。

我认为最重要的是:使用Objective-C,必须在其中与iPhone的功能进行交互(毕竟,将蹦床放在任何地方对任何人都不利),但是当涉及到循环时,矢量对象类之类的东西或密集型数组访问,请坚持使用C ++ STL或C数组以获得良好的性能。

我的意思是完全愚蠢的看到position = [[Vector3 alloc] init] ;。如果您对诸如位置矢量之类的基本对象使用引用计数,您只是在要求提高性能。

另请参阅这些比较,

comparisons


下注者?请解释。
bobobobo 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.