25.03.2016

Wyświetlanie zawartości okna za pomocą macierzy sektorów

Postanowiłem trochę rozbudować i zoptymalizować sposób wyświetlania zawartości okien. W starszej wersji silnika, plany okna typu theWindow w całości stanowiły powierzchnie RGBA. To proste rozwiązanie ma jednak mankament, duże plansze wymagają alokacji dużej ilości pamięci, bo wszystkie obiekty (nawet jeżeli powtarzają się w kilku miejscach) są nakładane na całą powierzchnię planu okna, czyli są powielane w pamięci.
Dlatego dodałem do obiektu typu theWindow macierz sektorów ze wskaźnikami do powierzchni poszczególnych obiektów w oknie. Każdy plan okna ma swoją własną macierz dwuwymiarową złożoną z obiektów typu mSector. Każdy sektor zawiera wektor wskaźników do obiektów, które znajdują się w danej lokalizacji oraz flagę informującą czy ten sektor całkowicie zasłania niższe warstwy planów. Obiekty wizualne, znajdujące się na wektorze w sektorach, mogą mieć rozmiary większe od jednego sektora, w takim przypadku ten sam wskaźnik zostanie dodany do wektora sąsiedniego sektora (lub do wielu sąsiednich, w zależności od rozmiarów obiektu).
W ten sposób każdy obiekt wizualny o tym samym wyglądzie nie jest powielany na planie, jest jedynie dodany wskaźnik do odpowiedniej lokalizacji.
Nie wykluczam też dodania opcji, która jest podobna do starszego sposobu tworzenia nowego planu, czyli buduje powierzchnię RGBA dla całego widzialnego obszaru okna (na podstawie danych z macierzy sektorów), ale z tą różnicą, że ogranicza powierzchnię tylko do fizycznego rozmiaru okna na ekranie, plus z dodatkowym marginesem (dla szybszego przewijania tego okna). Taka opcja bardziej pasuje (optymalizacyjnie) dla planów, które tworzą tło, składające się z wielu obiektów wizualnych. Detektor kolizji i funkcje składowe związane z umieszczaniem i usuwaniem obiektów do sektorów macierzy, sprawdzałyby czy określony plan ma ustawioną tę opcję i modyfikowałyby powierzchnię tego planu (jeszcze przed aktualizacją na ekranie głównym).
Detektor kolizji polega na sprawdzeniu czy nowo dodany obiekt wizualny zachodzi na inne obiekty w sektorze, w którym się znajduje, jeżeli tak to ustawia określoną flagę (wewnątrz struktury konkretnego obiektu wizualnego), która będzie informowała funkcję zdejmującą ten obiekt z macierzy sektorów, że trzeba odświeżyć również powierzchnię planu. Będzie również istniała możliwość szybkiego dodawania i usuwania obiektów wizualnych (bez sprawdzania kolizji), w postaci oddzielnych funkcji składowych np. "quickAdd" i "quickRemove".

Brak komentarzy:

Prześlij komentarz