Tối ưu bằng Occlusion Culling

Tags:
Optimization
Performance
Rendering

C# Code

// Occlusion Culling là một tính năng của Unity, không phải là một script có thể chạy.
// Đây là hướng dẫn các bước để thiết lập nó trong Editor.

/*
 * HƯỚNG DẪN THIẾT LẬP OCCLUSION CULLING
 *
 * 1. ĐÁNH DẤU CÁC ĐỐI TƯỢNG (Mark Objects as Static):
 *    - Trong Scene của bạn, chọn tất cả các vật thể lớn, tĩnh (không di chuyển)
 *      mà có khả năng che khuất các vật thể khác (ví dụ: tường, nhà, núi, sàn nhà).
 *    - Trong Inspector, ở góc trên bên phải, tick vào ô "Static".
 *    - Một menu dropdown sẽ hiện ra, đảm bảo rằng "Occluder Static" và "Occludee Static" được chọn.
 *        + Occluder Static: Đánh dấu vật thể này có khả năng che khuất vật thể khác.
 *        + Occludee Static: Đánh dấu vật thể này có thể BỊ che khuất bởi vật thể khác.
 *
 * 2. MỞ CỬA SỔ OCCLUSION CULLING:
 *    - Vào menu Window -> Rendering -> Occlusion Culling.
 *
 * 3. TÙY CHỈNH THÔNG SỐ (Optional but Recommended):
 *    - Trong tab 'Bake' của cửa sổ Occlusion Culling, bạn có thể điều chỉnh các thông số.
 *      Các giá trị mặc định thường hoạt động tốt cho bước khởi đầu.
 *        + Smallest Occluder: Kích thước tối thiểu của một vật thể được coi là occluder.
 *          Vật thể nhỏ hơn giá trị này sẽ không được dùng để che khuất vật thể khác.
 *        + Smallest Hole: Kích thước của lỗ hổng nhỏ nhất mà camera có thể nhìn xuyên qua.
 *          Tăng giá trị này có thể cải thiện performance nhưng có thể gây ra lỗi đồ họa nhỏ.
 *
 * 4. BAKE DỮ LIỆU:
 *    - Sau khi đã đánh dấu các đối tượng và tùy chỉnh thông số, nhấn vào nút "Bake" ở góc dưới bên phải cửa sổ.
 *    - Unity sẽ bắt đầu quá trình tính toán dữ liệu culling cho Scene hiện tại. 
 *      Quá trình này có thể mất một vài phút tùy thuộc vào độ phức tạp của scene.
 *    - Sau khi bake xong, một thư mục mới chứa dữ liệu Occlusion Culling sẽ được tạo ra bên cạnh file Scene của bạn.
 *
 * 5. KIỂM TRA:
 *    - Để kiểm tra kết quả, hãy mở tab 'Visualization' trong cửa sổ Occlusion Culling.
 *    - Di chuyển Scene Camera xung quanh. Bạn sẽ thấy các đối tượng bị tô màu xanh dương biến mất khi chúng bị che khuất hoàn toàn khỏi tầm nhìn của camera.
 *    - Điều này chứng tỏ Occlusion Culling đang hoạt động.
 *
 * LƯU Ý:
 * - Occlusion Culling chỉ hoạt động với Camera có bật tùy chọn "Occlusion Culling" (mặc định là bật).
 * - Bạn phải thực hiện lại quá trình 'Bake' mỗi khi bạn thay đổi đáng kể cấu trúc của các đối tượng tĩnh trong Scene.
 * - Tính năng này hiệu quả nhất trong các môi trường phức tạp có nhiều vật cản như hành lang, thành phố, dungeon.
 */
 

Hướng dẫn cách thiết lập Occlusion Culling để tối ưu hiệu năng bằng cách không render các vật thể bị che khuất hoàn toàn bởi các vật thể khác.

Bình luận (0)

Bạn cần đăng nhập để có thể bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Bài viết liên quan

Một script đơn giản để quản lý các nhóm LOD (Level of Detail) trong scene, giúp tự động giảm chất lượng model khi ở xa để tối ưu hiệu năng, đặc biệt hữu ích cho các màn chơi rộng lớn.

Optimization
Performance
3D
Rendering

Boxing là quá trình chuyển một Value Type (như int, float) lên Heap bằng cách 'gói' nó trong một object. Unboxing là quá trình ngược lại. Trong Unity, việc này xảy ra âm thầm và thường là nguyên nhân gây ra các vấn đề về Garbage Collection và sụt giảm FPS mà không ai ngờ tới.

Optimization
Performance
C#

Một hệ thống Object Pool đơn giản để tái sử dụng các đối tượng thay vì tạo và hủy liên tục, giúp tối ưu hiệu năng đáng kể, đặc biệt khi cần tạo nhiều đối tượng như đạn, kẻ địch.

Design Pattern
Object Pool
Optimization
Performance

Giới thiệu triết lý Thiết kế Hướng Dữ liệu (Data-Oriented Design) và cách nó được hiện thực hóa qua kiến trúc ECS (Entity Component System) trong DOTS của Unity để đạt được hiệu năng xử lý dữ liệu vượt trội.

Architecture
Optimization
Performance
DOTS
ECS

Hiểu cách C# và Unity quản lý hai vùng nhớ Stack và Heap là chìa khóa để tối ưu hiệu năng. Việc sử dụng sai `class` (Heap) thay vì `struct` (Stack) cho các dữ liệu nhỏ có thể tạo ra hàng ngàn 'rác' (garbage), khiến Garbage Collector (GC) phải hoạt động và gây giật, lag game.

Optimization
Performance
C#
Architecture

Một kỹ thuật tối ưu cơ bản và quan trọng: cache (lưu trữ) các tham chiếu đến component trong Awake() hoặc Start() để tránh gọi GetComponent() liên tục trong Update(), giúp giảm đáng kể chi phí hiệu năng.

Optimization
Performance

Hiểu rõ khi nào nên sử dụng `struct` thay cho `class` để giảm áp lực lên bộ nhớ và garbage collector, đặc biệt hữu ích cho các đối tượng dữ liệu nhỏ, bất biến.

Optimization
Performance
Architecture

LINQ rất mạnh mẽ nhưng có thể gây tốn hiệu năng nếu không sử dụng cẩn thận. Snippet này chỉ ra các mẹo và cạm bẫy khi dùng LINQ trong game.

Optimization
Performance
LINQ
Architecture

Giới thiệu về DOTS (Data-Oriented Technology Stack) bằng cách sử dụng Job System để thực hiện các tác vụ nặng song song trên nhiều luồng CPU và Burst Compiler để tối ưu hóa code C# thành mã máy cực nhanh.

Optimization
Performance
DOTS
Job System
Burst

So sánh các thuật toán sắp xếp như Bubble Sort, Insertion Sort và Quick Sort và khi nào nên sử dụng chúng trong game (ví dụ: sắp xếp bảng xếp hạng).

Algorithm
Architecture
Optimization