Vấn Đề Chuyển Đổi Từ Fbx Sang Gltf
Định dạng tài nguyên được sử dụng trong engine game của chúng tôi là gltf 2.0. Trong vài năm gần đây, định dạng gltf phát triển rất nhanh chóng và được đánh giá là chuẩn hóa tốt nhất trong các định dạng tệp 3D. Tuy nhiên, trong ngành công nghiệp game, các công cụ thiết kế quen thuộc với nghệ sĩ như 3ds Max và Maya vẫn còn tồn tại một số hạn chế trong hỗ trợ định dạng này. Autodesk gia nhập tổ chức Khronos với tư cách thành viên contributor vào năm 2019, và theo thông tin chính thức thì tính năng hỗ trợ gltf trong các công cụ của Autodesk như Max và Maya đang trong giai đoạn Under Review (xem xét) vào cuối tháng 3/2020. Chúng tôi kỳ vọng sẽ sớm được sử dụng phiên bản chính thức trong năm nay.
Do sự phổ biến của Unity, định dạng fbx hiện đang là chuẩn thực tế trong ngành game. Tuy nhiên, fbx là định dạng độc quyền không có tài liệu kỹ thuật công khai. Thiết kế định dạng này mang nhiều gánh nặng lịch sử, thậm chí tên các trường dữ liệu còn chứa lỗi chính tả, khiến trình phân tích phải xử lý nhiều biến thể lỗi để đảm bảo tương thích ngược. Khi quyết định sử dụng gltf cách đây hơn một năm, chúng tôi đã chuẩn bị tinh thần cho giai đoạn chuyển tiếp này và tập trung phát triển công cụ chuyển đổi từ fbx sang gltf.
Dù có vẻ nhiều lựa chọn, các công cụ chuyển đổi fbx sang gltf thực tế đều gặp phải vấn đề này khác. Dưới đây là tổng kết các giải pháp chúng tôi đã thử nghiệm:
Ban đầu, chúng tôi sử dụng thư viện assimp. Tuy nhiên, khi một mô hình phức tạp gặp lỗi chuyển đổi, tôi bắt đầu thử sửa bug cho assimp và đọc mã nguồn module nhập fbx của nó. Quá trình này cho thấy assimp khá cồng kềnh, chất lượng module fbx importer không cao. Thực tế, định dạng fbx không quá phức tạp, nhưng assimp lại áp dụng các phương pháp phức tạp (có lẽ do phải giải quyết các vấn đề khó hơn) để xử lý một vấn đề không quá phức tạp.
Đồng thời, tôi nhận thấy tốc độ biên dịch assimp quá chậm, thậm chí vượt quá toàn bộ thời gian biên dịch dự án engine. Ngoài ra, còn tồn tại nhiều vấn đề xây dựng trên môi trường mingw/gcc. Các pull request tôi đóng góp cho assimp chủ yếu tập trung giải quyết lỗi biên dịch trên mingw.
Cuối cùng, chúng tôi quyết định từ bỏ assimp. Vẫn còn một vấn đề tồn đọng lúc đó: khi xây dựng phiên bản DLL trên Windows, số lượng ký hiệu C++ xuất ra vượt quá giới hạn 64K khiến quá trình liên kết thất bại. Chúng tôi buộc phải vô hiệu hóa một số định dạng tệp ít dùng để giải quyết vấn đề này.
Trong một giai đoạn ngắn sau đó, dựa trên kiến thức thu được khi nghiên cứu mã nguồn fbx encoder của assimp, tôi thử tự viết một module phân tích fbx cho Lua. Vì gltf sử dụng cấu trúc dữ liệu json, tôi cho rằng chỉ cần tải được cấu trúc dữ liệu fbx vào bảng Lua thì việc chuyển đổi sang gltf sẽ không quá phức tạp.
Tuy nhiên, tôi sớm từ bỏ dự án này. Lý do là dù việc phân tích fbx không khó, nhưng quá trình chuyển đổi cấu trúc dữ liệu lại cực kỳ phức tạp và dễ sót trường hợp. Đây cũng chính là nguyên nhân dù thế giới đã có nhiều công cụ chuyển đổi mã nguồn mở, nhưng khi dùng thực tế vẫn gặp vấn đề. Việc tự xây dựng một dự án mới với nguồn lực hạn chế là không khả thi, bởi chúng tôi đang tập trung phát triển engine game chứ không phải công cụ chuyển đổi định dạng 3D.
Sau quá trình khảo sát kỹ lưỡng, chúng tôi chọn FBX2glTF do Facebook phát triển. Lúc đó, sản phẩm từ công ty lớn được kỳ vọng có chất lượng ổn định. Đến cuối năm 2019, dự án vẫn còn hoạt động sôi nổi (phiên bản 0.9.7 mới nhất được phát hành tháng 9/2019). Tiếc rằng sau đó Facebook dường như ngừng duy trì.
Trong năm sử dụng, chúng tôi phát hiện một vài lỗi nhỏ. Tuy nhiên do upstream ngừng hợp nhất PR, chúng tôi đành duy trì một fork riêng. Gần đây, khi các dự án sử dụng engine tự phát hiện thêm nhiều lỗi mới trong quá trình chuyển đổi, tôi quyết định tìm giải pháp thay thế.
Hiện tại, chúng tôi chuyển sang sử dụng Blender để chuyển đổi từ fbx sang gltf. Là một dự án mã nguồn mở, Blender rất thân thiện với nhà phát triển. Công cụ này có thể chạy dễ dàng qua dòng lệnh với script Python tích hợp, không cần khởi động giao diện đồ họa. Thư viện nhập/xuất gltf chính thức duy nhất cũng chính là plugin dành cho Blender.
Blender hỗ trợ fbx rất tốt. Tài liệu kỹ thuật chi tiết nhất về định dạng fbx (không chính thức) hiện do cộng đồng Blender duy trì.
Tuyển dụng
Dự án game của chúng tôi đã khởi động, hiện cần tuyển một lập trình viên. Địa điểm làm việc tại Quảng Châu, thuộc biên chế chính thức của Alipay Interactive Entertainment, cấp bậc tương đương P6. Công việc chủ yếu là phát triển game di động trên nền tảng engine tự phát triển.
Do engine chỉ cung cấp giao diện Lua, ứng viên cần thành thạo và yêu thích ngôn ngữ này. Vì engine chưa hoàn thiện hoàn toàn, sẽ có một số công việc底层 (tối ưu hóa?), đồng thời cần phát triển module C/C++ do Lua là ngôn ngữ nhúng. Ứng viên cần có khả năng lập trình C/C++.
Ngoài ra, engine sử dụng nhiều dự án mã nguồn mở. Công việc hàng ngày sẽ liên quan đến biên dịch và xây dựng các thư viện này, do đó ứng viên cần khả năng tự giải quyết các vấn đề phát sinh trong quá trình build, cũng như thành thạo git.
Nếu bạn quan tâm, vui lòng liên hệ qua email được công bố trên blog của tôi.
Dù mức lương của vị trí này có thể không đặc biệt hấp dẫn, tôi tin tưởng Alipay Interactive Entertainment có thể mang lại một nền tảng phát triển tốt. Là người dẫn dắt nhóm, triết lý tôi theo đuổi 2 năm qua là: Tăng hiệu suất làm việc trong giờ hành chính, không lấy thời gian làm việc bù đắp cho hiệu suất thấp. Nhóm chúng tôi đã duy trì 2 năm không tăng ca, làm việc 8 tiếng/ngày, 5 ngày/tuần và sẽ tiếp tục giữ vững văn hóa này.