Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

kontener do często sortowanych, niewiele zmieniających się danych.

Ostatnio zmodyfikowano 2018-03-13 23:58
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
kontener do często sortowanych, niewiele zmieniających się danych.
» 2018-03-07 02:27:35
Witam. Jestem w trakcie tworzenia mapy kafelkowej, w której obiekty są wyświetlane od góry do dołu tak, by obiekt który jest bliżej był wyświetlany później, Aby mógł ewentualnie zasłonić - już narysowane - obiekty w oddali.

Oczywiście sprowadza się to do sortowania obiektów, na podstawie pozycji. Zastanawiam się, który kontener będzie najlepszy do przechowywania danych i ich sortowania. Tu jednak dochodzi ciekawa sprawa; większość obiektów, jak drzewo, dom, itp. będzie rzecz jasna statyczna i pozycja nie będzie się zmieniała, więc wydawałoby się, że wystarczy raz posortować np. vector tych obiektów i po kolei wyświetlać. Ale prócz tego, mamy również obiekty, które mogą się poruszać. Jest ich znacznie mniej i dlatego właśnie zastanawiam sie, jaki kontener zastosować.

Jeśli na ekranie mamy np. 400 obiektów statycznych i 40 poruszających się, to czy warto sortować cały kontener od początku, czy lepiej sprawdzać, czy postać poruszając się przykładowo w dół, jest niżej od swojego sąsiada w kontenerze:
C/C++
// zakladamy, ze kontener[0] to pierwszy wyswietlany obiekt (jest najwyzej) a kontener[size-1] to ostatni(najnizej)
bool czyGraczJestNizej = kontener[ indeksPostaci ].pozycja < kontener[ indeksPostaci + 1 ].pozycja;

Oczywiście wiązałoby się to z przesunięciem całego kontenera:

[drzewo]
[gracz]
[drzewo]
[domek]
[doniczka]
[beczka]

[drzewo]
[      ]
[drzewo]
[domek]
[doniczka]
[gracz] // gracz wchodzi na miejsce beczka, wszystkie obiekty przesuwają sie w dół

[drzewo]
[drzewo]
[domek]
[doniczka]
[beczka]
[gracz]

Żeby było ciekawiej, obiekty mają różne priorytety (np ptak zawsze wyświetlany jest jako ostatni, bo swoim ciałem przysłania wszystko poniżej) więc je też trzeba wziąć pod uwagę.

Z góry dziękuję za odpowiedzi :)
P-169821
jankowalski25
» 2018-03-07 07:44:47
Dlaczego chcesz trzymać obiekty z różnych warstw w jednym kontenerze? Może lepiej dla każdej warstwy tworzyć oddzielny kontener? Dzięki temu jesteś w stanie rysować poszczególne warstwy niezależnie od siebie i wtedy na końcu wystarczy tylko je wyświetlić jedna na drugiej w odpowiedniej kolejności. Dodatkowo, jeśli jakaś warstwa się nie zmieniła, to nie trzeba jej tworzyć w każdej klatce od zera, tylko wystarczy ją wyświetlić.
P-169822
geceves
» 2018-03-07 09:52:57
Jeżeli koniecznie chcesz jeden kontener to przemyśl jakąś własną kolejkę priorytetową albo dorób zmianę priorytetu w
std::priority_queue
.

To co chcesz osiągnąć to myślę, że najlepiej zrobić za pomocą prostej tablicy list jeżeli masz ustalony ciągły zakres liczby "warstw". Jeżeli zakres jest niezdefiniowany to możesz zejść z O(1) w określeniu warstwy do O(log n) za pomocą mapy list. Nie ma sensu tego sortować, obiekty mogą nawet same się "przepisywać" z listy do listy (wstrzyknąć im serwis "warstwowy" przez konstruktor), albo z jakimś zewnętrznym nadzorcą, który przy okazji "zdarzeń" będzie usuwał obiekt z jednej listy i dodawał na inną.

Jeżeli obiektów będzie dużo możesz rozważyć zamianę listy na set.

Ewentualnie użyć kontenerów haszowych i mieć jeszcze lepszą wydajność.
P-169823
pekfos
» 2018-03-07 16:22:13
Obiekty statyczne trzymaj osobno, obiekty poruszające się sortuj między sobą. Wyświetlanie to scalanie dwóch posortowanych sekwencji. Chyba że koniecznie chcesz sobie utrudniać życie. W takim wypadku, padły już w temacie ciekawe opcje. Bardziej skomplikowane, mniej wydajne - czego tylko dusza zapragnie.
P-169828
latajacaryba
Temat założony przez niniejszego użytkownika
» 2018-03-08 03:02:49
Dziękuję wam za odpowiedzi,
niemniej jednak wydaje mi się, że sposób pekfosa jest tym, czego szukałem. Faktycznie, nie wpadłem na to, że można to rozdzielić na statyczne i dynamiczne, posortowac dynamiczne i scalić. Wplotę w to również ideę JanaKowalskiego25, mianowicie dla każdej warstwy będzie osobny kontener:

C/C++
class Warstwa
{
    const int priorytet;
    std::vector < GameObject *> dynamiczne;
    std::vector < GameObject *> statyczne;
    void Sortuj();
    void Wyswietl(...); // scalanie i wyświtlanie, samo sortowanie będzie wykonywane - z racji użycia pętli stałokrokowej - po poruszeniu się obiektów 
}


I mamy jakiś manager wyświetlania, który sortuje sobie te warstwy po
const int priorytet
 i wyświetla scalone wektory.

Co o tym myslicie?
P-169839
latajacaryba
Temat założony przez niniejszego użytkownika
» 2018-03-13 23:58:23
Ups, zapomniałem o tym temacie :PP
W każdym razie zrobiłem jak pisałem, dziękuję jeszcze raz i zamykam.
P-170000
« 1 »
  Strona 1 z 1