nói dối e blog

Quản Lý Vòng Đời Của Entity Trong Hệ Thống ECS

Môi trường trò chơi của chúng ta được xây dựng từ nhiều nút cảnh khác nhau, trong đó mỗi nút cảnh là một thành phần Component của Entity. Những cảnh phức tạp có thể được tạo thành từ các khối dựng sẵn (Prefab) trong trình soạn thảo, giống như việc lắp ráp các mảnh lego đã được thiết kế sẵn. Về thiết kế hệ thống Prefab, chúng tôi đã từng thảo luận chi tiết qua hai bài blog trước đây là “Thiết kế hệ thống Prefab trong engine trò chơi” và “Quản lý Prefab và tập hợp đối tượng”.

Tái Cấu Trúc Thư Viện Toán Học

Chúng tôi đã tiến hành tái cấu trúc thư viện toán học được sử dụng trong engine sau một thời gian dài vá víu. Quá trình này tích hợp nhiều ý tưởng đã tích lũy qua nhiều năm phát triển. Gần đây, khi tối ưu hiệu năng engine, chúng tôi đã chuyển đổi một số hệ thống tốn nhiều tài nguyên sang viết bằng C/C++ và nhân cơ hội này hoàn thiện kiến trúc thư viện toán học để hỗ trợ tốt hơn cho cả Lua API lẫn C API.

Ứng Dụng Chức Năng Phân Nhóm Trong Hệ Thống Gắn Kết Đối Tượng

Trong giai đoạn phát triển gần đây, chúng tôi đã tích hợp chức năng phân nhóm đối tượng vào hệ thống engine. Mục tiêu ban đầu của tính năng này là tạo ra cơ chế lọc nhanh các tập hợp đối tượng cần xử lý (hiển thị) khi số lượng đối tượng trong thế giới game vượt xa số lượng đối tượng cần xử lý đồng thời. Trong quá trình vận hành, tôi đã khám phá ra nhiều ứng dụng thú vị khác của chức năng này.

Thêm Chức Năng Phân Nhóm Cho ECS

Hiện tại, chúng ta đang sử dụng ECS để quản lý các đối tượng trong engine game. Khi kích thước cảnh game mở rộng đến một mức độ nhất định, việc thiết lập một cơ chế để lọc nhanh các đối tượng cần render trở nên cực kỳ quan trọng. Nói cách khác, nếu bạn tạo ra 100.000 Entity nhưng chỉ có 1.000 Entity cần được render đồng thời, hiệu năng sẽ phụ thuộc vào việc bạn xử lý ở cấp độ O(n) với n=100.000 hay n=1.000 – sự khác biệt là rất rõ rệt.

Triển Khai Đồ Thị Vô Hướng Bằng Danh Sách Kề

Hôm nay, khi mở rộng hệ thống ống dẫn trong game của chúng tôi, lại gặp phải bài toán triển khai đồ thị vô hướng. Trước đây, hệ thống ống dẫn chỉ cho phép mỗi đoạn ống kết nối với số lượng ống kề giới hạn, nên tôi đã sử dụng cấu trúc tương tự cây, lưu trữ trực tiếp một mảng kích thước cố định tại mỗi nút để chứa các nút kế tiếp. Cấu trúc này hoạt động rất hiệu quả với hệ thống ống dẫn chất lỏng.

Triển Khai Một Thư Viện VLA (Mảng Độ Dài Thay Đổi)

Tính năng VLA (Variable Length Array) được thêm vào tiêu chuẩn C99 như một công cụ tiện lợi cho lập trình viên C. Tuy nhiên, Microsoft Visual C++ (MSVC) đã chính thức từ chối hỗ trợ tính năng này. Đặc biệt, mã nguồn nhân Linux từng sử dụng VLA nhưng đã loại bỏ hoàn toàn trong các phiên bản gần đây. Điều này cho thấy các vấn đề an toàn tiềm ẩn của VLA vượt xa lợi ích tiện dụng mà nó mang lại.

0%