Làm cách nào tôi có thể chạy trên nhiều nền tảng bằng cách sử dụng một công cụ tùy chỉnh?


13

Các công cụ trò chơi như Unity và Unreal có thể chạy trên nền tảng mutipl. Tôi tự hỏi làm thế nào họ làm điều này.

Tôi đã sử dụng C ++ và OpenGL được một thời gian và điều tôi đang tìm kiếm là các tài nguyên để tích hợp thứ gì đó sẽ cho phép tôi chạy trên các nền tảng khác nhau mà không cần viết lại. Một cái gì đó giống như LibGDX nơi bạn viết mã bằng API cơ sở và sau đó API chuyển đổi nó thành HTML, Android, iOS, et cetera. Tôi biết rằng tôi có thể sử dụng một công cụ khác thay vì tự viết nhưng tôi thích trải nghiệm học tập.

Câu trả lời:


26

Cổng động cơ của bạn đến từng nền tảng. Không có gì đặc biệt về nó. Nếu bạn có một số mã chỉ dành cho Windows, thì hãy thêm một số logic #ifdef vào tệp hoặc thêm tệp thứ hai (vì vậy bạn có FooWindows.cppFooLinux.cpphoặc bất cứ thứ gì) thực hiện tính năng đó trên các HĐH khác mà bạn quan tâm .

Công cụ xuất bản bằng một cú nhấp chuột mà một công cụ như Unity đã được cho phép vì bản thân Unity không bao giờ được sửa đổi bởi người dùng cuối. Bạn chỉ đang viết tập lệnh và dữ liệu, vì vậy công cụ có các nhị phân dựng sẵn cho tất cả các nền tảng và nút xuất bản chỉ gói các nhị phân đó cùng với dữ liệu.

Các công cụ khác dựa vào hệ thống xây dựng và trình biên dịch chéo để tạo trò chơi được biên dịch khi cần, giống như bạn làm với bất kỳ ứng dụng đa nền tảng không phải trò chơi nào.

Đối với những thứ như HTML5, có những công cụ như emscripten có thể biên dịch ứng dụng C ++ để chạy bằng JavaScript. Về cơ bản, bạn chỉ cần tạo một cổng khác cho công cụ của mình cho emscripten (vì nó không thể sử dụng bất kỳ thư viện / tính năng C ++ tùy ý nào).

Bạn không phải viết lại toàn bộ trò chơi của mình, nhưng bạn chắc chắn sẽ phải thực hiện nhiều công việc phát triển, mã hóa và chuyển cho mỗi nền tảng mới mà bạn muốn hỗ trợ.


14
Theo kinh nghiệm của tôi khi làm việc với phần mềm đa nền tảng (dự án lớn nhất sẽ là HotSpot), bạn thực sự muốn tránh việc ifdefs bị ném qua mã. Chắc chắn tốt hơn là có một cái gì đó như share/os/<linux>(hoặc share/cpu/x86) và đặt tất cả mã cụ thể của nền tảng vào đó và sau đó bao gồm điều kiện. Đó ít nhất là những gì gcc, HotSpot và nhân Linux làm được (chắc chắn không phải là một quy tắc cứng). Có, bạn có thể bắt đầu chỉ với một chức năng duy nhất phụ thuộc vào nền tảng và nghĩ rằng nó quá mức nhưng nó không bao giờ tồn tại như vậy và nó sẽ trở thành một mớ hỗn độn một cách nhanh chóng.
Voo

14

Không có viên đạn ma thuật nào ở đây. Nếu bạn muốn trò chơi của mình chạy trên nhiều nền tảng, bạn phải viết mã cho nhiều nền tảng (hoặc tận dụng các thư viện của bên thứ ba đã làm điều này cho bạn).

Những điều bạn đang yêu cầu không phù hợp: bạn nói (nhấn mạnh của tôi)

thứ tôi đang tìm kiếm là tài nguyên để tích hợp thứ gì đó sẽ cho phép tôi chạy trên các nền tảng khác nhau mà không cần viết lại

nhưng cũng vậy (nhấn mạnh của tôi một lần nữa)

Tôi biết rằng tôi có thể sử dụng một công cụ khác thay vì tự viết nhưng tôi thích trải nghiệm học tập .

Bạn sẽ phải thực hiện cái này hoặc cái khác: chọn sử dụng thư viện, công cụ và / hoặc toolchain của bên thứ ba cung cấp hỗ trợ đa nền tảng cho bạn hoặc xây dựng mã của riêng bạn bằng cách viết mã đa nền tảng (thiết kế của bạn trừu tượng riêng trên các nền tảng bạn có sẵn cho bạn và triển khai trừu tượng hóa cho từng nền tảng).

Các công cụ trò chơi như Unreal hoặc Unity hỗ trợ điều này sẽ biên dịch lại mã của bạn dựa trên sự trừu tượng hóa nền tảng phù hợp hoặc yêu cầu bạn xây dựng thư viện hoặc DLL dựa trên API nội bộ của chúng, chúng tải từ trình điều khiển cụ thể nền tảng mà chúng đã biên dịch cho phù hợp nền tảng.


2

