Bạn có bất cứ lời khuyên / đề xuất nào khi tạo trò chơi đa nền tảng trong C / C ++ không?
Bạn có bất cứ lời khuyên / đề xuất nào khi tạo trò chơi đa nền tảng trong C / C ++ không?
Câu trả lời:
Ẩ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?
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ợ.
Cố gắng tránh phân tán #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endif
tấ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ó.
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, mã 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.).
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.
#ifdef PLATFORM_WIN
ftw