Tăng Tốc Quy Trình Build Game Unity3D Bằng Kỹ Thuật Nén Texture Phân Tán - nói dối e blog

Tăng Tốc Quy Trình Build Game Unity3D Bằng Kỹ Thuật Nén Texture Phân Tán

Quy trình build game trên Unity3D, ai dùng rồi cũng hiểu nỗi khổ!

Vì việc build package iOS bắt buộc phải thực hiện trên môi trường Xcode chạy hệ điều hành macOS, nên để phục vụ việc build định kỳ, chúng tôi đã đầu tư mua những chiếc máy Mac Pro cấu hình cao. Mỗi bộ máy như vậy có giá khoảng 30.000 Nhân dân tệ.

Tuy nhiên, tôi nhận thấy phương án này không mang lại hiệu quả kinh tế tối ưu.

Sau khi phân tích kỹ lưỡng, tôi phát hiện khâu chậm nhất trong toàn bộ quy trình chính là quá trình nén texture. Với mỗi nền tảng khác nhau, hệ thống cần chuyển đổi các file texture gốc thành định dạng nén tương ứng: định dạng PVR cho iOS, ETC cho Android, v.v.

Unity cũng nhận thức rõ vấn đề này và đã cung cấp giải pháp CacheServer.

Về bản chất, CacheServer là một hệ thống lưu trữ cache tập tin, sử dụng chuỗi MD5 được tạo từ các yếu tố: file texture gốc, thông số chuyển đổi (lấy từ file meta của Unity), và phiên bản công cụ chuyển đổi để làm chỉ mục tra cứu.

Khi một developer thực hiện chuyển đổi đầu tiên, kết quả sẽ được tải lên CacheServer. Những người sau khi gặp yêu cầu tương tự có thể lấy trực tiếp kết quả đã được xử lý trước đó, tránh việc xử lý lặp lại. Khi cả file nguồn và thông số chuyển đổi hoàn toàn trùng khớp, kết quả sẽ được cache. Trong thực tế, vì hầu như toàn bộ texture đã từng được xử lý qua, điều này giúp giảm đáng kể thời gian build định kỳ.

Tuy thiết kế đơn giản, CacheServer vẫn chưa giải quyết triệt để vấn đề. Khi build đa nền tảng, chúng ta vẫn phải dành thời gian xử lý các định dạng chưa từng gặp. Ví dụ, nếu trong quá trình phát triển hàng ngày chỉ tập trung vào Android, khi build bản iOS vẫn phải xử lý định dạng PVR từ đầu.

Hạn chế của CacheServer nằm ở việc chỉ lưu trữ kết quả cuối cùng mà không tự động tạo ra các phiên bản nén cho nhiều nền tảng khác nhau. Đồng thời, việc lưu hash thay vì thông số chi tiết khiến mất đi khả năng phân tích sâu. Thêm nữa, cách triển khai hiện tại còn khá thô sơ.

Một vấn đề nữa là quá trình import texture vào Unity đòi hỏi máy tính cục bộ phải thực hiện hàng loạt tác vụ nén, gây tiêu tốn tài nguyên CPU. Tình trạng máy bị lag vài giây khi import texture là điều thường xuyên xảy ra, ảnh hưởng nghiêm trọng đến trải nghiệm làm việc.

Từ những phân tích trên, tôi quyết định xây dựng giải pháp nén texture từ xa.

Unity sử dụng công cụ dòng lệnh PVRTexTool của PowerVR để nén texture. May mắn thay, công cụ này có phiên bản Linux, mở ra khả năng sử dụng các máy chủ Linux giá rẻ thay vì phải đầu tư máy Mac đắt đỏ.

Giải pháp đơn giản nhất là thay thế công cụ PVRTexTool cục bộ bằng cơ chế upload texture gốc lên máy chủ từ xa, thực hiện nén trên đó rồi trả kết quả về. Sau khi cải tạo, tác vụ tiêu tốn CPU nhất trong quy trình build đã được chuyển khỏi máy cục bộ. Thử nghiệm cho thấy, chỉ với máy chủ Linux 8 nhân trung bình, thời gian build trên Mac Mini đã nhanh hơn 30% so với máy Mac Pro 4 nhân. Trong thực tế, với số tiền bằng một nửa để mua Mac Pro, chúng ta có thể sở hữu máy chủ 32 nhân mạnh mẽ hơn nhiều.

Điểm vượt trội khác của hệ thống từ xa này là khả năng ghi nhận đầy đủ thông tin về texture gốc và thông số nén. Chúng tôi đã xây dựng script chạy vào ban đêm, phân tích các yêu cầu nén trong ngày, thay đổi tham số “-f” để tạo ra các phiên bản nén cho mọi nền tảng. Điều này khắc phục hoàn toàn hạn chế của CacheServer trong việc tạo tự động đa định dạng.

Không chỉ áp dụng cho máy build, công cụ này còn có thể triển khai trên máy tính của developer, giúp quá trình import texture mượt mà hơn đáng kể (không còn tình trạng máy bị lag do xử lý nén cục bộ).

Tôi đã dành một cuối tuần để xây dựng công cụ nhỏ này trên nền tảng Skynet. Mã nguồn có thể tìm thấy trong kho GitHub cá nhân. Vì là dự án cá nhân nên tôi không cung cấp tài liệu triển khai chi tiết hay hỗ trợ kỹ thuật. Tuy nhiên, nếu studio game nào quan tâm muốn triển khai mà không muốn tự nghiên cứu, tôi có thể cung cấp dịch vụ hỗ trợ kỹ thuật một lần với phí hợp lý.

0%