Boxing & Unboxing: Kẻ thù giấu mặt của hiệu năng Unity

Tags:
Optimization
Performance
C#

C# Code

using UnityEngine;
using System.Collections.Generic;
using System.Collections; // Namespace của ArrayList

public class BoxingExample : MonoBehaviour
{
    void Start()
    {
        // --- Boxing ---
        int i = 123; // Value type trên Stack.

        // Boxing xảy ra ở đây: một object được tạo trên Heap để chứa giá trị của 'i'.
        // Thao tác này tạo ra rác (garbage).
        object o = i; 

        // --- Unboxing ---
        // Unboxing: Lấy giá trị từ object trên Heap về lại Stack.
        int j = (int)o;
    }

    // Cạm bẫy hiệu năng kinh điển trong Unity
    void Update()
    { 
        // ---- CÁCH TỆ: Dùng collection không generic (như ArrayList) ----
        // ArrayList chứa các 'object', vì vậy mỗi lần Add một value type (như int)
        // sẽ gây ra Boxing, tạo ra rác mỗi frame. RẤT TỆ!
        ArrayList arrayList = new ArrayList();
        arrayList.Add(10); // BOXING!
        int value = (int)arrayList[0]; // UNBOXING!

        // ---- CÁCH TỐT: Dùng collection generic (như List<T>) ----
        // List<int> được thiết kế để làm việc trực tiếp với kiểu 'int'.
        // Không có Boxing, không tạo rác. LUÔN DÙNG CÁCH NÀY!
        List<int> genericList = new List<int>();
        genericList.Add(10); // KHÔNG BOXING!
        int value2 = genericList[0]; // KHÔNG UNBOXING!

        // Một ví dụ khác: Dùng string.Format với value types
        // string s = string.Format("Score: {0}", 100); // Gây Boxing cho số 100
        // Cách tốt hơn: 
        string s_good = "Score: " + 100.ToString(); // ToString() không gây Boxing.
    }
}

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.

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

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 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

Expression Trees là một tính năng C# nâng cao cho phép bạn biểu diễn code dưới dạng cây dữ liệu. Trong Unity, nó mở ra khả năng xây dựng các hệ thống phức tạp như trình tạo truy vấn động, hệ thống AI có thể sửa đổi hành vi tại runtime, hoặc các công cụ editor tùy chỉnh mà không cần sinh mã code mới.

Architecture
Algorithm
Optimization
C#

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

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

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

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.

Optimization
Performance
Rendering

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