Trái ngược với hai câu trả lời khác (đúng là C ++ - cụ thể), có một cách khác. Một số kiến ​​trúc xuất hiện trong tâm trí:

  • Cổng công cụ của bạn: Sửa đổi hoặc viết mã để nó hoạt động trên nhiều nền tảng. Điều này được giải quyết trong các câu trả lời ở trên.
  • Viết một cái gì đó phía trên một thư viện đa nền tảng: Đây là ví dụ về libGDX, chạy trên Java. Java chạy trên Máy tính để bàn, Android và iOS (thông qua RoboVM). Bằng cách sử dụng một cái gì đó như Java, bạn sẽ có được lợi ích của các nền tảng bổ sung miễn phí khi thư viện / công cụ cơ bản hỗ trợ chúng. Trong trường hợp này, khi RoboVM xuất hiện, libGDX (gần như) "chỉ hoạt động" trên iOS.
  • Viết trình tạo mã: Đây là cách tiếp cận của Haxe và các công cụ khác. Bạn có một ngôn ngữ cốt lõi (ví dụ: Haxe / AS3) và bạn viết các trình chuyển đổi tạo đầu ra cho các ngôn ngữ khác. Ví dụ. Haxe chuyển đổi sang C ++ cho Máy tính để bàn, Java (tôi nghĩ) cho Android, v.v.

Cá nhân, tôi thấy cách tiếp cận của libGDX là đơn giản nhất: tìm một ngôn ngữ hoặc nền tảng đáp ứng nhu cầu của bạn và viết lên đầu. Tạo mã và động cơ di động rất phức tạp và khó viết tốt.

libGDX thực sự là một lựa chọn tuyệt vời, vì nó đánh vào cả điện thoại di động, máy tính để bàn và web chính (thông qua các applet hoặc trình biên dịch web của Google).


Ngay cả với Java hoặc C #, bạn không nhận được mã đa nền tảng một cách kỳ diệu; bạn vẫn phải nhận thức được các thư viện bên thứ 3 có thể có phụ thuộc nền tảng (ví dụ: SlimDX hoặc SharpDX sẽ là một lựa chọn kém cho dự án C # đa nền tảng).

@JoshPetrie bạn chắc chắn nhận được rất nhiều "miễn phí" so với việc tung công cụ C ++ của riêng bạn và chuyển nó qua các nền tảng.
tro999

@ ashes999 cảm ơn vì câu trả lời, libGDX thật tuyệt vời Tôi sử dụng nó nhưng tôi sẽ viết nó để nó hoạt động đa nền tảng sau đó sử dụng CMake, tôi tham gia thử thách nhiều hơn là sử dụng thư viện hoặc công cụ hiện có
DanielCollier

2

Hiện tại tôi đang xây dựng một công cụ trò chơi đa nền tảng. Tôi đang sử dụng SDL, một thư viện đa nền tảng tuyệt vời (và mức độ phù hợp thấp) để xây dựng các ứng dụng đồ họa, để giảm bớt nỗi đau.

Tuy nhiên, ngoài điều này, có rất nhiều "mã tùy chỉnh" cho mỗi nền tảng. Điều này bạn chỉ cần có được thông qua. Tôi đã tìm thấy nó là một phần rất nhỏ trong thời gian phát triển của tôi cho đến nay, chủ yếu dành cho việc tìm kiếm tài liệu cho các hệ thống mà tôi không quen thuộc như Linux bản địa của tôi.

Tôi không khuyến khích bạn sử dụng #ifdefở mọi nơi trong suốt mã của bạn. Thay vào đó, hãy xây dựng các khái niệm trừu tượng xung quanh các nguyên hàm chính (một ví dụ về nguyên thủy như vậy có thể là ổ cắm TCP).

Khi bạn gặp phải một vấn đề mới đòi hỏi các giải pháp khác nhau cho từng môi trường, hãy tự hỏi mình "tôi có thể giải quyết vấn đề này chỉ bằng cách sử dụng các nguyên thủy đa nền tảng mà tôi đã xây dựng không?" Nếu câu trả lời là có: voila, mã đa nền tảng đơn giản. Mặt khác, hãy tìm ra những gì nguyên thủy bạn đang thiếu và thực hiện chúng.


0

Nếu bạn muốn thực hiện điều này "từ đầu" như một trải nghiệm học tập thì bạn sẽ cần sử dụng API Win32 nơi bạn có thể tìm thấy thông tin về việc mở cửa sổ và bối cảnh OpenGL trên MSDN và trên wiki OpenGL ( http: // www .opengl.org / wiki / Creation_an_OpenGL_Context_ (WGL) ). Đối với Linux, hãy lấy một bản sao cũ của Hướng dẫn lập trình O'Reilly XlibHướng dẫn tham khảo Xlib và cũng đọc trên GLX (Mở rộng OpenGL cho Hệ thống cửa sổ X). Xem thêm http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)

Sau đó, bạn chỉ cần cung cấp cùng một API cho ứng dụng của mình với các chức năng thực hiện cùng một việc (ví dụ: mở một cửa sổ) nhưng có các triển khai khác nhau cho mỗi nền tảng. Bạn viết lại các phần của công cụ của bạn cho các nền tảng khác nhau. Sau đó, một trò chơi bạn viết bằng cách sử dụng công cụ bạn chỉ phải viết một lần nhưng nó sẽ hoạt động trên các nền tảng khác nhau.


cảm ơn câu trả lời nhưng tôi chỉ muốn sử dụng SDL2 cho cửa sổ, nền tảng chéo của nó và rất dễ sử dụng. chỉ cách LibGDX sử dụng LWJGL cho cửa sổ
DanielCollier
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.