[Hướng Dẫn] Atlas texture, tối ưu hóa hiệu suất cho Particle System

Black FaceBlack Face Posts: 424Registered
edited August 2019 in Unity
[chapter]Tổng quan[/chapter]
Là developer, sản phẩm bạn làm ra có hay tới đâu, nhưng sử dụng giật lắc, không ổn định hoặc chiếm quá nhiều tài nguyên thì cũng sẽ không ai muốn sử dụng, kể cả chính bạn, việc lập trình một ứng dụng cái quan trọng nhất là tối ưu hiệu suất sử dụng, đó là điều mình rút ra được sau một quãng thời gian không ngắn cũng ko dài trên con đường trở thành developer.
Bài viết này hướng dẫn các bạn 1 cách sử dụng Particle system sao cho tối ưu về mặt hiệu suất.

[chapter]Particle System là gì?[/chapter]
Nói một cách ngắn gọn nhất, đó là hệ thống hạt, được sử dụng để làm hiệu ứng trong game, từ game nhỏ tới lớn.
Ưu điểm của Particle System: Bạn có thể tạo bất kỳ hiệu ứng gì mà mình thích cho game, thời tiết, nắng mưa, tuyết, hiệu ứng cháy nổ, khói
Nhược điểm: Khá là nặng, kể cả Unity cũng đã có chế độ tối ưu hóa cho mobile, nhưng lạm dụng thì việc gây quá tải xử lý dẫn đến drop FPS của game là chuyện rất bình thường
Cách thức hoạt động: mỗi hạt (chính xác là 1 object) đều được xử lý riêng bởi CPU, mà trong mỗi hiệu ứng không chỉ có 1 hạt, mà hàng trăm, hàng ngàn hạt, thì mới tạo được hiệu ứng mình mong muốn và đẹp mắt. Vậy nên việc tối ưu hiệu suất cho các hiệu ứng thực sự là vấn đề không thể bỏ qua.
Dưới đây là ví dụ 2 hiệu ứng mà mình đã sử dụng Particle System để tạo nên, và mình sử dụng Atlas Texture

[align=center]bbhk26gfbrbbwc5zgjpg            1rawunxwru4tb4czgjpg[/align]

[align=left][chapter]Atlas Textures là gì?[/chapter][/align]
[align=left]Trong game, mỗi lần 1 texture được vẽ lên màn hình, ta sẽ tốn 1 drawcall, càng nhiều textures thì ta lại càng tốn nhiều drawcall. Số lượng drawcall càng tăng thì performance game giảm xuống, xảy ra hiện tượng giật lag. Vì thế người ta thường đóng gói (pack) tất cả texture nhỏ lẻ thành 1 tấm lớn, nhờ vậy giảm được rất nhiều drawcall.[/align]

[align=center]141g4g15inzqunrzgjpg[/align]

[align=left]Các bạn có thể sử dụng công cụ Sprite Packer có sẵn trong Unity để có thể đóng gói các hình thành 1 pack như vậy.[/align]

[align=center]cwbruxob4wdjo2rzgjpg[/align]

[chapter]Atlas Textures tối ưu thế nào?[/chapter]
Mỗi một Object Particle System cần một material cho nó, và thường thì material của ParticleSystem cần 1 texture, các hiệu ứng phức tạp hơn có thể sử dụng nhiều texture hơn.
Hình dưới đây mình đã đóng gói các texture cần sử dụng để làm 1 hiệu ứng vào thành 1 pack, nó bao gồm 6 hình ảnh tách biệt, như vậy hiệu ứng của mình chỉ chiếm 1 Drawcall, và nếu ko pack lại, thì chắc chắn sẽ tốn 6 Drawcall cho hiệu ứng này, hiệu năng cũng sẽ giảm xuống.

[align=center]7qvlj77a1ejc74tzgjpg[/align]


[chapter]Cách thức sử dụng[/chapter]
Chúng ta sẽ dùng tính năng Texture Sheet Animation, có sẵn trong thiết lập Particle System.
Trước tiên các bạn tạo 1 material và kéo Texture atlas đã pack vào đó, rồi kéo Material vừa tạo vào Particle System, các bạn nhìn hình dưới nhé.

[align=center]617b20646rognkpzgjpg[/align]

Tick vào Texture Sheet Animation, chúng ta sẽ sử dụng cố định 1 hình trong Atlas cho nên sẽ chọn Frame over Time là Constant

[align=center]x7zsvht8m9jknzlzgjpg[/align]

Điều chỉnh tỉ lệ chia hình

[align=center]d7yaow993b4ols2zgjpg          t48dw8wbiy1jl7lzgjpg[/align]

Nếu mình sử dụng 4 hình đầu tiên, thì mình sẽ config như sau
Tiles: 5 x 1
Frame over Time : 0 tới 3

[align=center]axer5zrz03gfxq3zgjpg          zs9hrihhq7knse5zgjpg[/align]

Nếu mình sử dụng 2 hình nhỏ phía bên phải, thì mình sẽ config như sau
Tiles: 10 x 2
Frame over Time : 8 hoặc 9

Thế thôi, rất đơn giản đúng không, và kết quả cuối cùng là tạo hiệu ứng theo ý muốn của bạn.

[align=center]axgec7kw9v514u7zgjpg[/align]

[chapter]Lưu ý quan trọng[/chapter]
* Sử dụng texture size là POT (Power of two) Kích thước các cạnh của tấm atlas phải là số lũy thừa của 2 (64, 128, 256, 512 …). Cái này liên quan tới GPU, các bạn có thể đọc thêm ở đây
* Với mobile, giới hạn kích thước Atlas không quá 2048. Đây là lưu ý để tối ưu cho các thiết bị di động, kích thước texture quá lớn sẽ khiến ứng dụng ngốn rất nhiều RAM, và GPU phải làm việc nặng, giảm hiệu năng của game 
* Sử dụng Mobile Shader cho các Material, các bạn tùy chọn như hình dưới nhé, Unity có tính năng này để tối ưu hóa cho các thiết bị di động, tất nhiên cứ tối ưu là chất lượng sẽ giảm rồi, nhưng mắt thường ko nhận ra được đâu, vì cũng ko quá khác biệt.

[align=center]yfffcyop38wevyfzgjpg[/align]
Tagged:

Comments

Sign In or Register to comment.