Uczę się małej części mojego silnika gry i zastanawiam się, jak zoptymalizować niektóre części.Dwukierunkowa struktura danych dla tej sytuacji
Sytuacja jest dość prosta i jest on następujący:
- Mam mapę
Tile
S (przechowywany w bi-wymiarowej tablicy) (~ płytek 260K, ale zakładamy, wiele więcej) - mam listę
Item
s, które zawsze są w co najmniej i co najwyżej dachówki Tile
można logicznie zawierać nieskończoną ilośćItem
s- Podczas wykonywania gra wiele
Item
s są ciągłe ly tworzone i zaczną z własnejTile
- Każdy
Item
nieustannie zmienia swójTile
do jednego z sąsiadów (góra, prawo, dół, lewo)
Do tej pory każdy Item
ma odniesienie do jego rzeczywisty Tile
i po prostu przechowuję listę przedmiotów. Za każdym razem, gdy Item
przesuwa się na sąsiedni kafelek, aktualizuję tylko item->tile = ..
i nic mi nie jest. Działa to dobrze, ale jest jednokierunkowy.
Podczas rozbudowy silnika zdałem sobie sprawę, że muszę znaleźć wszystkie elementy zawarte w kafelku wiele razy, co skutecznie obniża wydajność (szczególnie w niektórych sytuacjach, w których muszę znaleźć wszystkie przedmioty dla zakresu płytek, jeden po drugim).
Oznacza to chciałbym znaleźć struktury danych odpowiedniego znaleźć wszystkie elementy określonego Tile
lepsze niż w O (n), ale chciałbym uniknąć dużo napowietrznych w „przejście od jednej płytki do kolejna "faza (teraz to jest właśnie przypisywanie wskaźnika, chciałbym uniknąć wykonywania wielu operacji tam, ponieważ jest to dość częste).
Zastanawiam się nad niestandardową strukturą danych, aby wykorzystać fakt, że przedmioty zawsze przesuwają się do sąsiedniej komórki, ale w tej chwili szukam po omacku! Każda rada byłaby doceniona, nawet podchwytliwe lub zagadkowe. Niestety nie mogę po prostu marnować pamięci, więc potrzebny jest dobry kompromis.
Rozwijam go w C++ z STL, ale bez zwiększenia. (Tak, wiem o multimap
, to mnie nie satysfakcjonuje, ale spróbuję, jeśli nie znajdę nic lepszego)
Mapa 'Tile' jest już nieprzetworzonym wskaźnikiem dwukierunkowym, np. 'Mapa płytek [WIDTH] [HEIGHT]', więc mam losowy dostęp do całej mapy, ale nie chcę mieć listy przedmiotów dla każdego pola, ponieważ te elementy są rzadkie i nie zajmują dużej strefy sama mapa .. – Jack
To po prostu brzmi jak zły projekt. Najpierw pozbywaj się tablic o ustalonych rozmiarach i używaj wektorów z odpowiednim interfejsem, po czym dodaj element 'Tile' do swoich obiektów, podając wektor lub cokolwiek lokalnie. – 111111
To nie jest zły projekt, mapa jest potrzebna dla całego świata. Każda płytka musi istnieć nie z powodu przedmiotu, ale z powodu wielu innych rzeczy. Jak już powiedziałem, to tylko kawałek silnika :) – Jack