ECS? Tôi thực sự sẽ đề xuất rằng nó có thể không còn sớm nếu như vậy để suy nghĩ nhiều về khía cạnh định hướng dữ liệu của thiết kế và các đại diện khác nhau bởi vì nó có thể ảnh hưởng đến thiết kế giao diện của bạn và sau này rất tốn kém để thay đổi muộn tro choi. Ngoài ra ECS chỉ đòi hỏi rất nhiều công việc và suy nghĩ thẳng thắn và tôi nghĩ rằng đáng để sử dụng một số thời gian đó để đảm bảo rằng nó sẽ không mang lại cho bạn sự đau buồn về hiệu suất ở cấp độ thiết kế khi đưa nó vào trung tâm của bạn toàn bộ động cơ kỳ dị. Phần này trừng mắt với tôi:
unordered_map<string,[yada]>
Ngay cả với tối ưu hóa chuỗi nhỏ, bạn vẫn có một thùng chứa có kích thước thay đổi (chuỗi) bên trong một thùng chứa có kích thước thay đổi khác (unordered_maps). Trong thực tế, tối ưu hóa chuỗi nhỏ thực sự có thể có hại như trong trường hợp này nếu bảng của bạn rất thưa thớt, vì tối ưu hóa chuỗi nhỏ sẽ ngụ ý rằng mỗi chỉ mục không sử dụng của bảng băm vẫn sẽ sử dụng nhiều bộ nhớ hơn cho tối ưu hóa SS ( sizeof(string)
sẽ lớn hơn nhiều) đến mức tổng chi phí bộ nhớ của bảng băm của bạn có thể đắt hơn bất cứ thứ gì bạn lưu trữ vào nó, đặc biệt nếu đó là một thành phần đơn giản như một thành phần vị trí, ngoài việc phát sinh thêm bộ nhớ cache với bước tiến lớn để có được từ một mục trong bảng băm tiếp theo.
Tôi giả sử chuỗi là một loại khóa, như ID thành phần. Nếu vậy, điều này đã làm cho mọi thứ rẻ hơn đáng kể:
unordered_map<int,[yada]>
... Nếu bạn muốn những lợi ích của việc có thể có những tên thân thiện với người dùng mà các nhà viết kịch bản có thể sử dụng, ví dụ, các chuỗi được thực hiện có thể cung cấp cho bạn những điều tốt nhất của cả hai thế giới ở đây.
Điều đó nói rằng, nếu bạn có thể ánh xạ chuỗi tới một phạm vi các chỉ số được sử dụng dày đặc, thì bạn có thể làm điều này:
vector<[yada]> // the index and key become one and the same
Lý do tôi không xem xét việc này quá sớm là vì một lần nữa, nó có thể ảnh hưởng đến các thiết kế giao diện của bạn. Quan điểm của DOD không phải là cố gắng đưa ra các biểu diễn dữ liệu hiệu quả nhất có thể tưởng tượng được trong một lần IMO (điều đó thường phải đạt được lặp đi lặp lại khi cần thiết), nhưng hãy nghĩ về chúng đủ để thiết kế giao diện trên đầu để làm việc với điều đó dữ liệu khiến bạn có đủ phòng thở để lập hồ sơ và tối ưu hóa mà không thay đổi thiết kế theo tầng.
Như một ví dụ ngây thơ, một phần mềm xử lý video kết hợp tất cả các mã của nó chống lại điều này:
// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels,
// 16-bit channels, 32-bit channels, grayscale, monochrome,
// etc. pixels.
class IPixel
{
public:
virtual ~IPixel() {}
...
};
Sẽ không đi xa mà không có khả năng viết lại có khả năng sử thi, vì ý tưởng trừu tượng hóa ở mức pixel đơn lẻ cực kỳ kém hiệu quả ( vptr
bản thân nó thường sẽ tốn nhiều bộ nhớ hơn toàn bộ pixel) so với trừu tượng hóa ở cấp độ hình ảnh (sẽ thường đại diện cho hàng triệu pixel). Vì vậy, hãy suy nghĩ đầy đủ về các biểu diễn dữ liệu của bạn trước để bạn không phải đối mặt với kịch bản ác mộng như vậy, và lý tưởng là không còn nữa, nhưng ở đây tôi nghĩ rằng đáng để suy nghĩ về công cụ này ngay từ đầu vì bạn không muốn xây dựng một công cụ phức tạp xung quanh ECS của bạn và thấy rằng chính ECS là nút cổ chai theo những cách yêu cầu bạn thay đổi mọi thứ ở mức thiết kế.
Đối với các lỗi bộ đệm ECS, theo tôi, các nhà phát triển thường cố gắng quá mức để làm cho bộ đệm ECS của họ thân thiện. Nó bắt đầu mang lại quá ít tiếng nổ cho việc cố gắng truy cập tất cả các thành phần của bạn theo cách hoàn toàn liền kề và thường sẽ ngụ ý sao chép và xáo trộn dữ liệu ở mọi nơi. Nói chung, nó đủ tốt để chỉ các chỉ số thành phần sắp xếp cơ số trước khi truy cập chúng để bạn truy cập chúng theo cách mà ít nhất bạn không tải một vùng bộ nhớ vào một dòng bộ đệm, chỉ để đuổi nó đi, sau đó tải tất cả lặp lại trong cùng một vòng lặp chỉ để truy cập vào một phần khác của cùng một dòng bộ đệm. Và một ECS không phải cung cấp hiệu quả đáng kinh ngạc trên tất cả các bảng. Nó không giống như một hệ thống đầu vào được hưởng lợi nhiều như hệ thống vật lý hoặc kết xuất, vì vậy tôi khuyên bạn nên nhắm đến mục tiêu "tốt" hiệu quả trên bảng và "xuất sắc" chỉ ở những nơi bạn thực sự cần nó. Điều đó nói rằng, sử dụngunordered_map
và string
ở đây là đủ dễ dàng để tránh.