2009-10-29 11 views
106

Czytałem this article, a ten facet mówi o tym, jak każdy może odnieść wiele korzyści z miksowania projektów zorientowanych na dane z OOP. Nie pokazuje jednak żadnych próbek kodu.Co to jest projektowanie zorientowane na dane?

Przeszukałem to i nie mogłem znaleźć żadnych prawdziwych informacji o tym, co to jest, nie mówiąc już o próbkach kodu. Czy ktoś zna ten termin i może podać przykład? Czy to może być inne słowo na coś innego?

+6

Ten artykuł w dziale Game developer jest teraz dostępny w formie łatwej do odczytania w formie bloga: http://gamesfromwithin.com/data-oriented-design – Edmundito

+28

Czy kiedykolwiek wylogowaliście się z wyszukiwarki, znaleźliście ładnie ukierunkowane pytanie na temat SO, a potem zrozumieliście to ty pytałeś to lata temu? – ryeguy

+0

Oto [Agregat zawartości DOD] (http://www.asawicki.info/news_1422_data-oriented_design_-_links_and_thoughts.html) w Internecie – legends2k

Odpowiedz

207

Po pierwsze nie należy mylić tego z projektem opartym na danych.

Moje zrozumienie projektowania zorientowanego na dane polega na tym, że chodzi o organizowanie danych w celu wydajnego przetwarzania. Zwłaszcza w przypadku chybień w pamięci podręcznej itp. Z drugiej strony Design oparty na danych ma na celu umożliwienie kontroli danych wielu zachowań programów (opisane bardzo dobrze przez Andrew Keith's answer).

Say masz przedmiotów piłką w swoim wniosku o właściwościach takich jak kolor, promień, bounciness, położenie itp

Object Oriented Approach

W OOP opisałbyś ci kulki tak:

class Ball { 
    Point position; 
    Color color; 
    double radius; 

    void draw(); 
}; 

a potem by stworzyć kolekcję piłek tak:

vector<Ball> balls; 

danych podejście zorientowane

W danych Projektowanie zorientowane jednak jest bardziej prawdopodobne, aby napisać kod tak:

class Balls { 
    vector<Point> position; 
    vector<Color> color; 
    vector<double> radius; 

    void draw(); 
}; 

Jak widać istnieje żadna pojedyncza jednostka reprezentująca jedną piłkę więcej. Obiekty kulkowe istnieją tylko niejawnie.

Może to mieć wiele zalet pod względem wydajności. Zwykle chcemy wykonywać operacje na wielu piłkach w tym samym czasie. Sprzęt zazwyczaj wymaga dużych ciągłych porcji pamięci, aby działać sprawnie.

Po drugie, możesz wykonywać operacje, które dotyczą tylko części właściwości piłek. Na przykład. jeśli połączysz kolory wszystkich kulek na różne sposoby, chcesz, aby pamięć podręczna zawierała tylko informacje o kolorach. Jednak, gdy wszystkie właściwości piłki są przechowywane w jednym urządzeniu, będziesz także pobierał wszystkie inne właściwości piłki. Nawet jeśli ich nie potrzebujesz.

cache Przykład

Say kulka każda kula zajmuje 64 bajtów i temperaturze trwa 4 bajty. Slot pamięci podręcznej zajmuje również 64 bajty. Jeśli chcę zaktualizować pozycję 10 kulek, muszę pobrać 10 * 64 = 640 bajtów pamięci do pamięci podręcznej i uzyskać 10 braków w pamięci podręcznej. Jeśli jednak mogę pracować na pozycjach kul jako oddzielnych jednostek, to zajmie to tylko 4 * 10 = 40 bajtów. To pasuje do jednego pobrania pamięci podręcznej. W ten sposób otrzymujemy tylko 1 brak pamięci podręcznej, aby zaktualizować wszystkie 10 kulek. Te liczby są arbitralne Zakładam, że blok pamięci podręcznej jest większy.

Ale ilustruje to, jak układ pamięci może mieć silne trafienia w pamięci podręcznej, a tym samym wydajność. To tylko zwiększy znaczenie, ponieważ różnica między szybkością procesora i pamięci RAM się zwiększy.

jak układ pamięci

W moim przykładzie kuli I uprościł wydać dużo, bo zazwyczaj dla każdej normalnej aplikacji będzie prawdopodobnie dostęp do wielu zmiennych razem. Na przykład. pozycja i promień będą prawdopodobnie często używane razem. Wówczas struktura powinna być:

class Body { 
    Point position; 
    double radius; 
}; 

class Balls { 
    vector<Body> bodies; 
    vector<Color> color; 

    void draw(); 
}; 

Powodem należy to zrobić, że jeśli dane wykorzystywane razem są umieszczone w oddzielnych tablic, istnieje ryzyko, że będą one konkurować na tych samych szczelin w pamięci podręcznej. Zatem załadowanie jednego spowoduje odrzucenie drugiego.

W porównaniu do programowania zorientowanego obiektowo klasy, które tworzysz, nie są powiązane z jednostkami w twoim modelu mentalnym problemu. Ponieważ dane są łączone ze sobą w oparciu o wykorzystanie danych, nie zawsze będziesz mieć sensowne nazwy, które umożliwią Ci zajęcia w projektowaniu zorientowanym na dane.

Stosunek do relacyjnych baz danych

Myślenie za projektowanie zorientowane danych jest bardzo podobny do tego, jak myślisz o relacyjnych bazach danych. Optymalizacja relacyjnej bazy danych może również wymagać wydajniejszego wykorzystania pamięci podręcznej, chociaż w tym przypadku pamięć podręczna nie jest pamięci podręcznej procesora, która umieszcza strony w pamięci. Dobry projektant baz danych prawdopodobnie podzieli rzadko odwiedzane dane na osobną tabelę, zamiast tworzyć tabelę z ogromną liczbą kolumn, z których tylko kilka kolumn jest kiedykolwiek używanych. Może także zdecydować się na denormalizację niektórych tabel, aby dane nie były dostępne z wielu lokalizacji na dysku. Podobnie jak w przypadku projektowania zorientowanego na dane, te wybory są dokonywane przez sprawdzenie, jakie są wzorce dostępu do danych i gdzie występuje wąskie gardło wydajności.

+0

Dziękuję za to, wyjaśniłeś to bardzo dobrze. – ryeguy

+2

dobrze powiedziane; Mam tylko jedno pytanie. Powiedzmy, że mamy strukturę 'struct balls {vector pos; wektor prędkość;} ', nie aktualizowałby pozycji każdej z piłek w rzeczywistości rzucającej na pamięć podręczną, ponieważ poruszałbyś się w przód i w tył między wektorem prędkości a wektorem pozycji (tak, nowoczesne maszyny i linie pamięci podręcznej i tak dalej, to jest także tylko ilustracja)? – falstro

+12

Może. Pamiętaj jednak, że cała tablica pos nie zostanie wciągnięta na raz. Tylko jedna linia pamięci podręcznej i możliwe pewne wstępne pobieranie. Podobnie z prędkością. Aby mogli się pozbyć śmieci, każdy odpowiadający fragment pos i wektor musi zostać odwzorowany na tę samą pamięć podręczną. To oczywiście może się zdarzyć, dlatego zalecenie polega na umieszczeniu zmiennych, które są używane razem w strukturze. Np. prędkość i poz będą w jednym wektorze, podczas gdy kolor będzie w innym wektorze. –

0

Projektowanie zorientowane na dane to projekt, w którym logika aplikacji składa się z zestawów danych, a nie z algorytmów proceduralnych. Na przykład:

Podejście procesowe.

int animation; // this value is the animation index 

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

podejście projektowe dane

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(); 

wzory dane, jak to promować wykorzystanie danych do budowania logiki aplikacji. Łatwiej jest nim zarządzać, zwłaszcza w grach wideo, które mogą mieć tysiące ścieżek logicznych opartych na animacji lub innym czynniku.

+9

To nie jest poprawne. Mylicie zorientowany na dane projekt z projektem opartym na danych. Zrobiłem to samo, dopóki nie przeczytałem artykułu Noela i zdałem sobie sprawę, że mówi o czymś zupełnie innym. –

+9

Również Indice nie jest słowem. Istnieją "indeksy" i "indeksy", a niektóre nawet "podpowiadane" indeksy, ale "indeks" nigdy nie jest właściwy. – Baxissimo

11

Chcę tylko podkreślić, że Noel mówi konkretnie o niektórych specyficznych potrzebach, z jakimi mamy do czynienia przy tworzeniu gier. Przypuszczam, że inne sektory, które wykonują symulacje w czasie rzeczywistym, skorzystają z tego, ale jest mało prawdopodobne, aby była to technika, która wskaże zauważalną poprawę ogólnych aplikacji biznesowych. Ta konfiguracja zapewnia, że ​​każdy najmniejszy kawałek wydajności zostanie wyciśnięty z podstawowego sprzętu.

+0

Uzgodnione. Inne obszary, w których projektowanie zorientowane na dane jest znaczące, to: sprzęt i oprogramowanie układowe dla urządzeń o dużej przepustowości (na przykład sieci lub pamięci masowej); przetwarzanie naukowe na dużą skalę (na przykład symulacja pogody, zwijanie białka), przetwarzanie sygnału (na przykład audio, obraz, wideo), kompresja danych. Są one objęte "Informatyką obliczeniową i inżynierią", która czasami jest oferowana jako osobny dodatek do bardziej typowej informatyki. – rwong

11

Mike Acton wygłosił publiczny wykład o Data oriented design ostatnio:

Moje podstawowe zestawienie byłoby: jeśli chcesz wydajność, a potem myśleć o przepływie danych, znajdź warstwę pamięci masowej, która jest najbardziej prawdopodobne, aby śruba ze sobą i zoptymalizuj ją pod kątem twardości . Mike koncentruje się na chybionych pamięciach podręcznych L2, ponieważ robi to w czasie rzeczywistym, ale wyobrażam sobie, że to samo dotyczy baz danych (odczytów dysku), a nawet sieci (żądania HTTP). Uważam, że jest to przydatny sposób programowania systemów.

Należy pamiętać, że nie zwalnia to od myślenia o algorytmach i złożoności czasowej, skupia się jedynie na określeniu najdroższego rodzaju operacji, którą następnie należy obrać za pomocą szalonych umiejętności CS.