Trước hết, đừng nhầm lẫn điều này với thiết kế hướng dữ liệu.
Sự hiểu biết của tôi về Thiết kế hướng dữ liệu là việc sắp xếp dữ liệu của bạn để xử lý hiệu quả. Đặc biệt là đối với bộ nhớ cache bỏ lỡ vv Thiết kế điều khiển dữ liệu mặt khác là về cho phép dữ liệu kiểm soát rất nhiều hành vi chương trình của bạn (được mô tả rất tốt bởi Andrew Keith's answer).
Giả sử bạn có các đối tượng bóng trong ứng dụng của bạn với những đặc tính như màu sắc, bán kính, bounciness, vị trí, vv
Object Oriented Approach
Trong OOP bạn sẽ mô tả bạn quả bóng như thế này:
class Ball {
Point position;
Color color;
double radius;
void draw();
};
Và sau đó bạn sẽ tạo một bộ sưu tập các quả bóng như thế này:
vector<Ball> balls;
liệu hướng tiếp cận
Trong Thiết kế dữ liệu Oriented tuy nhiên bạn có nhiều khả năng để viết mã như thế này:
class Balls {
vector<Point> position;
vector<Color> color;
vector<double> radius;
void draw();
};
Như bạn có thể thấy không có đơn vị duy nhất đại diện cho một bóng nữa. Bóng đối tượng chỉ tồn tại ngầm.
Điều này có thể có nhiều lợi thế về hiệu suất. Thông thường chúng tôi muốn thực hiện nhiều thao tác trên nhiều quả bóng cùng một lúc. Phần cứng thường muốn khối lượng bộ nhớ liên tục lớn hoạt động hiệu quả.
Thứ hai, bạn có thể thực hiện các thao tác chỉ ảnh hưởng đến một phần thuộc tính bóng. Ví dụ. nếu bạn kết hợp các màu của tất cả các quả bóng theo nhiều cách khác nhau, thì bạn muốn bộ nhớ cache chỉ chứa thông tin màu. Tuy nhiên khi tất cả các thuộc tính bóng được lưu trữ trong một đơn vị, bạn sẽ kéo tất cả các thuộc tính khác của quả bóng. Mặc dù bạn không cần chúng.
cache Cách sử dụng Ví dụ
Nói một quả bóng mỗi bóng chiếm 64 byte và một điểm mất 4 byte. Một khe cắm bộ nhớ cache cũng nói 64 byte. Nếu tôi muốn cập nhật vị trí của 10 quả bóng, tôi phải kéo trong 10 * 64 = 640 byte bộ nhớ vào bộ nhớ cache và nhận được 10 bộ nhớ cache nhớ. Tuy nhiên, nếu tôi có thể làm việc các vị trí của quả bóng như các đơn vị riêng biệt, điều đó sẽ chỉ mất 4 * 10 = 40 byte. Điều đó phù hợp với một lần tìm nạp bộ nhớ cache. Vì vậy, chúng tôi chỉ nhận được 1 bộ nhớ cache bỏ lỡ để cập nhật tất cả 10 quả bóng. Những con số này là tùy ý Tôi giả sử một khối bộ nhớ cache lớn hơn.
Nhưng nó minh họa cách bố trí bộ nhớ có thể có số lần truy cập bộ nhớ cache hiệu quả nghiêm trọng và do đó hiệu suất. Điều này sẽ chỉ tăng tầm quan trọng vì sự khác biệt giữa tốc độ CPU và RAM mở rộng.
Làm thế nào để bố trí bộ nhớ
Trong ví dụ bóng của tôi, tôi đơn giản hóa vấn đề này rất nhiều, vì thường cho bất kỳ ứng dụng bình thường bạn có thể sẽ truy cập vào nhiều biến số với nhau. Ví dụ. vị trí và bán kính có thể sẽ được sử dụng cùng nhau thường xuyên. Sau đó, cấu trúc của bạn nên là:
class Body {
Point position;
double radius;
};
class Balls {
vector<Body> bodies;
vector<Color> color;
void draw();
};
Lý do bạn nên làm điều này là nếu dữ liệu được sử dụng cùng được đặt trong mảng riêng biệt, có một nguy cơ là họ sẽ cạnh tranh cho các khe tương tự trong bộ nhớ cache. Vì vậy tải một sẽ ném ra khác.
Vì vậy, so với lập trình hướng đối tượng, các lớp học bạn tạo ra không liên quan đến các thực thể trong mô hình tinh thần của bạn về vấn đề. Vì dữ liệu được gộp lại với nhau dựa trên việc sử dụng dữ liệu, bạn sẽ không phải lúc nào cũng có tên hợp lý để cung cấp cho các lớp của bạn trong Thiết kế định hướng dữ liệu.
Quan hệ với cơ sở dữ liệu quan hệ
Những suy nghĩ đằng sau thiết kế dữ liệu hướng rất giống với cách bạn suy nghĩ về cơ sở dữ liệu quan hệ. Tối ưu hóa một cơ sở dữ liệu quan hệ cũng có thể liên quan đến việc sử dụng bộ nhớ cache hiệu quả hơn, mặc dù trong trường hợp này, bộ nhớ cache không phải là bộ nhớ cache CPU đặt các trang trong bộ nhớ. Một nhà thiết kế cơ sở dữ liệu tốt cũng sẽ có khả năng tách dữ liệu truy cập không thường xuyên vào một bảng riêng biệt thay vì tạo một bảng với số lượng lớn các cột chỉ là một vài cột được sử dụng. Anh ta cũng có thể chọn không chuẩn hóa một số bảng để dữ liệu không phải được truy cập từ nhiều vị trí trên đĩa. Cũng giống như với Thiết kế định hướng dữ liệu, các lựa chọn này được thực hiện bằng cách xem xét các mẫu truy cập dữ liệu là gì và nơi nút cổ chai hiệu suất là gì.
Bài viết đó trong Nhà phát triển trò chơi hiện có sẵn ở dạng dễ đọc dưới dạng blog: http://gamesfromwithin.com/data-oriented-design – Edmundito
Các bạn đã từng googled một cái gì đó, tìm thấy một câu hỏi SO nhắm mục tiêu tốt đẹp, và sau đó nhận ra đó là bạn đã hỏi nó nhiều năm trước? – ryeguy
Đây là một [Tổng hợp nội dung DOD] (http://www.asawicki.info/news_1422_data-oriented_design_-_links_and_thoughts.html) trên web – legends2k