latajacaryba Temat założony przez niniejszego użytkownika |
Wydajność: zmienne statyczne dla każdej podklasy czy wskaźniki » 2017-08-16 12:14:58 Witam. Mam problem, otóż potrzebuję zrobić mapę, która będzie składać się z powiedzmy miliona małych obszarów. Niektóre z nich będą bardzo często się powtarzać (np. ok 0,5 mln). Jednak mapa będzie mogła być zapisywana, dlatego potrzebuję ID każdego obszaru. Tu zaczynają się schody, bo pomyślałem, że skoro mamy obszar np. trawiasty i występuje 200k razy, to nie ma sensu, by wczytywać dla każdego teksturę, tylko zrobić to tak: Sposób 1: abstrakcyjna klasa podstawowa, zawiera metody czysto wirtualne pozwalające na dalszą prace z obszarami. klasy konkretnych obszarów po niej dziedziczą, np. obszar 'trawiasty' posiada const static sf::Texture Texture która będzie używana, dla wszystkich obszarów oraz wspomniane const static int ID . Jedyny mankament tego sposobu to to, że przy kilkudziesięciu obszarach muszę tworzyć kilkadziesiąt klas (nowy obszar = nowa klasa). Jest to złe, bo te klasy niczym się nie różnią jeśli chodzi o składniki, różnią się tylko zawartością składników statycznych Sposób 2: Tworze klasę "obszar" która posiada wskaźniki do tekstury, ID, itp. a potem w programie tworzę sobie tablice tekstur i konkretnemu obszarowi przypisuje konkretną teksturę. Ten sposób jest jak mniemam bardziej zasobożerny (przypominam, ok miliona obiektów). Który sposób jest lepszy? A może zaproponujecie własny? Z góry dzięki. Dla zasady dodam, że nie zamierzam ich wszystkich na raz wyświetlać ;) |
|
mokrowski |
» 2017-08-16 12:47:18 Pomysłów jest wiele... może taki...
Zrób ResourceManager'a który po podaniu ID (może nim być nawet string) w wywołaniu z klasy klienckiej, wczyta teksturę i ją zwróci (np. przez referencję stałą). Jeśli dana tekstura już była wczytywana, nie będzie czytana ponownie. Mapa kojarzeń ID->plik_tekstury.png (png dla przykładu, może być inny), zapisz w pliku konfiguracji który będzie czytany na początku życia ResourceManager'a. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-16 13:04:18 Czyli np. switch( ID ) { case 0: return Texture[ 0 ]; case 1: return Texture[ 1 ] }
Z tym problemu nie będzie. PS. co to klasa kliencka :P? |
|
mokrowski |
» 2017-08-16 17:07:22 Klasa kliencka czyli ta "która pyta o teksturę i chce by była nią prezentowana". Raczej nie switch/case a struktura mapy/unordered_map'y. Coś co będzie trzymało odwzorowanie klucz_id->tekstura. Przez klucz_id zapytasz o np. "trawa" i dostaniesz jej teksturę :-) Później jeszcze zaimplementujesz sprawdzenie czy przypadkiem dana tekstura już nie jest wczytana na rzecz innej klasy. Ale tu nie wiem czy będziesz miał takie przypadki różnych klas z tą samą teksturą. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-16 19:18:21 Ok, dzięki, popatrzę za tą mapą. A masz jakieś pomysły odnośnie tego, czy ID powinno być przechowywane w każdej osobnej klasie jako zmienna statyczna (tak samo tekstura), czy jedna klasa dla wszystkich obszarów, ale niestatyczne ID i niestatyczny wskaźnik na teksturę? |
|
jankowalski25 |
» 2017-08-16 19:52:48 Jedna klasa powinna wystarczyć. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-08-16 20:23:56 Ok, ale wziąłeś pod uwagę milion intów i wskaźników pod uwagę? :P PS. A jeśli pewny rodzaj pola może porosnąć trawą, i zrobie tak: pole<-----PoleMogąceZarosnąć I mam powiedzmy tablicę wskaźników do pól, to jak mam sprawdzić, czy jest to zwykłe pole, czy to mogące zarosnąć? Myślałem, by zrobić w klasie pole metodę wirtualną "CzyMozeZarosnac()" i zwracać false a w klasie dziedziczącej PoleMogąceZarosnąć zwracać true, ale na tej zasadzie musiałbym zrobić metodę wirtualną WzrostTrawy() bo mogę zrobić tylko tak: Pole * Pola[ 1000 ][ 1000 ];
if( Pola[ x ][ y ].CzyMozeZarosnac() ) { Pola[ x ][ y ].WzrostTrawy(); }
|
|
jankowalski25 |
» 2017-08-16 21:00:20 wziąłeś pod uwagę milion intów i wskaźników pod uwagę? |
Dlaczego chcesz to tak zapisywać? Możesz inaczej zdefiniować format, aby dane były nieco bardziej skompresowane. Na przykład jeśli obszary tego samego typu występują obok siebie, to możesz podzielić to na podobszary opisane prostokątami. |
|
« 1 » 2 3 4 |