Kinh nghiệm xử lý lỗi ForceQuit của game Unity3D khi build trên Android, iOS (phần1)
Unity3D
1
White

Dương Minh Khoa viết ngày 26/08/2015

Vấn đề

Ngày trước, dự án game 3D mình làm đang chuẩn bị release thì dính phốt. Vấn đề phát sinh khi game chạy trên Editor, PC, Tablet (Nexus 9 + Ipad Air 3) thì ngon, nhưng cứ chạy trên iPhone thì lăn đùng ra chết, điên thoại Android thì con chết con không.
Mình được giao nhiệm vụ fix bug này. Sau vài ngày vật vã cuối cùng cũng xong và thu được một số kinh nghiệm thú vị. Sau đây xin chia sẻ cùng mọi người

Một chút về cấu hình game: 2D + 3D

Ngày 1: Tìm bug

Trước hết, do thằng Tablet vẫn sống nhăn răng (mặc dù chạy khá nóng) nên mình dự đoán lỗi có thể do space của mobile hoặc lỗi về version của OS.

Tiến hành khám nghiệm tử thi thằng iOS trước:

  • Trace Log: bạn nào dev trên window thì dùng iTool, dev trên Mac thì dùng Xcode:
    thấy dòng log:
    Received memory warning. Level=1
    Jetsam: kernel termination snapshot being created
    Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2015-05-12-160645.plist .

    Tới đây thì có thể khẳng định là dính phốt Out Of Memory. Trong iOS, jetsam có nhiệm vụ kill những process chiếm dụng Ram (khoảng > 500M).

  • Trace Memory:

    • Trên iOS mình dùng thằng Allocation của Instrustment.(Spotlight > Instrustment hoặc Application > Xcode > Show Pakage Content > Appliction > Instrustment).
    • Trường hợp của mình là khi vào battle, cứ mỗi lần thêm character là memory lại tăng lên ~40M (~@@~). Khi battle co 10 character là die luôn.

Một chút về cách load quái mình đang sử dụng: Resource của quái được load từ server sử dụng assetbundle. Cache resource ở client, nếu là trong battle thì cache lại cả ở object pool để lúc summon không bị giật.
Vì thế với vấn đề trên một số giả thiết được đưa ra như sau:

  • www object và assetbundle object chưa được giải phóng sau khi load
  • Bị duplicate object khi sử dụng object pool
  • Resource quá nặng.
  • Build Assetbundle sai cách làm resource nặng.

Dựa trên những giả thiết trên, mình bắt đầu tìm hiểu lần mò vào code:

  • dispose www (OK - đã thực hiện)
  • unload assetbundle (OK)
  • check duplicate object pool (OK)

Ngày thứ nhất kết thúc mà vẫn chưa tìm ra được hung thủ, còn phải check Resource với build Assetbundle nữa.

Ngày 2: Nhầm

Ngày thứ 2 bắt đầu bằng việc check resource.
Về cơ bản một object 3D bao gồm: Texture + shader + material + model.
Vì thế để check resource mình sử dụng thằng profiler của Unity trên Editor.
http://docs.unity3d.com/Manual/ProfilerWindow.html

Sau khi check mình phát hiện thằng Texture trong memory lên tới 200M. Nguyên nhân:

  • Do bên design để size cho texture rất lớn.
  • Bên mình format cho nó mặc định là True Color mà không compress lại (trên iphone nên để là rgba 16 bit)
  • Tất cả texture đều generate Mipmaps (một số loại texture không cần thiết)
  • Do sử dụng assetbundle làm texture bị load lại nhiều lần.

Sau khi resize lại texture thì check memory trên editor chỉ còn 85M :D.

Tưởng mọi chuyện xong rồi mà ai ngờ đời không như là mơ. Build lại trên iphone vẫn chết tức tưởi. Trên PC thì memory khá ổn định mà trên iPhone thì vẫn tăng chóng mặt như giá xăng.

Lại phải hì hục ngồi profiler cho thằng iPhone:
http://blog.collectivemass.com/2014/03/unity-profiler-ios/
Nhìn vào profiler THÂT KHÔNG THỂ TIN NỔI texture chỉ có 20M, nhưng shader là 220M.
Hóa ra trên smartphone mặc định texture được format lại nhỏ hơn so với editor rất nhiều. Nhưng thay vào đó thằng shader tăng lên khủng bố.

Vây thì phải làm thế nào bây giờ, mình thì không đủ trình để viết lại Shader cho mobile.
Không lẽ dừng cuộc chơi tại đây.
(Còn tiếp)

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Dương Minh Khoa

2 bài viết.
5 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
18 2
Vấn đề Thời gian gần đây, do yếu tố công việc nên mình phải tiếp xúc nhiều với (Link), đâm ra cũng có tí thích thú muốn tìm hiểu sâu hơn về em nó. ...
Dương Minh Khoa viết 3 năm trước
18 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
2 bài viết.
5 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!