Ориентиран към данни срещу обектно-ориентиран дизайн

Видеоигрите са алчни. Те могат да изискват огромно количество оперативна памет, обработваща мощност и като цяло да поставят тон напрежение на физическия хардуер, отговорен за извличането, манипулирането и връщането на данни. Поради тази причина се появиха редица привърженици на ориентиран към данни дизайн, който казва, че може би обектно-ориентираният дизайн не е най-добрият начин за организиране на кода, който управлява тези монолитни приложения.

И така, какво е ориентиран към данни дизайн, как се различава от OOP и какви са някои правила, свързани с това как да мислите за писането на DOP код?

По какво се различава от OOP?

Както подсказва името му, обектно-ориентираното програмиране е съсредоточено около дефиниране, производство и работа с обекти. Той насочва кодерите към:

  1. Установете какви са обектите.
  2. Определете какви видове данни принадлежат на даден обект.
  3. Опишете функционалността на обекта.

След това тези обекти взаимодействат с други обекти чрез функциите, които всеки обект притежава.

Как работят обектите в OOP

Едно от големите предимства на OOP е колко тясно изглежда да отразява как взаимодействаме с реалния свят. Например, като знам нещо за класа „Таблици“, мога да си спестя много време, като знам какво мога и не мога да правя с таблица. Никога няма да посочите инстанция на таблица и да попитате „Какъв тип капучино прави тази таблица?“, Тъй като класът на таблиците не дава на таблиците функционалност да правят капучино.

От тази концепция получаваме и ползата от полиморфизма (Poly - Many; Morph - Forms) описва модел в обектно ориентираното програмиране, при което класовете имат различна функционалност, докато споделят общ интерфейс. Ако мислите за класификацията на животните, знаейки, че котка и тигър са част от класа „котешки“, аз автоматично знам много за всеки от тях, без да се гмуркам в каквито и да било специфики на техните конкретни класове. И двете „наследяват“ определени атрибути и данни от по-високия клас на котки.

Но с тази парадигма функциите са ограничени до определени части данни и не могат да бъдат използвани повторно. Ако искате дадена функция да работи върху различен фрагмент от данни в даден обект, тази функция трябва или да наследи от родителски клас, или трябва да бъде пренаписана. Важно е да помислите как в тази парадигма се осъществява достъп до данните, съхранявани в клас, който наследява от родителски клас. Данните трябва да бъдат извлечени чрез множество класове, за да бъдат достъпни процесорът, което може да бъде неефективно.

Пример за работата, която един процесор може да свърши в OOP система.

Ориентирано към данни програмиране подхожда към кодирането по малко по-различен начин. Вместо предмети всичко е данни и върху всичко може да се действа. Това разделя функционалността и данните. Те вече не са преплетени от определен набор от правила. В DOP вашите функции са с общо предназначение и се прилагат към големи парчета данни. В идеалния случай бихте структурирали данните възможно най-близо до изходните данни, за да гарантирате, че най-малко усилия се полагат от самата функция.

„Дизайнът, ориентиран към данни, измества перспективата на програмирането от обекти към самите данни: Типът на данните, как се разполагат в паметта и как ще бъдат четени и обработени в играта.“
Пример за DOP последователност за обаждания. Много по-малко работа за процесора.

Защо DOP?

Простият отговор е, защото процесорите обичат референтното местоположение. Тези правила диктуват много от другите предимства, дадени ни с DOP. Например, писането на код, който оптимизира за местността на справка, ни дава много по-лесен начин да реализираме Паралелизация. Паралелизацията се опитва да използва повече от едно ядро ​​на процесора на компютри, за да изпълнява задачи едновременно. Това може да се окаже изключително трудно с OOP, защото рискувате няколко потока на процесора да се опитват едновременно да получат достъп до едни и същи данни. Въпреки това, когато групирате единомислени данни заедно и пишете код, фокусирайки се върху данните, които ще се обработват като цяло, става много по-лесно да използвате няколко нишки на процесора за обработка на тези функции.

Друго предимство на DOP е ефективното използване на кеширане на паметта. Тъй като DOP използва едни и същи функции отново и отново, кешът не е принуден да запаметява все повече и повече нови, но не-наистина нови блокове с инструкции.

Източници

https://www.danielsefton.com/2016/05/developing-a-data-oriented-game-engine-part-1/

https://www.packtpub.com/books/content/what-difference-between-functional-and-object-oriented-programming

https://www.gamasutra.com/view/news/126498/Opinion_What_You_Need_To_Give_Up_When_Going_Data_Oriented.php

https://prateekvjoshi.com/2013/11/30/programming-paradigms-object-oriented-vs-data-oriented/

http://gamesfromwithin.com/data-oriented-design