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 game | Dung lượng | Xếp hạng độ nhẹ |
Siege: World War II | 95mb | 1 |
War Heroes | 104mb | 2 |
War Alliance | 111mb | 3 |
World War Doh | 144mb | 4 |
Hero Of Empire (*) | 146mb | 5 |
Minigun Omega War | 222mb | 6 |
Sould of Eden | 388mb | 7 |
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 game | Dung lượng | Xếp hạng độ nhẹ |
Siege: World War II | 95mb | 1 |
Hero Of Empire (*) | 101mb | 2 |
War Heroes | 104mb | 3 |
War Alliance | 111mb | 4 |
World War Doh | 144mb | 5 |
Minigun Omega War | 222mb | 6 |
Sould of Eden | 388mb | 7 |
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://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