2009-10-29 58 views
106

Tôi đã đọc this article, và anh chàng này cứ nói về cách mọi người có thể hưởng lợi rất nhiều từ việc trộn lẫn trong thiết kế theo hướng dữ liệu với OOP. Tuy nhiên, anh ta không hiển thị bất kỳ mẫu mã nào.Thiết kế theo định hướng dữ liệu là gì?

Tôi googled điều này và không thể tìm thấy bất kỳ thông tin thực sự nào về điều này, hãy để một mình bất kỳ mẫu mã nào. Có ai quen thuộc với thuật ngữ này và có thể cung cấp một ví dụ? Đây có phải là một từ khác cho cái gì khác không?

+6

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

+28

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

+0

Đâ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

Trả lời

207

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ì.

+0

Cảm ơn vì điều này, bạn đã giải thích rất rõ. – ryeguy

+2

cũng nói; Tôi chỉ có một câu hỏi. Giả sử chúng ta có cấu trúc 'struct balls {vector pos; vectơ vận tốc;} ', sẽ không cập nhật vị trí của mỗi quả bóng thực sự đè bẹp bộ nhớ cache vì bạn di chuyển qua lại giữa vector tốc độ và vectơ vị trí (có các máy hiện đại và các dòng bộ nhớ cache và tất cả điều đó, đây là cũng chỉ là một minh họa)? – falstro

+12

Có thể. Nhưng hãy nhớ rằng toàn bộ mảng pos sẽ không bị kéo vào cùng một lúc. Chỉ một dòng bộ nhớ cache và có thể một số tìm nạp trước. Tương tự như vậy với vận tốc. Vì vậy, đối với họ để thùng rác nhau mỗi đoạn tương ứng của pos và vector phải ánh xạ tới cùng một đường dẫn. Điều đó tất nhiên có thể xảy ra, đó là lý do tại sao khuyến nghị là đặt các biến được sử dụng cùng nhau trong một cấu trúc. Vì vậy, ví dụ: vận tốc và pos sẽ ở trong một vector trong khi màu sắc sẽ ở trong một vectơ khác. –

0

Thiết kế định hướng dữ liệu là thiết kế trong đó logic của ứng dụng được tạo từ bộ dữ liệu, thay vì các thuật toán thủ tục. Ví dụ:

phương pháp tiếp cận thủ tục.

int animation; // this value is the animation index 

if(animation == 0) 
    PerformMoveForward(); 
else if(animation == 1) 
    PerformMoveBack(); 
.... // etc 

cách tiếp cận thiết kế dữ liệu

typedef struct 
{ 
    int Index; 
    void (*Perform)(); 
}AnimationIndice; 

// build my animation dictionary 
AnimationIndice AnimationIndices[] = 
    { 
     { 0,PerformMoveForward } 
     { 1,PerformMoveBack } 
    } 

// when its time to run, i use my dictionary to find my logic 
int animation; // this value is the animation index 
AnimationIndices[animation].Perform(); 

thiết kế dữ liệu như thế này thúc đẩy việc sử dụng dữ liệu để xây dựng logic của ứng dụng. Việc quản lý dễ dàng hơn đặc biệt là trong các trò chơi video có thể có hàng nghìn đường dẫn logic dựa trên hoạt ảnh hoặc một số yếu tố khác.

+9

Điều này thực sự không chính xác. Bạn đang bối rối thiết kế theo định hướng dữ liệu với thiết kế theo hướng dữ liệu. Tôi đã làm điều tương tự cho đến khi tôi đọc bài báo của Noel và nhận ra rằng anh đang nói về một điều gì đó hoàn toàn khác. –

+9

Ngoài ra, Indice không phải là một từ. Có "chỉ mục" và "chỉ mục" và thậm chí một số chỉ trích "chỉ mục", nhưng "chỉ số" không bao giờ đúng. – Baxissimo

11

Tôi chỉ muốn chỉ ra rằng Noel đang nói cụ thể về một số nhu cầu cụ thể mà chúng ta phải đối mặt trong phát triển trò chơi. Tôi cho rằng các lĩnh vực khác đang thực hiện mô phỏng mềm thời gian thực sẽ được hưởng lợi từ điều này, nhưng nó không phải là một kỹ thuật sẽ cho thấy sự cải thiện đáng kể đối với các ứng dụng kinh doanh nói chung. Thiết lập này là để đảm bảo rằng mỗi bit cuối cùng của hiệu suất được vắt ra khỏi phần cứng cơ bản.

+0

Đồng ý. Một số khu vực khác có thiết kế theo định hướng dữ liệu quan trọng là: phần cứng và phần mềm cho thiết bị băng thông cao (ví dụ: mạng hoặc bộ nhớ); máy tính khoa học quy mô lớn (ví dụ: mô phỏng thời tiết, gấp protein), xử lý tín hiệu (ví dụ: âm thanh, hình ảnh, video), nén dữ liệu. Chúng thuộc "Khoa học và Kỹ thuật Tính toán" đôi khi được cung cấp như một chuyên ngành riêng biệt với Khoa học Máy tính thông thường hơn. – rwong

11

Mike Acton đã có cuộc trao đổi nào về Data oriented design thời gian gần đây:

tóm tắt cơ bản của tôi về nó sẽ là: nếu bạn muốn thực hiện, sau đó suy nghĩ về luồng dữ liệu, tìm lớp lưu trữ đó là nhiều khả năng vặn với bạn và tối ưu hóa cho nó cứng. Mike đang tập trung vào bộ nhớ cache L2, bởi vì anh ấy đang làm thời gian thực, nhưng tôi tưởng tượng điều tương tự cũng áp dụng cho cơ sở dữ liệu (đọc đĩa) và thậm chí cả Web (yêu cầu HTTP). Đó là một cách hữu ích để lập trình hệ thống, tôi nghĩ vậy.Lưu ý rằng nó không giúp bạn khỏi suy nghĩ về thuật toán và độ phức tạp về thời gian, nó chỉ tập trung sự chú ý của bạn vào việc tìm ra loại hoạt động đắt nhất mà bạn phải nhắm tới với kỹ năng CS điên của bạn.

Các vấn đề liên quan