Bất kỳ lời khuyên để tạo trò chơi đa nền tảng? [đóng cửa]


Câu trả lời:


44

Ẩn mọi thứ cụ thể nền tảng đằng sau các lớp trừu tượng

Điều này có nghĩa là những thứ như kết xuất, âm thanh, đầu vào của người dùng và tệp IO. Một mẹo phổ biến để trừu tượng hóa mà không gây ra hình phạt hiệu năng trong thời gian chạy là các tiêu đề không dựa trên nền tảng với các tệp triển khai dành riêng cho nền tảng:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Sau đó định cấu hình các bản dựng cho từng nền tảng để xây dựng dựa trên tệp .cpp thích hợp.

Làm cho các đường ống nội dung của bạn được đọc trong các tài sản độc lập với nền tảng và nội dung cụ thể của nền tảng đầu ra cho mỗi nền tảng

Ví dụ: tác giả kết cấu của bạn là .tga hoặc chỉ .., Sau đó, có một đường ống có thể tự động chuyển đổi chúng sang các định dạng nền tảng cụ thể khác nhau mà bạn cần.

Đừng giả sử bố cục bộ nhớ cụ thể hoặc tuổi thọ trong dữ liệu của bạn

Các nền tảng có thể khác nhau về thứ tự byte, phần đệm, căn chỉnh và kích thước từ. Bất kỳ mã nào quan tâm đến điều đó phải được kiểm tra kỹ lưỡng trên tất cả các nền tảng.

Kiểm tra trên tất cả các nền tảng, mọi lúc

Bạn sẽ bị cắn bởi các lỗi cụ thể nền tảng. Bạn có muốn bị cắn bây giờ, hoặc ngay khi bạn đang cố gắng đưa trò chơi ra khỏi cửa?


2
thiếu #ifdef PLATFORM_WINftw
tenpn

Bạn sẽ không bao giờ thoát khỏi điều đó. Bạn chỉ có thể hy vọng để giảm thiểu nó.
khoan hồng

8
Một cách tốt để làm điều đó là di chuyển tất cả mã cụ thể của nền tảng vào một thư viện được chia sẻ có cùng giao diện, sau đó bạn có thể giới hạn # ifdef để khởi động thư viện chính xác cho nền tảng.
Neel

1
+1, bình luận tuyệt vời. Hãy nhớ rằng ngay cả STL cũng phụ thuộc vào nền tảng (và vâng, một số hàm làm những việc khác nhau trên các trình biên dịch khác nhau).
Simon

Chắc chắn gọi một chức năng bổ sung sẽ làm giảm hiệu suất? CPU phải tải hoặc di chuyển dữ liệu từ các thanh ghi hoặc tệ hơn, bộ nhớ vẫn còn chậm. Sẽ không có một cuộc gọi hệ thống đủ?
TheBlueCat

10
  • Sử dụng một api như opengl / sdl sẽ cung cấp cho bạn rắc rối tối thiểu khi đi từ nền tảng này sang nền tảng khác.

  • Hãy chắc chắn rằng bạn biết những nền tảng bạn muốn hỗ trợ. Đừng sử dụng opengl chỉ vì bạn nghĩ rằng bạn có thể muốn hỗ trợ đa nền tảng trong tương lai. Bắt đầu như bạn có nghĩa là để đi vào.

  • Biết những hạn chế phần cứng nào trên mỗi nền tảng bạn muốn hỗ trợ.


Điểm thứ hai không thể được nhấn mạnh đủ. Hãy chắc chắn rằng bạn biết trò chơi này nhắm đến ai (có nghĩa là, nếu đó là một trò chơi thông thường, bạn muốn có nó trên ít nhất là OSX và Windows, do đó OpenGL sẽ là lựa chọn tốt nhất). Đối với điểm thứ ba - và đây là lúc động cơ phát huy tác dụng - cũng rất quan trọng. Sẽ là phi logic khi sử dụng một công cụ giàu tài nguyên, giàu tính năng như Unreal để tạo ra một game DS. Vấn đề cũng liên quan đến những gì tôi đã nói liên quan đến vấn đề thứ hai: Thiết lập ai là trò chơi hướng tới. Nếu bạn đang chơi một trò chơi thông thường, hầu hết các máy tính của mọi người sẽ không xử lý, giả sử, các hạt.

7

Cố gắng tránh phân tán #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endiftất cả các mã.

Đôi khi có vẻ như đó là cách dễ dàng hơn, nhưng về lâu dài sẽ mang đến cho bạn những rắc rối. Bạn nên cố gắng giới hạn chúng vào tệp riêng của chúng để mọi hoạt động triển khai nền tảng đều được khép kín.

Thêm một nền tảng nên chủ yếu là về việc thêm các tệp triển khai mới và chỉ cần sửa đổi một vài cái cần thiết hiện có.


4

Có rất nhiều thư viện tự đa nền tảng; bạn không cần phải viết trực tiếp trong OpenGL để chạy ở bất cứ đâu. OGRE là một ví dụ tuyệt vời về công cụ kết xuất hoạt động trên mọi nền tảng mà bạn quan tâm để đặt tên.

Theo kinh nghiệm của tôi, mối quan tâm lớn nhất là hệ thống xây dựng của bạn. Nếu bạn phát triển trên Windows với Visual Studio, của bạn có thể biên dịch trong Linux, nhưng bạn sẽ gặp khó khăn khi xây dựng nó dễ dàng. Nhìn vào các hệ thống xây dựng như CMake có thể sử dụng cùng một hướng dẫn xây dựng để tạo các tệp dự án dành riêng cho nền tảng (tệp tạo tệp trên linux, Dự án VS trên windows, Dự án XCode trên Mac, v.v.).


4

Khi viết các chức năng của bạn để lưu và tải tệp, hoặc liên lạc qua mạng, đừng quên về tuổi thọ .

Thay vì đọc một cấu trúc lớn với một lệnh gọi fread / fwrite hoặc một mức độ thấp như thế, hãy tạo một ReadByte / WriteByte và ReadFloat / WriteFloat. Sau đó, bạn sẽ có ít địa điểm hơn để thực hiện thay đổi nếu bạn quyết định nhắm mục tiêu một nền tảng khác sau này.


+1 * 9000. Tôi đoán điều này thực sự sẽ chỉ áp dụng cho điện thoại di động về mặt kiến ​​trúc hiện đại / được sử dụng (RISC); nhưng vẫn rất quan trọng
Jonathan Dickinson
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.