Nếu Phát Triển Một Engine 3D Mới Từ Đầu - nói dối e blog

Nếu Phát Triển Một Engine 3D Mới Từ Đầu

Nếu bắt đầu xây dựng một engine 3D mới từ đầu
Gần đây tôi có chút thời gian rảnh. Trong những lúc suy nghĩ ngắt quãng, tôi tự hỏi liệu có nên thử làm một dự án nguồn mở vào thời gian rảnh hay không, chủ đề nào vừa thú vị vừa phù hợp với bản thân. Suy đi tính lại, phát triển một engine 3D có vẻ là lựa chọn hợp lý. Theo quan điểm của tôi, một dự án muốn thu hút được sự tham gia của các lập trình viên giàu kinh nghiệm thì trước tiên nó phải có giá trị thực tiễn. Dự án cần dễ thiết lập môi trường làm việc và tạo ra kết quả trực quan ngay lập tức để duy trì sự hứng thú cho việc phát triển dài hạn. Giai đoạn đầu nhất định phải tự mình thực hiện, xây dựng một bản mẫu cơ bản, do đó cần chọn lĩnh vực mà bản thân đã từng nghiên cứu sâu.

Nói về lĩnh vực quen thuộc, những năm gần đây tôi chủ yếu tập trung vào kiến trúc và triển khai hệ thống server game. Tuy nhiên mảng này không phù hợp lắm để làm dự án nguồn mở vì phạm vi ứng dụng quá hẹp (ít người có nhu cầu tự xây dựng server game) và không thể chạy độc lập để thấy kết quả. Một server game không có người chơi rõ ràng là vô nghĩa.

Còn về engine 3D, dù đã có kinh nghiệm phát triển trong thời gian qua nhưng dự án công ty đương nhiên không thể mở mã nguồn. Nếu muốn thử sức, bắt đầu từ đầu là lựa chọn duy nhất. Hơn nữa việc tự xây dựng lại từ đầu lại mang đến niềm vui đặc biệt - vốn là nguồn cảm hứng bất tận của các lập trình viên khi “chế tạo lại bánh xe”. Nếu mục tiêu chỉ là thỏa mãn bản thân thì không cần lo lắng quá nhiều về các vấn đề mà engine thương mại phải đối mặt: hỗ trợ đa dạng API đồ họa底层, tương thích mọi nền tảng, chạy tốt trên thiết bị yếu hay thậm chí là chống hack phức tạp.

Khi tôi bàn về chủ đề phát triển engine trên Buzz hôm qua, bạn miloyip đã nhanh chóng chia sẻ nhiều ý tưởng đã tích lũy qua thời gian dài suy tư. Anh ấy đưa ra danh sách rất đầy đủ các tính năng engine cần có. Tuy nhiên góc tiếp cận của tôi lại khác. Tôi quan tâm nhiều hơn đến việc: làm sao để một dự án nguồn mở có thể khởi động với chi phí thấp nhất, từ đó phát triển tự nhiên? Đặt tiêu chuẩn chất lượng và tính năng ở mức cao là điều nên làm, nhưng phải bắt đầu từ một tập nhỏ chức năng cốt lõi. Vì đây là dự án phi thương mại nên không bị áp lực tiến độ hay bắt buộc phải thêm tính năng cho nhu cầu đặc thù. Mọi thứ đều phải xuất phát từ nguyên tắc “vui là chính”. Miễn là viết code thấy hào hứng thì dự án đã thành công một nửa.

Sau cả đêm suy nghĩ, tôi hình dung dự án sẽ được triển khai như sau:
Tôi đặc biệt ưa chuộng công cụ quản lý phiên bản Git gần đây, và nếu phải chọn giữa Google Code và GitHub thì tôi nghiêng về GitHub.
Về ngôn ngữ lập trình, tôi muốn kết hợp C và Lua. Đây là hai ngôn ngữ tôi thành thạo nhất, sử dụng rất trơn tru. Dù C++ cũng nằm trong vùng an toàn của tôi và tiện hơn C ở nhiều khía cạnh - đặc biệt khi sử dụng API đồ họa D3D, nhưng tôi đã có nhiều năm kinh nghiệm xây dựng hệ thống lớn bằng C và tự tin có thể bù đắp những hạn chế của ngôn ngữ này. Lua sẽ trở thành đối tác hoàn hảo bổ sung cho C.

Cốt lõi engine sẽ được viết bằng C dưới dạng thư viện, sau đó được bao bọc bởi lớp wrapper Lua để phát triển ứng dụng cấp hai. Nếu cần giao diện không phải Lua (ví dụ dùng QT/C++ xây dựng công cụ), có thể lựa chọn: hoặc truy cập qua lớp Lua, hoặc phát triển thêm một lớp mỏng C++ riêng. Không cần quá quan tâm đến hiệu năng của lớp kết nối, nhưng phải đảm bảo thiết kế tách biệt rõ ràng giữa lớp này và thư viện cốt lõi.

Về API đồ họa, tạm thời chỉ hỗ trợ DX11, OpenGL có thể xem xét sau. Tuy nhiên cần để lại không gian mở trong mã nguồn. Về mã hóa, giai đoạn đầu không nên viết quá nhiều, cần chuẩn bị tinh thần cho ít nhất một lần tái cấu trúc. Do tôi chưa có nhiều kinh nghiệm chuyên sâu trong lĩnh vực 3D, nên giai đoạn đầu chỉ cần tập trung vào những phần thiết yếu nhất.
Công cụ xây dựng dự án sẽ dùng GNU Make - công cụ tôi đã thành thạo và phổ biến rộng rãi. Không bắt buộc mọi thành viên đều phải hiểu rõ GNU Make, toàn bộ khung sườn có thể do một người xây dựng trước.
Trình biên dịch chọn GCC, có thể cân nhắc hỗ trợ biên dịch bằng Visual C++.

Về chức năng, các module như Audio/GUI/Input/Network không cần thiết trong giai đoạn đầu. Không cần thiết kế phần quản lý cửa sổ phức tạp, nhưng phải xây dựng được môi trường chạy thử nghiệm cơ bản: cửa sổ khởi động đơn giản, giao diện GUI cố định (không tùy biến), hệ thống log trực quan. Các công cụ hỗ trợ phát triển nên được ưu tiên ở giai đoạn sau.

Còn về các tính năng engine sẽ hỗ trợ, đây là việc cần làm từng bước. Dù khả năng mở rộng của hạ tầng kỹ thuật ảnh hưởng lớn đến việc thêm tính năng mới, nhưng theo tôi, bắt đầu từ dự án nhỏ và dần hoàn thiện thông qua tái cấu trúc là cách tiếp cận thực tế hơn cả.

Hiện tại vẫn còn một số việc chưa giải quyết được:

  • Chưa nghĩ ra tên dự án và biệt danh phù hợp
  • Thiếu hiểu biết chi tiết về xu hướng phát triển công nghệ 3D gần đây, dẫn đến khó khăn trong thiết kế nền tảng
  • Vẫn chưa đủ quyết tâm để chính thức khởi động dự án
0%