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.
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
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
Oto [Agregat zawartości DOD] (http://www.asawicki.info/news_1422_data-oriented_design_-_links_and_thoughts.html) w Internecie – legends2k