Objective-C hay C ++ cho game iOS?


18

Tôi khá tự tin lập trình trong Objective-C và C ++, nhưng tôi thấy Objective-C có phần dễ sử dụng hơn và có tính linh hoạt và năng động hơn.

Điều gì sẽ là ưu và nhược điểm khi sử dụng C ++ thay vì Obj-C để viết trò chơi trong iOS? Hay đúng hơn, có bất kỳ vấn đề nào được biết đến khi sử dụng Obj-C so với C ++ không?

Ví dụ, tôi nghi ngờ có thể có vấn đề về hiệu năng với Obj-C so với mã được viết bằng C / C ++.


Một câu hỏi tương tự đã được hỏi trên SO
bobobobo

Câu trả lời:


21

Một ưu điểm lớn đối với C ++: Nếu bạn quyết định làm như vậy, việc chuyển sang Android / PC / DS / PSP / (chèn nền tảng lựa chọn ở đây) sẽ tương đối dễ dàng. Objective-C sẽ khóa bạn vào iOS cho đến khi bạn quyết định viết lại toàn bộ trò chơi.


10
Tôi không đồng ý với từ "dễ dàng". "Có thể" có thể là một lựa chọn tốt hơn.
3Dave

1
Vâng, đối với nhiều trò chơi nhỏ hơn (ví dụ: hầu hết các trò chơi trên iPhone), tốt hơn hết là bạn nên viết lại mọi thứ từ đầu cho nền tảng mới thay vì cố gắng điều chỉnh mã từ nền tảng này sang nền tảng khác. Một kiến ​​trúc MVC vững chắc sẽ giảm thiểu nỗi đau này, nhưng ai sẽ bận tâm với điều đó cho trò chơi match-3?
jhocking

3
Tương đối dễ! Nếu việc thay thế là không thể, thì "cực kỳ khó" là tương đối dễ dàng;)
ZorbaTHut

blog.vucica.net/2011/06/ anh nói về việc xây dựng các ứng dụng Objective C cho android. Chỉ có Linux và Linux có thể chạy Objc dễ dàng như iPhone.
Mèo Feloneous

Sử dụng mục tiêu c sẽ không khóa bạn. Sử dụng các hàm dành riêng cho kernel XNU sẽ. Gclang là có lý do.

16

Không có ưu và nhược điểm thực sự ở đây, ít nhất là không nên buộc một lập trình viên thoải mái trong một ngôn ngữ phải sử dụng ngôn ngữ kia.

Hiệu suất không phải là một vấn đề. Không chắc là bạn sẽ viết bất kỳ việc nặng nhọc nào với nhiều tin nhắn ở các vòng bên trong nếu bạn là một lập trình viên Obj-C giỏi, điều đó có nghĩa là bạn sẽ thực sự viết những vòng lặp bên trong đó vào C. Nếu bạn không phải là người thấp lập trình viên cấp độ, rất có thể việc nâng hạng nặng sẽ được thực hiện bởi bất kỳ thư viện nào bạn chọn để trì hoãn điều đó, và bạn sẽ tự hào về bất cứ điều gì họ đã chọn làm.

Tính di động một vấn đề thực sự, nếu bạn quan tâm đến nó. Nếu không thì meh. Trở thành nền tảng chéo không phải là kết thúc tất cả. Thành công ngay từ đầu sẽ rất tuyệt :) Bạn luôn có thể chuyển sau. Nếu bạn không có kế hoạch cẩn thận để trở thành nền tảng chéo từ ngày 1, thì việc ở cùng một ngôn ngữ sẽ không giúp bạn tiến xa: có rất nhiều sự khác biệt thực sự giữa các nền tảng cần giải quyết.

Kết thúc dự án quan trọng hơn là việc băn khoăn về công nghệ và nếu bạn làm việc hiệu quả hơn ở Obj-C thì hãy ở lại Obj-C.

Quyền của tôi? Tôi là một chàng trai C ++. Tôi như obj-C tốt, nhưng tôi hạnh phúc trong C ++, và tôi làm viết mã đa nền tảng.


5
Tôi rất đồng tình với lời khuyên tập trung vào việc hoàn thành dự án với bất kỳ công cụ nào bạn làm việc hiệu quả nhất. Tránh tối ưu hóa sớm không chỉ áp dụng cho việc viết mã, đó là một cách tốt để tiếp cận cuộc sống.
jhocking

4

Không có vấn đề về hiệu năng với Obj-C so với C ++. Cả hai đều được biên dịch mã và nhắc lại rằng Obj-C là siêu bộ của C và Obj-C ++ là siêu bộ của C ++, rất tuyệt khi bạn muốn trộn Obj-C và C ++ trong cùng một chương trình (dễ làm và XCode có hỗ trợ tốt cho phía C ++). Tất cả các kết hợp ngôn ngữ đều hỗ trợ OpenGL, vì vậy mọi hoạt động đồ họa nghiêm túc đều ổn và hỗ trợ thư viện đều ổn với Apple bất kể ngôn ngữ.

Điều đó nói rằng, mục đích của trò chơi của bạn là gì?

  • Nếu bạn chỉ viết cho iOS, thì đừng lo lắng và viết bằng bất kỳ ngôn ngữ hoặc sự kết hợp nào bạn cảm thấy thoải mái hơn. Đối với tôi, đây là Obj-C ++ với STL vì đó là phần yêu thích của C ++. Vì tôi thích Obj-C hơn một chút so với C ++, tôi có xu hướng sử dụng tùy chọn này.

  • Nếu bạn đang viết với mục tiêu chuyển sang thiết bị khác, hãy viết bằng C ++ với lớp dịch sang Obj-C để xử lý mọi nội dung dành riêng cho thiết bị (đồ họa, đầu vào, máy ảnh, ...), trong đó các cuộc gọi được thực hiện điểm vào trong ứng dụng của bạn.

  • Nếu bạn là người thuần khiết nhất và chỉ muốn một ngôn ngữ, hãy viết bằng Obj-C.

