iOS 게임용 Objective-C 또는 C ++?


18

나는 Objective-C와 C ++에서의 프로그래밍에 대해 확신을 가지고 있지만 Objective-C는 다소 사용하기 쉽고 자연스럽고 유연합니다.

iOS에서 게임을 작성하기 위해 Obj-C 대신 C ++를 사용할 때의 장단점은 무엇입니까? 아니면 C ++과 비교하여 Obj-C를 사용하는 데 알려진 문제가 있습니까?

예를 들어, 나는 의심 C / C ++로 작성된 코드에 비해의 Obj-C 성능 문제가있을 수 있습니다.


비슷한 질문 이 SO
bobobobo

답변:


21

C ++의 큰 장점 중 하나 : 그렇게하기로 결정한 경우 Android / PC / DS / PSP / (여기서 선택한 플랫폼 삽입)로 이식하는 것이 상대적으로 쉽습니다. Objective-C는 전체 게임을 다시 작성하기로 결정할 때까지 iOS에 고정됩니다.


10
나는 "쉬운"이라는 단어에 동의하지 않습니다. "가능한"이 더 나은 선택 일 수 있습니다.
3Dave

1
예, 대부분의 작은 게임 (예 : 대부분의 iPhone 게임)의 경우 한 플랫폼의 코드를 다른 플랫폼에서 작동하도록 수정하는 대신 새 플랫폼에 대한 모든 것을 처음부터 다시 작성하는 것이 좋습니다. 탄탄한 MVC 아키텍처는 이러한 고통을 최소화 할 수 있지만, 누가 매치 3 게임에서 그 어려움을 겪을까요?
jhocking

3
비교적 쉽다! 대안이 불가능하다면, "매우 어려운"것은 비교적 쉽다;)
ZorbaTHut

blog.vucica.net/2011/06/… Android 용 Objective C 앱 빌드에 대해 이야기합니다. 그것은 단지 리눅스이며 리눅스는 아이폰처럼 Objc를 쉽게 실행할 수 있습니다.
Feloneous Cat

objective c를 사용하면 잠기지 않습니다. XNU 커널에 특정한 기능을 사용하면됩니다. Gclang은 이유가 있습니다.

16

여기에는 실제 장단점이 없지만 적어도 한 언어로 편안한 프로그래머가 다른 언어를 사용해야하는 것은 없습니다.

성능은 문제가되지 않습니다. 훌륭한 Obj-C 프로그래머라면 내부 루프에 많은 메시지를 담아 무거운 리프팅을 작성하지는 않을 것입니다. 이는 실제로 내부 루프를 C로 작성한다는 의미입니다. 레벨 프로그래머라면, 당신이 선택한 라이브러리에 의해서도 많은 노력을 기울일 것입니다. 그리고 당신은 그들이 선택한 것을 자비로 여길 것입니다.

이식성 마음에 든다면 실제 문제입니다. 그렇지 않다면, meh. 크로스 플랫폼이되는 것이 전부는 아닙니다. 먼저 성공하면 좋을 것입니다 :) 나중에 언제든지 포트 할 수 있습니다. 어쨌든 첫날부터 크로스 플랫폼을 신중하게 계획하지 않는다면 같은 언어를 사용하더라도 그리 멀지 않을 것입니다. 어드레싱이 필요한 플랫폼 간에는 더 많은 실제 차이점이 있습니다.

프로젝트를 마무리하는 것이 기술에 대한 불만을 표명하는 것보다 중요하며, Obj-C에서 생산성이 높으면 Obj-C를 유지하십시오.

내 선호? 저는 C ++ 사람입니다. 잘의 Obj-C와 같은 I,하지만 난 C ++에서 행복 해요, 난 쓰기 크로스 플랫폼 코드를.


5
나는 가장 생산적인 도구를 사용하여 프로젝트를 마무리하는 데 중점을 두라는 조언과 매우 동의합니다. 조기 최적화를 피하는 것은 코드 작성에만 적용되는 것이 아니라 삶에 접근하는 좋은 방법입니다.
jhocking

4

C ++를 통한 Obj-C에는 성능 문제가 없습니다. 둘 다 컴파일 된 코드이며, Obj-C는 C의 수퍼 세트이고, Obj-C ++는 C ++의 수퍼 세트라는 것을 기억하십시오. Obj-C와 C ++를 같은 프로그램에서 혼합하고 싶을 때 좋습니다 (쉽고 XCode C ++ 측면을 훌륭하게 지원합니다). 모든 언어 조합은 OpenGL을 지원하므로 심각한 그래픽 작업이 가능하며 언어에 관계없이 Apple에서 라이브러리 지원이 가능합니다.

