Kiến trúc: Thiết kế Hướng Dữ liệu và ECS
C# Code
// Đây là snippet mang tính giải thích khái niệm, không phải code chạy trực tiếp.
// --- Thiết kế Hướng Đối tượng (Object-Oriented Design - OOD) thông thường ---
/*
class Enemy : MonoBehaviour {
// Dữ liệu và hành vi được đóng gói trong cùng một class.
float health;
float speed;
Vector3 position;
void Move() { ... }
void Attack() { ... }
void Update() {
Move();
Attack();
}
}
// -> Vấn đề: Khi có hàng ngàn Enemy, CPU phải nhảy qua lại giữa các vùng nhớ khác nhau
// cho mỗi đối tượng, gây ra cache misses và làm chậm hệ thống.
*/
// --- Thiết kế Hướng Dữ liệu (Data-Oriented Design - DOD) với ECS ---
// 1. Component: Chỉ chứa dữ liệu, không có hành vi (struct).
public struct Position : IComponentData {
public float3 Value;
}
public struct Velocity : IComponentData {
public float3 Value;
}
public struct Health : IComponentData {
public float Value;
}
// 2. System: Chỉ chứa hành vi, xử lý các component.
// Hệ thống này sẽ chạy trên tất cả các Entity có cả Position và Velocity.
[BurstCompile]
public partial struct MovementSystem : ISystem {
public void OnUpdate(ref SystemState state) {
float deltaTime = SystemAPI.Time.DeltaTime;
// Chạy song song trên nhiều luồng
new MovementJob { DeltaTime = deltaTime }.ScheduleParallel();
}
}
[BurstCompile]
public partial struct MovementJob : IJobEntity {
public float DeltaTime;
// Lấy tất cả Entity có Position và Velocity
void Execute(ref Position position, in Velocity velocity) {
position.Value += velocity.Value * DeltaTime;
}
}
// 3. Entity: Một 'ID' để liên kết các component với nhau.
/*
* Lợi ích của DOD/ECS:
* - Cache-Friendly: Dữ liệu của cùng một loại component (ví dụ: tất cả Position) được lưu trữ
* liền kề nhau trong bộ nhớ, giúp CPU truy xuất cực nhanh.
* - Parallelism: Các hệ thống có thể xử lý dữ liệu một cách độc lập và song song trên nhiều luồng CPU.
* - Code sạch hơn: Tách biệt rõ ràng giữa dữ liệu (Component) và hành vi (System).
* - Khó khăn: Yêu cầu thay đổi tư duy lập trình và có đường cong học tập dốc hơn so với OOP.
*/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.