Phát triển đa nền tảng C ++ / OpenGL ES (iOS / Android) [đã đóng]


10

Tôi đã có kinh nghiệm hợp lý với C ++ và OpenGL và gần đây tôi đã quyết định thử phát triển trò chơi di động. Sau khi tạo thành công một ứng dụng Android OpenGL ES đơn giản bằng Java, tôi đã nghiên cứu các cách để nhắm mục tiêu cả Android và iOS với càng ít mã viết lại càng tốt. Tôi đã thử sử dụng các công cụ phát triển ứng dụng đa nền tảng đáng tự hào của Visual Studio 2015, nhưng thấy chúng còn quá mới và do đó cực kỳ thiếu tài liệu. Tôi có thể xây dựng các dự án mẫu mà chương trình đưa cho tôi, nhưng tôi không thể hiểu làm thế nào, với những mẫu này, tôi có thể thêm tài sản vào trò chơi hoặc xử lý đầu vào màn hình cảm ứng.

Tôi có một mong muốn cụ thể không may, quá cụ thể để tìm thấy với Google. Tôi muốn tạo một trò chơi OpenGL ES bằng C ++, với các trình bao bọc dành riêng cho nền tảng mỏng dành cho Android và iOS. Mọi người đã hỏi tôi những câu hỏi tương tự (mặc dù không hoàn toàn giống nhau) và hơn một người trả lời đã nói rằng những gì tôi muốn làm không chỉ có thể, mà còn tương đối dễ dàng, vì tôi không phải lo lắng về UI.

Tôi đã thử hướng dẫn này , nhưng nó đã gần ba tuổi và do đó có lẽ được thiết kế cho công nghệ cũ hơn và kết quả là tôi đã gặp phải nhiều lỗi không thể đếm được. Tuy nhiên, ngay lúc này, hướng dẫn đó là thứ gần nhất với những gì tôi muốn mà tôi đã tìm thấy. Mọi thứ khác chỉ là Android hoặc khuyên tôi nên trả hàng trăm đô la mỗi năm để sử dụng SDK Marmalade. Đôi khi tôi cảm thấy như chỉ viết mã hai lần, một lần bằng Java và một lần vào Objective-C, nhưng tôi vẫn bị thúc đẩy bởi kiến ​​thức rằng giải pháp này là có thể, nhưng vì một số lý do, không được đề cập ở bất kỳ đâu trong bất kỳ chi tiết hiện đại nào.

Tóm lại, tôi muốn tạo một trò chơi OpenGL ES cho iOS và Android, với một cơ sở mã C ++ duy nhất được gói trong một lượng nhỏ mã dành riêng cho nền tảng. Tuy nhiên, mặc dù thực tế là một số người đã khuyến nghị phương pháp này, nhưng không ai có thể cho tôi biết cách thực hiện. Ai đó có thể cho tôi biết nếu nó thực sự có thể, và nếu vậy, tôi có thể làm gì hoặc tôi có thể đi đâu để học như thế nào?


thử cocos2d-x hoặc unity3d
Ali1S232

1
unity3d khác xa với những gì OP yêu cầu vì bạn không có quyền truy cập nguồn. Tôi đã sử dụng cocos2d-x và các vấn đề biên dịch vẫn còn ở một mức độ nào đó. Ảnh hưởng của Objective-C cũng được cảm nhận, một số có thể thích điều đó, nhưng đối với tôi đó là một sự tắt. Tuy nhiên, đây là một giải pháp nguồn mở, vì vậy có lẽ đáng để OP điều tra thời gian.
Matthew Sanders

Câu trả lời:


6

Bạn có thể tìm thấy câu trả lời của tôi cho một câu hỏi tương tự ở đây là hữu ích.

Bạn cũng có thể thấy hữu ích khi xem xét mã nguồn của các giải pháp khác. Các cơ Godot ví dụ là một công cụ nền tảng mã nguồn mở trò chơi chéo, do đó bạn không bao giờ cần đến bất cứ điều gì lương.

Như tôi đã đề cập trong câu trả lời khác của tôi, bạn không cần (và có thể không thể) dựa vào một IDE để thực hiện công việc cho bạn. CMake , Sconsnhiều công cụ xây dựng khác có thể trợ giúp cho quá trình biên dịch / xây dựng chéo trên các nền tảng và IDE.

Ví dụ, Godot Engine sử dụng Scons và dự án LLVM (hay còn gọi là khung trình biên dịch được sử dụng bởi clang trình biên dịch C / C ++ / Objective-C) sử dụng CMake .

