Autor Wątek: Użycie pamięci  (Przeczytany 1381 razy)

Offline bombur

  • Użytkownik

# Kwiecień 01, 2006, 14:40:49
Jak zmniejszyc uzycie pamięci w grze? Przykładowo server ma do załadowania mapę 10240x10240x5poziomowX4(size of(pointer)) = ~2 GB. 

Tak samo może byc z ladowaiem grafiki. Mamy na przyklad 10000 spritow po 32x32pixele = ~50MB. Nie wiemy, ktory sprajt wystapi wiec trzeba je trzymac wszystkie zaladowane. A jak sie to robi w profesjonalnych grach?

Czy jest jakaś metoda aby używać mniej pamięci?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Majtek

  • Użytkownik

# Kwiecień 01, 2006, 16:30:33
Tektury możesz trzymać w pamięci skompresowane, co do mapy to takie duże mapy można podzielić na regiony i doczytywać w locie potrzebny kawałek, niepotrzebne zwalniać.

spax

  • Gość
# Kwiecień 01, 2006, 16:50:16
Co do spritów, nie musisz wszystkich wczytywać odrazu. Wystarczy że wczytasz tylko te które są aktualnie używane - poczytaj o managerach danych.

pozdro
spax.
« Ostatnia zmiana: Kwiecień 01, 2006, 16:52:31 wysłana przez spax »

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Kwiecień 01, 2006, 18:33:01
Po pierwsze - chyba nie sądzisz, że każdy osobny egzemplarz ludzika trzeba trzymać jako kolejny raz załadowany z pliku obrazek?!?!?! http://regedit.warsztat.gd/warsztat/humor.php?x=view&id=280 :) Każdy obrazek (rysunek potworka danego rodzaju) wczytujesz do pamięci raz i potem w każdej klatce gry rysujesz go tyle razy i w takich miejscach, w jakich potrzeba - ile tych potworków jest na planszy.

Po drugie, tak jak napisał spax - zaawansowane gry używają do tego managera zasobów, który stosuje pewną politykę wymiany polegającą na doczytywaniu w czasie działania gry tego co akurat jest potrzebne, a zwalnianiu tego co dawno nie było używane tak, żeby nie zapchać za dużo pamięci.

Ale wątpię, żeby tobie do prostej gry było coś takiego potrzebne. Ile różnych obrazków jesteś w stanie zrobić do swojej gry ty i współpracujący z tobą graficy? Wątpię, czy 10000... W prostych grach cała grafika mieści się na raz wczytana do pamięci.

Natomiast co do mapy to oczywiście też nie można przechowywać tak wielkiej tablicy, tylko trzeba wczytywać aktualnie potrzebny kawałek albo pamiętać w jakimś optymalniejszym formacie - i nie chodzi mi tu o kompresję ale np. o pamiętanie jej jako listy ścian (każda ma pozycję, rodzaj itd.) zamiast pamiętać stan każdej komórki, z której większość będzie i tak pusta - ale to już zależy od konkretnej gry co tam jest i jak powinno być zapisane.

Offline ajuc

  • Użytkownik
    • strona domowa

# Kwiecień 12, 2006, 10:40:31
Jak ma być prosto i naprawdę potrzebny jest duży teren, to można zrobić to na mapie haszującej.

W STLu jest taka strukturka, map<klucz, dana>, poczytaj dokumentację i do dzieła.

Ewentualnie możesz zrobić sobie coś takiego sam, jeśli na przykład wiesz, że większość kratek mapy będzie pustych(albu miało standardową teksturkę trawy), to robisz tablicę kilka razy mniejszą niż potrzebna, funkcję haszującą, znaczy taką, że podajesz jej współrzędne kratki mapy, a ona obcina mniej znczące bity, coś tam kombinuje, i zwraca ci indeks w tablicy. Wpisując i wczytując z tablicy kratki używasz tej funkcji do wyznaczenia indeksu w tablicy. Jeśli funkcja była dobra, to nie powinno być zbyt wiele kolizji, jak już masz kolizję, to albo kratka jest listą i dodajesz do tej listy następną teksturkę, albo wyznaczasz następną kratkę przez jakąś inną funkcję haszującą, nie powinno być nigdy tak, że po 2,3 próbach wstawienia masz wciąż kolizję, więc wsio będzie liniowe. No chyba że zapchasz całą tablicę.

Przy wyświetlaniu patrzysz i jak coś jest pod danym adresem to rysujesz, jak nie to rysujesz kratkę standardową.

Stanowczo polecam STLa do tego, bo jest łatwiej, i nie trzeba się przejmować ustalaniem dobrego rozmiaru początkowego, bo mapa z STLa sama się rozrasta w miarę dodawania elementów. Im więcej na twojej planszy zajmują takie same pola, tym większy zysk z użycia takiego algorytmu.

Pozdrawiam