즉, 게임의 목적은 무엇입니까?

  • IOS 전용으로 작성하는 경우 더 편하게 느끼는 언어 나 조합으로 걱정하거나 쓰지 마십시오. 저에게 이것은 CTL에서 제가 가장 좋아하는 부분이기 때문에 STL이 포함 된 Obj-C ++입니다. C ++보다 약간 Obj-C를 선호하기 때문에이 옵션을 사용하는 경향이 있습니다.

  • 다른 장치로 포팅하는 것을 목표로 쓰고 있다면 Obj-C로 변환 레이어를 사용하여 C ++로 작성하여 장치 관련 항목 (그래픽, 입력, 카메라 등)을 처리하십시오. 응용 프로그램의 진입 점.

  • 가장 순수하고 하나의 언어 만 원한다면 Obj-C로 작성하십시오.

다른 사람들은 다른 도서관 (물리학 등)에 대해 이야기했습니다. 당신이 말하고있는 언어 선택 (Obj-C, C ++, 또는 Obj-C ++)에서 접근하는 데는 아무런 문제가 없습니다. 또한 해당 언어로 된 라이브러리와 관련된 성능 문제가 없습니다.

경고 : 메시지 전달과 함께 포인터 간접 호출이 있습니다. 상속 된 C ++ 메서드 호출과 정확히 동일하기 때문에 오버 헤드로 얼마나 해석 할 수 있는지 잘 모르겠습니다. 누구든지 이것을 명확히 할 수 있습니까?

도움이 되길 바랍니다.

남자 이름.


1
좋은 점이지만 Vector3DObj-C에서 수업 을 정말로 작성하고 싶 습니까? 내 직감은 성능 저하로 이어질 수 있다고 말합니다.
Martin Wickman

1
바로 그거야 Obj-C C 입니다 . 성능 문제가 아닙니다. XCode를 사용하여 표준 헤더 파일로 이동하면 기본 유형이 C 구조체라는 것을 알 수 있습니다.
Lee

2
Obj-C의 메시지 오버 헤드는 동적이기 때문에 C ++보다 상당히 높습니다. "정확히 같은"것은 아닙니다. 예 : developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
Andy Dent

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에는 가비지 수집기가 없습니다.
jhocking

@ jockocking 나는 그것이 관리되었다고 결코 말하지 않았다 .C ++과 반대로 obj-c를 사용할 때 여전히 오버 헤드가 있습니까? 나는 더 C ++ 대 어디 근처 OBJ-C이었다 C ++ 대 # c를 언급했다
Zaky 독일어

Obj-C에 대해 이야기하면서 "게임의 관리 코드"라는 링크를 게시하면 Obj-C가 관리 코드라고 생각한다는 의미입니다. iOS가 아닌 OSX에 있습니다. 마치 Java가 일부 플랫폼에서 기계 코드를 컴파일하기 위해 컴파일되었지만 다른 플랫폼에서는 JVM에서 실행되는 것처럼 일종의 구피입니다.
jhocking

그리고 Obj-C가 C ++에 비해 오버 헤드가 있는지 모르겠습니다. 그래서 내가 직접 답변을 게시하지 않는 이유입니다.
jhocking

1
@jhocking no sir :) "중요한 것은 Objective-C의 유지 / 해제 모델은 메모리 관리에서 기본 GC까지의 중간 단계이므로 이미 앞서고 있습니다." interfacelab.com/objective-c-memory-management-lazy-people
Zaky German

1

이 연구 에서는 CPU를 많이 사용하는 게임에서 실제로 성능을 얻으려면 C를 사용해야합니다. 링크 된 기사는 실행할 수있는 XCode 프로젝트로 완성되었습니다.

나는 생각 결론은 다음과 같습니다 사용 오브젝티브 C는 (결국, 아이폰의 기능과 상호 작용해야 곳 어디에서나 트램폴린 퍼팅 사람에게 좋지 않을 수 있습니다 )하지만 루프에 관해서, 벡터 객체 클래스 같은 것들, 또는 집중 어레이 액세스, 우수한 성능을 얻으려면 C ++ STL 또는 C 어레이를 사용하십시오.

나는 그것을 보는 것이 완전히 어리석은 것을 의미합니다 position = [[Vector3 alloc] init] ;. 위치 벡터와 같은 기본 객체에 참조 횟수를 사용하면 성능 저하를 요구하는 것입니다.

이러한 비교를 참조하십시오.

비교


Downvoter? 설명 해주십시오.
bobobobo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.