Một cách tiếp cận phổ biến cho các trò chơi là xây dựng một công cụ trong C / C ++ và, như bạn đã đề cập, cụ thể về nền tảng trừu tượng. Khi nói đến iOS và Android, đây là logic quản lý vòng đời giao tiếp với HĐH. Nếu bạn muốn đi xa hơn và sử dụng Emscripten để biên dịch thành asm.js và nhận ra tốc độ gần trong trình duyệt, bạn đang làm một cái gì đó tương tự với việc trừu tượng hóa vòng lặp chính đằng sau số tiền cho các cuộc gọi requestAnimationFrame .

Emscripten khuyên bạn nên sử dụng SDL để làm cho quá trình chuyển đổi dễ dàng hơn vì nó có thể giúp xử lý trừu tượng hóa các chi tiết cụ thể của nền tảng, nhưng không có gì ngăn bạn tự làm điều này (sau đó tải vô số nghiên cứu, gỡ lỗi, v.v.).

Nếu bạn thực sự, thực sự điên rồ, bạn có thể làm những gì tôi đang làm và viết ngôn ngữ của riêng bạn bằng cách sử dụng sức mạnh của LLVM để biên dịch sang C ABI bản địa hoặc thậm chí JIT trên các nền tảng được hỗ trợ.

Vấn đề là có, điều đó thực sự có thể, nhưng một số con đường phức tạp hơn / tốn thời gian hơn những con đường khác.

Lưu ý: Bạn có thể sẽ cần sử dụng Mac OSX thông qua máy Mac, VM hoặc Hackffy với XCode để biên dịch sang iOS. Đây là một trong nhiều lý do tôi thấy Macbook Pro là một ứng cử viên tuyệt vời cho hệ thống phát triển.

Note2: Điều đáng nói là ngày nay nhiều công cụ đa nền tảng sử dụng các ngôn ngữ kịch bản cho logic cụ thể của trò chơi. Unity thậm chí không cho phép bạn ở gần mã nguồn của họ chẳng hạn (mặc dù bạn có thể viết các plugin gốc). Điều này có thể giúp tăng tốc các chu kỳ phát triển cũng như duy trì chuyển đến mức tối thiểu vì các ngôn ngữ kịch bản là không rõ ràng về nền tảng (đặc biệt là các ngôn ngữ được giải thích đang chạy trong VM). Mục tiêu cho ngôn ngữ của tôi là cho phép cả JIT (chủ yếu là tiết kiệm thời gian phát triển) và biên dịch tĩnh.

Lưu ý 3: Nếu bạn chưa tìm thấy điều này. Nếu bạn không sử dụng SDL hoặc một số giải pháp khác trừu tượng hóa các chi tiết cụ thể của nền tảng, bạn sẽ cần sử dụng các tính năng giao tiếp C / C ++ cụ thể của từng nền tảng. Với iOS, điều này khá đơn giản trong XCode vì trình biên dịch (clang như đã đề cập ở trên) đã hỗ trợ C / C ++. Với Android, bạn cần sử dụng cáccuộc gọi NDK và marshall giữa Java và C / C ++.


1
Tôi nhìn vào mã nguồn của Godot Engine. Có vẻ hơi quá đáng; Tôi muốn tự tạo mà không cần các tính năng tôi không cần. Tôi không chắc chắn làm thế nào để làm điều đó, mặc dù. Tôi chưa thể chạy thành công bất kỳ mã C ++ nào trên Android.
Craig Horwood

hehe ... ya NDK không đi dã ngoại. Thành thật tôi tìm thấy bất cứ điều gì google cần một số trợ giúp trong danh mục thân thiện với nhà phát triển. Là sử dụng SDL ra khỏi giới hạn cho bạn? Tôi có nhiều thông tin hơn tôi có thể cập nhật câu trả lời nếu cần.
Matthew Sanders

SDL không đi quá giới hạn, nhưng tôi không muốn đến đó. Một lần nữa, luôn có một chút kiến ​​thức rắc rối mà nó có thể được thực hiện mà không có khung.
Craig Horwood

Tôi liên tục bị cắn bởi con bọ đó, vì vậy tôi biết cảm giác của bạn. Tôi đã sử dụng NDK trong quá khứ và tôi không nghĩ nhiều thay đổi trong cách thiết lập và biên dịch. Tôi chắc chắn hy vọng việc gỡ lỗi đã được cải thiện khi bạn phải sử dụng GDB trực tiếp trong quá khứ qua thiết bị đầu cuối và IDE không hỗ trợ cho nó, nhưng có vẻ như họ đã bắt đầu thêm hỗ trợ NDK cho studio android . Bạn đã thử ví dụ hellojni chưa?
Matthew Sanders

NDK là một trong những điều kinh tởm nhất trong sự tồn tại, bạn có thể thấy bgfx hữu ích như một tài liệu tham khảo github.com/bkaradzic/bgfx , nó không mỏng như bạn có thể nghĩ, nó có nhiều phụ trợ kết xuất
JBeurer
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.