Ориентиран към данни дизайн

Ориентиран към данни дизайн. Виртуални функции.

Наскоро имаше доста интересна дискусия за DOD (Data Oriented Design). Следвах някои от аргументите от дискусията и исках сам да изпробвам тази техника. Най-важното е, че съм програмист, обсебен от оптимизацията. Исках да се уверя, че DOD дава много голям тласък на производителността. Всъщност, може ли виртуалните функции или няколко допълнителни байта в структурата, 30 години след пускането на процесори x86, да са толкова важни по отношение на производителността?

За да разберем, нека дефинираме двойка обекти - Автомобил и Камион. Следвайки правилата на традиционния ООП и имайки предвид, че и двата обекта могат да бъдат преместени, нека ги накараме да наследят от класа Movable. След това ще актуализираме тези обекти във всеки кадър, както би било в играта.

Не изглежда сложно. Добавих някои полета с данни за класовете Car и Truck, за да могат да бъдат добавени към кеша при актуализиране на всеки обект.

Сега за мениджърите на актуализации. Написах няколко различни мениджъри на актуализации, за да тествам различни начини за актуализиране на подвижни обекти. Най-лошият от тях ми се струва вектор std: vector от указатели към обектите Cars & Trucks. Всички обекти се „актуализират“, така че да не могат да бъдат разположени последователно в паметта, поради което получаваме големи загуби в кеша.

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