Có danh sách cục bộ cho mỗi hệ thống sẽ tăng mức sử dụng bộ nhớ cho các lớp.
Đó là một sự đánh đổi không-thời gian truyền thống .
Trong khi lặp qua tất cả các thực thể và kiểm tra chữ ký của chúng là mã trực tiếp, nó có thể trở nên không hiệu quả khi số lượng hệ thống của bạn tăng lên - hãy tưởng tượng một hệ thống chuyên biệt (hãy để nó là đầu vào) tìm kiếm thực thể duy nhất của nó trong số hàng ngàn thực thể không liên quan .
Điều đó nói rằng, phương pháp này có thể vẫn đủ tốt tùy thuộc vào mục tiêu của bạn.
Mặc dù, nếu bạn lo lắng về tốc độ, tất nhiên có một giải pháp khác để xem xét.
Mỗi hệ thống có nên giữ một danh sách địa phương của các thực thể mà chúng quan tâm không?
Chính xác. Đây là một cách tiếp cận tiêu chuẩn sẽ cung cấp cho bạn hiệu suất tốt và khá dễ thực hiện. Theo tôi, chi phí bộ nhớ là không đáng kể - chúng tôi đang nói về việc lưu trữ con trỏ.
Bây giờ làm thế nào để duy trì các "danh sách quan tâm" này có thể không rõ ràng. Đối với bộ chứa dữ liệu, std::vector<entity*> targets
bên trong lớp của hệ thống là hoàn toàn đủ. Bây giờ những gì tôi làm là đây:
Xóa một thực thể là hoàn toàn tương tự, với sự khác biệt duy nhất mà chúng tôi loại bỏ nếu một hệ thống khớp với chữ ký hiện tại của chúng tôi (có nghĩa là thực thể đó ở đó) và không khớp với chữ ký mới (có nghĩa là thực thể đó sẽ không còn ở đó nữa ).
Bây giờ bạn có thể xem xét việc sử dụng std :: list vì xóa khỏi vectơ là O (n), không đề cập đến việc bạn sẽ phải chuyển một khối dữ liệu lớn mỗi khi bạn xóa từ giữa. Trên thực tế, bạn không phải - vì chúng tôi không quan tâm đến việc xử lý đơn hàng ở cấp độ này, chúng tôi chỉ có thể gọi std :: remove và sống với thực tế là trên mỗi lần xóa, chúng tôi chỉ phải thực hiện tìm kiếm O (n) cho chúng tôi thực thể cần loại bỏ.
std :: list sẽ cung cấp cho bạn loại bỏ O (1) nhưng ở phía bên kia, bạn có thêm một chút chi phí bộ nhớ. Cũng nên nhớ rằng hầu hết thời gian bạn sẽ xử lý các thực thể và không xóa chúng - và điều này chắc chắn được thực hiện nhanh hơn bằng cách sử dụng std :: vector.
Nếu bạn rất quan trọng về hiệu suất, bạn có thể xem xét ngay cả một mẫu truy cập dữ liệu khác , nhưng bằng cách nào đó bạn vẫn duy trì một số "danh sách quan tâm". Mặc dù vậy, hãy nhớ rằng nếu bạn giữ cho API hệ thống thực thể của mình đủ trừu tượng thì sẽ không thành vấn đề để cải thiện các phương thức xử lý thực thể của hệ thống nếu tốc độ khung hình của bạn giảm vì chúng - vì vậy, bây giờ, hãy chọn phương pháp dễ nhất để bạn viết mã - chỉ sau đó hồ sơ và cải thiện nếu cần.