Các công ty như Valve quản lý phát hành trò chơi cho cả ba nền tảng trò chơi lớn như thế nào? Tôi quan tâm đến các phương pháp hay nhất về chia sẻ mã cụ thể giữa Windows, Xbox360 và PS3, vì giải pháp lý tưởng là sử dụng lại nhiều mã nhất có thể thay vì viết lại toàn bộ mọi thứ cho mọi nền tảng.Tôi làm cách nào để tìm hiểu về phát triển trò chơi nền tảng chéo?
Trả lời
Không khác gì viết mã độc lập với nền tảng trong các ngữ cảnh khác. Ẩn chi tiết nền tảng cụ thể (đầu vào, tương tác cửa sổ, vòng lặp sự kiện chính, luồng, v.v) phía sau các giao diện chung và kiểm tra thường xuyên trên tất cả các nền tảng bạn định hỗ trợ.
Lưu ý rằng mô hình luồng của ô là không bình thường, đủ để thực hiện việc xử lý luồng "chung". Tôi không phải là nhân viên của Valve và tôi không biết bí mật của họ, nhưng đó là sự hiểu biết của tôi rằng hầu hết các nhà phát triển game muốn nhắm mục tiêu PS3 sử dụng hàng đợi công việc mà bộ xử lý riêng lẻ lấy nhiệm vụ khi cần. Điều này không nhất thiết phải là cách tốt nhất để sử dụng Cell, nhưng nó phổ biến độc đáo cho các mô hình luồng thông thường hơn (như, frex, một cái mà PC và cả 360 đều sử dụng).
Một vài năm trước, Giám đốc điều hành Opera đã nói trong một cuộc phỏng vấn rằng chìa khóa để phát triển cho nền tảng độc lập là di chuyển ra khỏi bất kỳ thư viện hệ điều hành/nền tảng nào. Anh tiếp tục và nói rằng họ đã phát triển các thư viện riêng của họ để cải thiện hiệu suất hệ điều hành.
Giả định của tôi là các công ty lớn sẽ có chung, Xbox, PS, cửa sổ, FooOS, các nhóm riêng biệt. Mỗi nền tảng cần được tinh chỉnh khác nhau và yêu cầu các phương pháp triển khai khác nhau. Tôi không nghĩ rằng họ làm một nguồn cho tất cả các nền tảng; thay vào đó, họ xây dựng một hệ điều hành cho từng hệ điều hành, nâng cao hiệu quả. Tôi nhớ EA đã từng phát hành một số game console sớm hơn các phiên bản PC và ngược lại.
Một vấn đề khác là các bàn giao tiếp khác nhau có phần cứng khác nhau, do đó yêu cầu các kỹ thuật lập trình khác nhau.
có hai thái cực, xây dựng một nguồn phù hợp với tất cả (ví dụ java) nhưng bạn chạy nguy cơ không hiệu quả hoặc viết 40 phiên bản; một cái được tối ưu hóa cho mỗi nền tảng
Quay lại khi tôi có một người bạn trong các trò chơi máy tính giáo dục (trước khi Công ty Học tập đào tạo lĩnh vực này), ông là một người hâm mộ tuyệt vời tạo các thư viện đa nền tảng để làm mọi thứ.
Trò chơi này dễ dàng hơn các ứng dụng khác. Ví dụ: nếu bạn có ứng dụng xử lý văn bản chạy trên Mac và Windows, nó thực sự cần phải xem và hoạt động như ứng dụng Mac trên máy Mac và ứng dụng Windows trên Windows. Viết một trò chơi, và nó không phải phù hợp với hành vi bản địa, nhìn và cảm nhận.
Có một loạt các bài viết về Tạp chí dành cho nhà phát triển trò chơi và các cuộc hội đàm GDC về chủ đề này. Thực tế, kể từ khi bạn đề cập đến Valve, they delivered a talk describing their approach tại GDC08.
Đây thực sự là một vấn đề rất lớn mà tôi có thể (và có) nói về hàng giờ đồng hồ sau khi giờ, nhưng tóm tắt thang máy là:
- Xác định các bộ phận của động cơ là hoàn toàn nền tảng cụ thể và đặt chúng đằng sau một trừu tượng. Ví dụ: tải tệp và nội dung, cần được viết lại cho mỗi bảng điều khiển; nhưng bạn có thể ẩn đằng sau giao diện IFileSystem cung cấp một API thống nhất mà mã trò chơi nói đến.
- PS3 làm cho điều này trở nên khó khăn vì điểm trừu tượng của nó phải ở một nơi hoàn toàn khác với các nền tảng khác. Ngay cả các tính năng trò chơi như va chạm và nav sẽ phải được viết khác nhau cho các tế bào.
- Cố gắng giữ mã trò chơi lá (thực thể, AI, sim) làm nền tảng bất khả tri ...
- Nhưng chấp nhận rằng ngay cả mã trò chơi nhiều nhất cũng cần một số nền tảng cụ thể cho perf hoặc memory hoặc lý do TCR. Rất nhiều UI sẽ phải được viết lại bởi vì các nhà sản xuất có các yêu cầu chứng nhận mâu thuẫn nhau.
- Bất cứ ai nói những từ "Tôi không lo lắng về hiệu suất" hoặc "bộ nhớ không phải là vấn đề" sẽ không nằm trong bảng lương.
Nếu bạn muốn ví dụ nguồn mở, bạn có thể xem mã nguồn của động cơ Quake 1, 2 và 3. Chúng được cấu trúc khá bền vững. (Tất nhiên, không có ps3 hoặc hỗ trợ xbox360, nhưng nguyên tắc tương tự áp dụng)
Câu hỏi này có thể được chia ra thành hai câu hỏi riêng biệt. "Làm thế nào tôi có thể viết mã di động?" và "Yêu cầu khác nhau của nền tảng chơi game chính thống là gì?".
Câu hỏi đầu tiên tương đối dễ trả lời. Các phương pháp hay nhất để tóm tắt mã không phải di động của bạn được đề cập đến trong Viết mã di động: http://books.google.ca/books?id=4VOKcEAPPO0C&printsec=frontcover
Lý thuyết chuyển thành thực tiễn, mã nguồn Quake 3 thực hiện công việc khá tốt khi phân chia các nền tảng khác nhau thành các khu vực riêng biệt cho một codebase C, có sẵn tại http://www.idsoftware.com/business/techdownloads/ Tuy nhiên, nó không thể hiện các mẫu C++ như giao diện trừu tượng, được triển khai một lần trên mỗi nền tảng.
Phần thứ hai của câu hỏi của bạn, "Yêu cầu khác nhau của nền tảng trò chơi chính thống là gì?" là khó khăn hơn. Tuy nhiên, đáng chú ý là các khu vực thay đổi lớn nhất của bạn vẫn là trình kết xuất đồ họa, hệ thống phụ âm thanh và mạng của bạn.
Mỗi nền tảng bảng điều khiển có một loạt yêu cầu chứng nhận, có sẵn theo thỏa thuận với chủ sở hữu bảng điều khiển tương ứng. Yêu cầu về tính nhất quán trong trải nghiệm người dùng và không tập trung vào các vấn đề về trò chơi hoặc chất lượng, cấp cao. Ví dụ: trò chơi của bạn có thể cần hiển thị màn hình tải động thú vị hợp lý và màn hình đen không thể chấp nhận được.
Bắt tay bạn vào tài liệu này càng sớm càng tốt là chìa khóa để đưa ra lựa chọn đúng trong việc phát triển cho một nền tảng giao diện điều khiển cụ thể.
Cuối cùng, nếu bạn không thể đưa tay lên bộ điều khiển, tôi khuyên bạn nên chuyển mã của mình sang máy Mac từ Windows. Mac giúp bạn có một cổng OS đảm bảo bạn không bị ràng buộc với Windows cũng như một cổng xử lý nếu bạn hỗ trợ các tệp nhị phân phổ quát. Điều này đảm bảo mã của bạn là thuyết bất khả tri cuối cùng.
Nếu bạn hỗ trợ cả PC và Mac, bạn sẽ được định vị tốt để hỗ trợ nền tảng thứ ba, nếu bạn có quyền truy cập vào nó trong tương lai.
Phụ Lục Bạn đã viết:
giải pháp lý tưởng là để tái sử dụng càng nhiều mã càng tốt thay vì viết lại toàn bộ điều cho mỗi nền tảng
Trong nhiều kịch bản trò chơi porting, giải pháp lý tưởng là không phải để sử dụng lại nhiều mã nhất có thể, nhưng để viết mã tối ưu cho mỗi nền tảng.Một mục tiêu hợp lý hơn là nhằm mục đích cho nội dung mẫu số chung thấp nhất chạy trên tất cả các nền tảng mà không sửa đổi (một giai đoạn xây dựng gói nội dung cho phương tiện truyền thông được rồi).
Thật tuyệt vời khi phát triển đồng thời. Bạn tìm thấy tất cả các loại lỗi mà bạn sẽ không tìm thấy chỉ làm một nền tảng.
Tôi nhớ rằng các lập trình viên trong DOS đã có con trỏ null tất cả các thời gian vì ghi vào bộ nhớ thấp đã không ngay lập tức sụp đổ chúng. Khi bạn chuyển sang một Amiga, Atari ST, hoặc Macintosh, bùng nổ! Tôi nhớ đã nói với một lập trình viên DOS rằng anh ta đã có một vài con trỏ null trên một trò chơi được chuyển vùng. Anh nghĩ trong vài giây và cười toe toét, "Điều đó giải thích một vài điều."
Giờ đây, trò chơi có ngân sách lớn như vậy, điều quan trọng là gửi tất cả cùng một lúc để bạn không lãng phí tiếp thị và ngân sách quảng cáo.
Lời khuyên của tôi về phát triển đồng thời là chọn một nền tảng chính, nhưng không bao giờ để các nền tảng khác nhận được hơn một tuần sau. Nó sẽ trở nên rõ ràng khi bạn lập trình mà các phần của mã là phổ biến cho tất cả các nền tảng và đó là khác nhau. Kéo ra những khác biệt thành một hoặc nhiều lĩnh vực cụ thể cho nền tảng.
Trải nghiệm của tôi có trong C/C++. Đó là một vấn đề lớn hơn nếu bạn phải chống lại các ngôn ngữ khác nhau (ví dụ, Java và Objective-c).
"Bất kỳ ai nói những từ" Tôi không lo lắng về hiệu suất "hoặc" bộ nhớ không phải là vấn đề "sẽ không nằm trong bảng lương." Đáng buồn nhưng là sự thật. Đối với hầu hết các loại phần mềm, những người này có thể là một trợ giúp lớn nếu quan điểm của họ giúp họ viết mã đúng một cách nhanh chóng. Trong phát triển trò chơi, chúng là chất độc: - / –