Tại sao phải sử dụng Addressables?
Tóm tắt
Hệ thống Addressables của Unity là một hệ thống quản lý tài nguyên động (dynamic). Nó được xây dựng dựa trên nền tảng công nghệ AssetBundles của Unity đồng thời cung cấp các công cụ ngay bên trong Unity Editor để giúp bạn chuẩn bị tài nguyên để load theo yêu cầu. Bất kể nội dung nào dù trên thiết bị hay trên cloud.
Trong hướng dẫn này, bạn sẽ có một cái nhìn tổng quan về cách tiếp cận của Unity đối với việc quản lý tài nguyên động, các lợi ích mà Addressables mang lại.
Bài hướng dẫn này bạn sẽ:
- Định nghĩa thế nào là quản lý tài nguyên động
(dynamic asset management) - Giải thích khái niệm AssetBundle và các lợi ích của nó.
- Giải thích cách hệ thống Addressables đơn giản hóa việc quản lý AssetBundle.
Tổng quan
Bạn đã bao giờ muốn tạo ra một tựa game mobile có hiệu suất chạy mượt mà trên gần như mọi thiết bị chưa? Hay việc thêm các DLC hoặc cập nhật nội dung theo chủ đề ngày lễ cho game của bạn thì sao? Đây chính là lúc hệ thống Addressables phát huy tác dụng.
Hệ thống Addressables của Unity là một giải pháp quản lý tài nguyên động, giúp cung cấp cho người dùng chỉ những tài nguyên mà họ thực sự cần, vào đúng thời điểm họ cần chúng. Nó cũng giúp bạn quy hoạch các tài nguyên của mình để đóng gói thành các AssetBundles ngay từ bên trong Unity Editor trong quá trình bạn phát triển game. Đồng thời, Runtime API của nó cho phép bạn load và unload tài nguyên một cách linh hoạt khi người dùng đang chơi game.
Bạn có thể chọn đóng gói tất cả tài nguyên đi kèm với bản build hoặc lưu trữ chúng trên một mạng lưới phân phối từ xa (CDN) ví dụ như Unity Cloud Content Delivery của Unity. Vị trí lưu trữ của tài nguyên được trừu tượng hóa thông qua các địa chỉ là một string do bạn tự định nghĩa.
Trong bài hướng dẫn này, bạn sẽ tìm hiểu về cách tiếp cận của Unity đối với việc quản lý tài nguyên động và lý do tại sao hệ thống Addressables có thể là một sự bổ sung đáng giá cho dự án của bạn. Bạn cũng sẽ nắm được thêm thông tin về khóa học này, để từ đó sẵn sàng bắt tay vào làm việc với hệ thống Addressables.
Trước khi bắt đầu
Get started with Addressables là một khóa trung cấp.
Để hoàn thành khóa học này bạn cần có kinh nghiệm lập trình với Unity. Bên cạnh các kiển thức nền tảng đã được đề cập trong lộ trình Junior Programmer, bạn cũng nên nắm vững kiến thức về event handlers và asynchronous methods.
Chúng tôi cũng khuyến nghị bạn hoàn thành lộ trình Creative Core, hoặc có các kinh nghiệm tương đương để làm quen với tất cả các tài nguyên trong Unity mà bạn có thể áp dụng hệ thống Addressables với chúng.
Quản lý tài nguyên động là gì?
Hệ thống quản lý tài nguyên động (Dynamic asset management) giúp bạn cải thiện hiệu suất game bằng cách cho phép bạn quyết định chính xác việc tải tài nguyên khi nào và từ đâu, quyết định khi nào cần nạp vào và xóa khỏi bộ nhớ trong runtime.
Trong suốt lịch sử phát triển của Unity, đã có một vài phương pháp khác nhau để quản lý tài nguyên trong bộ nhớ. Hệ thống Addressables được thiết kế để thay thế hoặc cái tiến các hệ thống cũ - những hệ thống vốn đã lỗi thời hoặc không còn đủ khả năng đáp ứng cho một dự án vượt xa khỏi giai đoạn prototype. Trong khóa học này, bạn sẽ tiến hành nâng cấp một tựa game đang sử dụng một số phương pháp cũ để chuyển hoàn toàn sang hệ thống Addressables.
Dưới đây là một vài công cụ quản lý tài nguyên khác mà Unity đang hoặc đã từng cung cấp.
Tham chiếu trực tiếp (Direct references)
Khi bạn kéo thả một tài nguyên vào một scene hoặc vào một component thông qua Inspector của Editor, bạn đang tạo ra một tham chiếu trực tiếp tới tài nguyên đó. Khi bạn build ứng dụng của mình các tài nguyên này được lưu lại trong một tệp dữ liệu riêng biệt liên kết chặt chẽ với scene của bạn. Khi ứng dụng chạy trên thiết bị và scene được load lên, Unity Player sẽ nạp toàn bộ tài nguyên này vào bộ nhớ RAM trước khi scene thực sự xuất hiện, nhằm đảm bảo rằng scene có sẵn quyền truy cập vào tất cả mọi thứ mà nó có tham chiếu.
Nếu bạn chỉ sử dụng tham chiếu trực tiếp trong game thì cách quản lý này không linh hoạt (not dynamic). Việc load và unload toàn bộ scene là quyển kiểm soát duy nhất mà bạn có. Bạn có thể sẽ phải đối mặt với rủi ro tạo ra một game có build size khổng lồ và hiệu suất siêu tệ đặc biệt là trên các thiết bị có dung lượng RAM hạn chế.
Thư mục Resources
Thư mục Resources và Resource API đã từng cung cấp một cách đơn giản để quản lý tài nguyên trong bộ nhớ. Trong cấu trúc thư mục của các dự án Unity cũ, bạn có thể bắt gặp một hoặc nhiều thư mục Resources chứa tài nguyên. Trong quá trình build ứng dụng, Editor sẽ tìm kiếm tài nguyên ở tất cả các thư mục Resources và đóng gói chúng thành một tệp tuần tự (serialized file) đi kèm với nó là metadata và indexing infomation, tệp này sau đó được đóng gói thẳng vào ứng dụng của bạn. Resource API cho phép bạn viết script để load và unload các tài nguyên nằm trong thư mục Resources này.
Hệ thongse Resources tồn tại một số nhược điểm so với các hệ thống mới hơn:
- Nó không cho phép quản lý bộ nhớ một cách chi tiêt.
- Nó làm chậm thời gian khởi động ứng dụng.
- Nó có thể làm phình to dung lượng bản build
- Và nó hoàn toàn không hỗ trợ phân phối nội dung từ xa (CDN)
Hệ thống AssetBundle
Hệ thống AssetBundle quy hoạch tài nguyên vào các thùng containers được gọi là AssetBundles. Giống như thư mục Resources, hệ thống AssetBundle gom tài nguyên thành các tệp riêng biệt. Tuy nhiên, khác với Resources, AssetBundles có thể được lưu trữ cục bộ đi kèm với bản build hoặc lưu trữ trên cloud.
Thông qua bộ API của mình, hệ thống AssetBundles giúp giảm thiểu tối đa sự tiêu tốn băng thông và tài nguyên hệ thống. Nó làm được điều đó bằng cách cho phép bạn tải xuống các bundle chỉ khi nào cần thiết, nhờ đó mà bạn có thể bổ sung DLC và các bản cập nhật nội dung sau khi game đã ra mắt . Ví dụ bạn có thể phân phối nội dung mới để người chơi nạp tiền mua mà không bắt buộc họ phải tải lại toàn bộ file cài đặt mới từ store. Một khi các bundle được tải về máy, AssetBundles API cũng cấp các phương thức để load và unload tài nguyên từ các bundle đó.
Mặc dù là một hệ thống mang tính tùy biến rất cao, AssetBundles vẫn có những hạn chế nhất định khiến các lập trình viên trước đây phải tự xây dụng các giải pháp của riêng họ.
- AssetBundles chỉ có thể sử dụng thông qua scripts, giao diện trong Unity Editor rất hạn chế và quá trình build AssetBundles cũng yêu cầu bạn phải viết code.
- Bản thân AssetBundles API không tự động theo dõi sự phụ thuộc của tài nguyên giữa các AssetBundles khác nhau. Ví dụ: nếu bạn muốn load một prefab từ AssetBundle A, bạn sẽ phải tự tìm mọi thành phần phụ thuộc của nó như mesh, material, texture... nằm rải rác ở các AssetBundle khác. Sau đó bạn phải đảm bảo rằng các AssetBundles phụ thuộc đó đã được load xong trong lúc game chạy và trước khi bạn load prefab đó.
- Việc cấp phát và giải phóng bộ nhớ là tự tiếp và hoàn toàn thủ công. Do đó, rất dễ xảy ra tình trạng bạn vô tình unload một tài nguyên khỏi AssetBundle trong khi các đoạn code khác vẫn cần sử dụng tài nguyên đó. Điều này có thể dẫn đến lỗi thiếu nội dung hoặc rò rỉ bộ nhớ. Vấn đề này trở nên cực kỳ rắc rối với race conditions đòi hỏi bạn phải gia cố code của mình thật chặt chẽ để phòng ngừa.
- AssetBundles runtime API không hề biết bạn đang lưu trữ các bundle đã build ở trên thiết bị hay trên cloud. Điều này bắt buộc bạn phải tự lưu và theo dõi đường dẫn của từng AssetBundle, xem nó nằm trên cloud hay trên thiết bị để gọi hàm tải về cho đúng.
Addressables
Hệ thống Addressables được xây dựng dựa trên nền tảng của AssetBundle API nhằm cung cấp cho bạn một giao diện người dùng trực quan ngay trong Unity Editor, đồng thời tự động hóa các quy trình mà trước đây vốn chỉ có thể quản lý thủ công thông qua việc viết code. Với hệ thống Addressables, bạn có thể quy hoạch các tài nguyên của mình ngay trong Unity Editor và để mặc cho hệ thống tự xử lý các vấn đề dependencies, vị trí lưu trữ cũng như việc cấp phát và giải phóng bộ nhớ.