Động Cơ 3D Và Sự Thiếu Hụt Của Lớp Trung Gian
Chúng tôi đã phát triển động cơ game được một năm rưỡi, trong đó phần động cơ 3D được thực hiện gần một năm.
Một động cơ tốt luôn dễ dàng trong việc xây dựng phần rendering. Bởi vì vấn đề cần giải quyết tương đối tập trung, tài liệu phong phú, các thách thức kỹ thuật cũng rất cụ thể. Ngay cả khi một số vấn đề chưa thể giải quyết ngay, việc trì hoãn cũng không ảnh hưởng lớn. Trong nhóm của chúng tôi có hai đồng nghiệp từng hoàn thành các dự án động cơ 3D từ đầu, do đó trong thiết kế giao diện rendering, chúng tôi cũng tránh được nhiều sai lầm nghiêm trọng. (Dù vậy, thực tế phần rendering cũng đã trải qua nhiều lần sửa đổi do phải viết lại các thành phần nền tảng.)
Gần đây, phần động cơ 3D lại đối mặt với một đợt tái cấu trúc lớn. Nguyên nhân bắt nguồn từ kiến trúc ban đầu của toàn bộ client engine. Trong giai đoạn đầu, chúng tôi không đặt ngôn ngữ kịch bản nhúng vào vị trí ưu tiên hàng đầu. Mãi đến nửa năm sau khi dự án khởi động, tôi mới chính thức bắt tay vào phát triển ngôn ngữ nhúng. Trong khi đó, các cấu trúc底层 và động cơ 3D đều được xây dựng song song trong giai đoạn này.
Có thể nói, cả phần kịch bản và 3D đều nằm ở tầng tương đương trong kiến trúc game engine.
Tuy nhiên, những thay đổi gần đây trong tư duy thiết kế cùng việc bắt đầu phát triển logic game đã khiến tôi nhận ra những điểm thiếu sót. Trong các dự án trước đây, do chủ yếu làm game 2D dễ kiểm soát hơn, và phần lớn tôi tập trung vào hạ tầng đồ họa cũng như giao diện người dùng, nên lần này khi xây dựng một động cơ game toàn diện, tôi đã chưa suy xét đầy đủ. Hay nói cách khác, những game trước đây tôi tham gia đều chưa có một động cơ hoàn chỉnh.
Vấn đề lớn nhất hiện tại là: Khi logic game và động cơ rendering nằm ở hai tầng khác nhau, liệu có cần một lớp trung gian nào khác kết nối chúng? Hiện tại, ý tưởng của chúng tôi là cần có một lớp kết nối, nhưng việc xác định chính xác chức năng của lớp này lại vô cùng khó khăn.
Trong giai đoạn đầu của dự án, chúng tôi chọn cách để ngôn ngữ kịch bản có thể điều khiển trực tiếp rendering 3D. Phương pháp này mang lại tính linh hoạt cao, và theo cách đó, chúng tôi đã nhanh chóng xây dựng một demo 3D trong vòng một tuần. Tuy nhiên, hiện tại chúng tôi không muốn tiếp tục theo hướng này nữa. Bởi game không phải là demo, và logic game mà chúng tôi hướng đến sẽ phức tạp hơn nhiều.
Theo suy nghĩ của tôi, một lớp trung gian hợp lý nên sử dụng ngôn ngữ động làm chất kết nối, kết hợp với C làm nền tảng rendering底层. Lớp trung gian này không nên can thiệp vào các yếu tố logic game như HP của nhân vật, mà cần tập trung vào các vấn đề như mối quan hệ không gian giữa các đối tượng, phân cấp logic, chuyển tiếp thông điệp, quản lý tài nguyên… Một lớp trung gian tốt cần ẩn giấu thông tin của tầng rendering, cho phép thay thế dễ dàng giữa rendering 3D, 2D, thậm chí là giao diện tương tác dạng văn bản.
Dựa trên tư tưởng này, gần đây tôi đã viết lại một framework trung gian đơn giản, đồng thời xây dựng một tầng rendering 2D tương thích với nó. Sau đó, tôi thử nghiệm tích hợp rendering 3D vào khuôn khổ này. Mọi thứ vẫn đang trong giai đoạn khám phá. Hiện tại, phần 2D hoạt động khá mượt mà, còn phần 3D vẫn chưa hoàn thiện. Khác biệt lớn so với nhiều dự án trước đây là lần này ngôn ngữ động được tích hợp sâu hơn vào hạ tầng engine, thay vì dùng C++ làm chất kết nối, chúng tôi chuyển sang kết hợp thuần C với ngôn ngữ động. Đây có lẽ là thay đổi lớn nhất trong tư duy lập trình của tôi trong năm qua.