Trang chủ Program TỐI ƯU DUNG LƯỢNG FILE BUILD VỚI UNITY

TỐI ƯU DUNG LƯỢNG FILE BUILD VỚI UNITY

bởi Dan Tran Dinh

Lời mở đầu

Hình 1

Hình 2

Đi thẳng vào vấn đề luôn, phía trên là những popup cảnh báo từ Store khi anh em tải Game vượt quá dung lượng bộ nhớ còn lại của thiết bị.

Với tư cách là một người dùng đã từng gặp cảnh báo trên, tôi rất là akay. Sau một thời gian ngồi tìm và xóa bớt những game trong máy, những ảnh thừa hoặc video nhảm nhí để có thể đủ dung lượng tải con Game vừa xong, trừ khi phải có một động lực gì đó cực lớn để giữ con Game đó lại, không là tôi cũng xóa luôn cho nhẹ nợ. Các thiết bị di động bây giờ đều có giới hạn về bộ nhớ, 64G internal với một người dùng bình thường như tôi đã dùng hết khi nào không biết, thì với những người có nhu cầu cao hơn thì bao nhiêu cũng sẽ chẳng bao giờ đủ :’(

Với trách nhiệm là một Developer, bài viết này sẽ giới thiệu một vài phương pháp giúp anh em giảm dung lượng file build, từ đó giảm thiểu tối đa trường hợp user gặp phải cảnh báo kể trên.

Dung lượng file Build có quan trọng không?

Dựa theo báo cáo từ GSMA, có 5.2 tỉ người sở hữu thiết bị di động trên thế giới, và theo đó, sự phổ biến của các ứng dụng đã tăng lên từng ngày. 

Những develop như chúng ta đã làm việc không biết mệt mỏi để có thể cạnh tranh với 3.04 triệu ứng dụng từ GooglePlay và 1.82 triệu ứng dụng từ Apple’s App Store. Chúng ta phải đối mặt với một sự thật nghiệt ngã rằng: không phải app nào cũng có thể trụ vững và thành công. Một người dùng bình thường sẽ không dùng nhiều ứng dụng, và với những ứng dụng có chức năng tương đương, họ sẽ ưu tiên chọn ứng dụng tốt nhất.

Dựa trên báo cáo của google, nếu dung lượng file lớn hơn 150mb, mốc trước đây là 100mb, tỉ lệ cài đặt ứng dụng sẽ thấp đi khoảng 30%. Cứ 6mb dung lượng tăng lên, tỉ lệ chuyển đổi lại giảm đi 1%. Và theo nghiên cứu, 65% người dùng sẽ không tải ứng dụng nếu có cảnh báo dung lượng quá lớn, họ sẽ lên store tìm ứng dụng khác có chức năng tương tự nhưng dung lượng nhỏ hơn.

Vấn đề hiện tại dự án HOE đang gặp phải

Hiện tại, dự án HOE đã đến lúc phải tối ưu dung lượng:

File apk của phiên bản 1.02.00 ở mốc 146mb (chứa cả thư viện), mong muốn của PO lúc này là giảm dung lượng xuống còn khoảng 70-80mb để có thể cạnh tranh với những game khác cùng thể loại, ví dụ như

Tên gameDung lượngXếp hạng độ nhẹ
Siege: World War II95mb1
War Heroes 104mb2
War Alliance 111mb3
World War Doh144mb4
Hero Of Empire (*)146mb5
Minigun Omega War222mb6
Sould of Eden388mb7

Hình 3: Dung lượng file apk HOE

Phương pháp

Dựa vào những vấn đề đang gặp phải, qua quá trình tìm hiểu, mình đã note ra các giải pháp tối ưu như sau:

  • Tối ưu Texture
  • Tối ưu dung lượng Audio file (đã trình bày ở blog trước)
  • Xóa bớt Resource thừa không sử dụng trong dự án
  • Tái sử dụng Resource
  • DLC

Mình sẽ trình bày về sự hiệu quả của từng giải pháp ở bên dưới. Vì lí do thời gian và nguồn lực có hạn nên dự án HOE mới chỉ áp dụng được 1 vài phương pháp, một số sẽ được cân nhắc để làm sau, và 1 số khác sẽ chỉ ở phương diện tham khảo.

Image Optimization

A – Image Format

Có khá nhiều trường hợp chỉ cần thay đổi định dạng ảnh là dung lượng sẽ giảm được rất nhiều, bên mình đã áp dụng phương pháp sau:  Các texture kích cỡ to (>100px) nên xuất ở định dạng hình vuông, bội số của 2 mũ (256, 512, 1024, 2048)

Hình 4: là texture của 1 hiệu ứng giật sét trong game, với kích thước ban đầu khá to và không ở kích thước chuẩn như bên trên

Hình 5: cũng là texture trên, nhưng đã được tối ưu về mặt kích thước, chất lượng vẫn ưu tiên được giữ nguyên, dung lượng đã giảm từ 9.3mb → 1mb

Hình 4

Hình 5

B – Effect With Spine

Do trước đây chưa có quy chuẩn, anh em làm anim hay add luôn cả hiệu ứng vào file Spine, như này thì tiện cho lúc làm việc do chỉ cần làm trên 1 môi trường, tuy nhiên dung lượng các file anim khi bàn giao sẽ rất lớn. Do đó mình đã đề xuất phương pháp tách effect khỏi texture để có thể tối ưu từng phần.

Hình 6: Đây là 1 file texture cho animation mở Pack, làm bằng Spine, bên trong file này gồm có texture của pack, hiệu ứng ánh sáng,…..

Hình 7: Cũng là texture cho animation Spine bên trên, nhưng đã được tách phần ánh sáng

Hình 8: Texture riêng cho effect ánh sáng hiệu ứng

Hình 6: File Texture cho animation mở Pack ban đầu

Hình 7: Texture pack khi tách ánh sáng

Hình 8: Texture riêng cho phần ánh sáng hiệu ứng

Dung lượng file trước khi tối ưu: 16mb

Dung lượng file sau khi tối ưu: 4.137mb

Theo đó, dung lượng file đã được giảm khoảng 4 lần. Tuy nhiên vẫn có thể tối ưu thêm nữa bằng cách làm ánh sáng hiệu ứng bằng Particle Effect trong Unity, lúc đó dung lượng file có thể xuống dưới 2mb (giảm khoảng 8 lần)

C – 9-Slide GUI

Phần này chắc khá quen thuộc với nhiều anh em rồi, 9-slice (hay còn gọi là 9-patch) là kĩ thuật được dùng để chia 1 ảnh 2D ra làm 9 phần, và từ 9 phần đó có thể scale to nhỏ tùy theo nhu cầu, tránh hiện tượng bị kéo dài khi hình ảnh hiển thị ở nhiều size khác nhau và nhiều tỉ lệ khác nhau.

Hình trên là các Asset cơ bản mà dự án HOE sử dụng, hầu hết các popup trong game đều được tạo ra bằng cách scale, sắp xếp các hình vuông bên trên. Mỗi hình có kích thước nhỏ từ 64×64 – 128x128px với nhiều style màu sắc và bo viền khác nhau.

Đây là ví dụ một vài popup được tạo ra từ các 9-slide bên trên. Làm theo cách này thay vì phải vẽ những tấm ảnh to thì ta có thể tạo ra chúng từ các thành phần nhỏ hơn, vừa tối ưu kích thước và vừa linh hoạt khi chỉnh sửa.

Removing Dead Code

Anh em chú ý, mỗi khi import một package ngoài vào, ngoài những thành phần giúp đáp ứng nhu cầu hiện tại, vẫn còn nhiều thành phần khác hiện tại chưa dùng được ngay, tuy nhiên vẫn tính vào dung lượng file APK, anh em chú ý xóa đi cho đỡ tốn.

Ví dụ dự án HOE gặp phải là Demo của TextmeshPro package. Phần này chứa nhiều thành phần hiện tại không sử dụng đến, sau khi xóa xong build lại file APK giảm được 2mb

DLC – Downloadable Contents

Một số thành phần trong Game sau khi được người chơi download nhưng rất ít khi sử dụng đến. Ví dụ một số phần mở rộng như Languagepack (bộ font chữ tiếng cho các quốc gia khác nhau), những phần này hoàn toàn có thể tách rời với bản build, để ở dạng DLC (Downloadable contents) và user có thể download bất cứ khi nào cần.

Một số kịch bản có thể sử dụng:
– Language Pack: Bản game gốc chỉ có 1 vài ngôn ngữ chính, những ngôn ngữ khác user có thể tùy chọn download sau

– Các Mode chơi phụ: Bản game gốc chỉ có mode chơi chính, User muốn chơi các mode phụ khác có thể download sau

– Các Asset phụ trợ: Ví dụ Game có chức năng thay đổi hình dáng cho nhân vật (Skin), thì những Skin này có thể đặt vào DLC và được download sau khi User thực hiện Purchase

Ví dụ dự án HOE: 

Tách bộ Language Pack tiếng Trung Giản thể ra khỏi build, file apk giảm được 4mb

Tách bộ Language Pack tiếng Hàn ra khỏi build, file apk giảm được 2mb

Tách bộ Language Pack tiếng Nhật ra khỏi build, file apk giảm được 2mb

Kết quả

Sau khi áp dụng những phương pháp tối ưu kể trên, file apk của phiên bản 1.04.00 đã xuống còn 98.8mb (chứa cả thư viện), dung lượng ở mức này tuy chưa đạt kì vọng ban đầu (70-80mb), nhưng vì không thể đánh đổi chất lượng nên không thể giảm dung lượng xuống thấp hơn được nữa.

Tên gameDung lượngXếp hạng độ nhẹ
Siege: World War II95mb1
Hero Of Empire (*)101mb2
War Heroes 104mb3
War Alliance 111mb4
World War Doh144mb5
Minigun Omega War222mb6
Sould of Eden388mb7

Lời kết 

Cảm ơn anh em đã kiên nhẫn đọc đến đây 😀 Chủ đề về tối ưu là một chủ đề rất rộng, tuy nhiên nếu đã được khai thông tư tưởng thì quá trình làm việc sẽ rất trơn tru. Thay vì đợi đến lúc file Build to rồi mới tối ưu thì ta có thể tối ưu từng bước ngay từ ban đầu, ví dụ như:

  • Form sẵn định dạng Assets cho anh em đồ họa, phải xuất đúng thì mới nhận
  • Form Assets khi import vào dự án sao cho đạt hiệu quả nhất về mặt dung lượng/chất lượng
  • Luôn có ý thức kiểm tra lại các thành phần Assets khi dự án có sự thay đổi về dung lượng

Nguồn tham khảo:

Ebook Unity Game Optimization 2nd Edition

Ebook Unity Game Optimization 3rd Edition

https://developer.playcanvas.com/en/user-manual/2D/9-slicing/

https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

https://minhhh.github.io/posts/unity-texture-compression-and-optimization

http://www.theappguruz.com/blog/graphics-optimization-in-unity

https://forum.unity.com/threads/differences-between-the-new-compression-methods-in-build-window.487486/

https://www.unity3dtips.com/unity-texture-compression-android-ios/#:~:text=A%20POT%20texture%20is%20where,is%20a%20power%20of%202.

https://theonetechnologies.com/blog/post/5-ways-to-reduce-android-app-size

https://developer.android.com/topic/performance/reduce-apk-size

https://code.tutsplus.com/articles/8-ways-to-reduce-your-android-app-apk-size–cms-32508

Nhấn để đánh giá bài viết!
[Số đánh giá: 1 Trung bình: 5]

Có thể bạn quan tâm

Để lại bình luận