Những người khác đã nói về các thư viện khác (vật lý và như vậy). Hoàn toàn không có vấn đề gì với việc truy cập bất kỳ vấn đề nào trong số các lựa chọn ngôn ngữ mà bạn đang nói đến (Obj-C, C ++ hoặc Obj-C ++). Bạn cũng sẽ không có bất kỳ vấn đề về hiệu suất với các thư viện đó bằng bất kỳ ngôn ngữ nào.

Một cảnh báo: Có một cuộc gọi cảm ứng con trỏ với thông điệp đi qua. Tôi không chắc bạn có thể hiểu điều đó như thế nào, vì tôi khá chắc chắn rằng nó giống hệt như một cuộc gọi phương thức C ++ được kế thừa. Bất cứ ai có thể làm rõ điều này?

Hy vọng rằng sẽ giúp,

Lee.


1
Điểm tốt, nhưng bạn có thực sự muốn viết Vector3Dlớp của bạn trong Obj-C không? Cảm giác ruột của tôi nói với tôi rằng có thể dẫn đến hiệu suất kém.
Martin Wickman

1
Đó chỉ là nó. Obj-C C. Không phải là vấn đề hiệu suất. Nếu bạn đi đến các tệp tiêu đề tiêu chuẩn với XCode, bạn sẽ thấy các loại cơ bản chỉ là các cấu trúc C.
Lee

2
Chi phí thông báo với Obj-C cao hơn một chút so với C ++ vì nó năng động hơn. Nó chắc chắn KHÔNG "giống hệt nhau". ví dụ: xem developer.apple.com/l
Andy Dent

1

Nó phụ thuộc vào chính xác những gì bạn đang lập trình. Nếu chủ yếu là logic trò chơi sử dụng các công cụ vật lý và đồ họa hiện có, tôi có thể nói rằng tôi không thấy bất kỳ lý do nào để sử dụng c hoặc c ++ nếu bạn cảm thấy thoải mái hơn với obj-c. Nếu bạn chuẩn bị triển khai các lớp kết xuất hoặc vật lý, có lẽ tôi sẽ viết những lớp đó bằng c hoặc c ++. Cocos2d - một điều tuyệt vời và là một trong những thư viện trò chơi iOS phổ biến nhất được viết bằng obj-c.

Hãy xem phần đọc này - phần có liên quan là "phân công lao động", có thể giúp bạn quyết định khi nào nên viết mã bằng ngôn ngữ cấp cao hơn và khi nào sử dụng cấp thấp hơn: Mã được quản lý trong trò chơi

Mặc dù chi phí khách quan không nên ở gần C # và thậm chí không được quản lý (trên iOS), tôi tin rằng logic vẫn được áp dụng và các thiết bị chạy iOS cũng không mạnh bằng PC sẽ diễn giải MSIL :)


2
Obj-C không được quản lý mã trên iOS. Ví dụ (và đặc biệt) Obj-C có trình thu gom rác khi lập trình cho OSX, nhưng nó không có trình thu gom rác trên iOS.
jhocking

@jhocking tôi chưa bao giờ nói nó được quản lý, không phải vẫn còn chi phí khi sử dụng obj-c trái ngược với c ++ sao? Tôi đã đề cập đến c # vs c ++, không có nơi nào gần obj-c vs ​​c ++
Zaky German

Khi bạn đăng một liên kết có tên "Mã được quản lý trong trò chơi" trong khi nói về Obj-C thì tôi nghĩ điều đó có nghĩa là bạn nghĩ Obj-C là mã được quản lý. Đó là trên OSX, không phải trên iOS. Kiểu như vậy, như thể Java đã biên dịch thành mã máy trên một số nền tảng nhưng chạy trong JVM trên các nền tảng khác.
jhocking

oh và tôi không biết liệu Obj-C có bất kỳ chi phí nào so với C ++ không. Đó là lý do tại sao tôi không đăng một câu trả lời cho mình.
jhocking

1
@jhocking no sir :) "Vấn đề là, mô hình giữ lại / phát hành trong Objective-C gần như là một nền tảng trung gian từ việc không quản lý bộ nhớ đến một GC cơ bản nên bạn đã đi trước đường cong." interfacelab.com/objective-c-memory-management-for-lazy-people
Zaky Đức

1

Nghiên cứu này cho biết để thực sự có được hiệu năng trong một trò chơi chuyên sâu về CPU, bạn phải sử dụng C. Bài viết được liên kết đã hoàn thành với dự án XCode mà bạn có thể chạy.

Tôi tin rằng điểm mấu chốt là: Sử dụng Objective-C trong đó bạn phải tương tác với các chức năng của iPhone (xét cho cùng, việc đặt trampolines ở mọi nơi không thể tốt cho bất kỳ ai ), nhưng khi nói đến các vòng lặp, những thứ như lớp đối tượng vector hoặc chuyên sâu truy cập mảng, gắn với mảng C ++ STL hoặc C để có hiệu suất tốt.

Tôi có nghĩa là nó sẽ hoàn toàn ngớ ngẩn để xem position = [[Vector3 alloc] init] ;. Bạn chỉ yêu cầu một cú đánh hiệu suất nếu bạn sử dụng số tham chiếu trên các đối tượng cơ bản như một vectơ vị trí.

Xem thêm những so sánh này,

so sánh


Downvoter? Vui lòng giải thích.
bobobobo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.