2014-09-01 22 views
5

Tworzę otwarty świat jednego gracza RPG, w którym świat składa się głównie z izolowanych regionów, które dla skalowalności są podzielone na sekcje. Świat zawiera istoty, które współdziałają ze sobą. Większość istot będzie miała odniesienia do innych istot, być może także do istot w innych regionach. Definicja klasy dla being może wyglądaćPrzechowywanie i pobieranie odniesień do nieobciążonych obiektów w świecie gier

class Being { 
    weak_ptr<Being> target; 
    // other members 
}; 

Oczywiście, muszę być w stanie zapisać i wczytać stan gry do iz dysku. Teraz nie chcę, aby wszystkie istoty były zawsze załadowane. Chcę tylko załadować te istoty, które są w pobliżu gracza lub, co najgorsze, wszystkie istoty w aktualnie załadowanym regionie. Jaka jest dobra strategia, aby to osiągnąć? Oto kilka pomysłów, które rzuciłem do tej pory.

  1. Na dysku, istoty będą przechowywać unikalny identyfikator dla każdej przywołanej istoty. Ponieważ ładowane jest A, jeśli istnieje odniesienie do B, wskaźnik jest po prostu ustawiony. Jeśli B jest rozładowane, musi być również załadowane. Minusem jest to, że może rekurencyjnie załadować wiele istot, które nie mogą być użyte bezpośrednio.
  2. Zamiast istot zawierających rzeczywiste wskaźniki będą zawierać identyfikatory. Następnie, gdy używane są przywoływane istoty (na przykład, jeśli istota musi uszkodzić inny cel), będą one ładowane tylko w razie potrzeby. To komplikuje używanie referencji i może spowodować więcej operacji składowania/ładowania, ale pozwala uniknąć ładowania niepotrzebnych danych.

Czy istnieją lepsze alternatywy dla tych opcji? Wyobrażam sobie, że jest to powszechny problem, ale nie byłem w stanie znaleźć podobnych pytań na temat SO.

+0

Twoje podejście polega w rzeczywistości na buforowaniu obiektów. Możesz zajrzeć tutaj: http://stackoverflow.com/questions/17807805/how-to-cache-1000s-of-large-c-objects Najważniejsze pytanie brzmi: jak sprawić, by było skuteczne znalezienie obiektów do załadowania, ponieważ zależy to od ich pozycji, a nie od ich identyfikatora. – Christophe

Odpowiedz

1

Możesz użyć czegoś takiego jak Flyweight Pattern, aby pomóc w tym. Wtedy każdy typ Bycia jest tak naprawdę załadowany tylko jeden raz (można to zrobić leniwie, jak jest to potrzebne), a następnie każda instancja Bycia zawiera jedynie zmienne specyficzne dla instancji, takie jak pozycja, prędkość itp.

Jeśli to nie wystarczy Oszczędności, możesz napisać menedżer instancji, który ma API do żądania wskaźnika referencyjnego do bycia. Obiekt referencyjny powiadomi menedżera instancji, gdy zostanie zniszczony. Ułatwi to kierownikowi referencji zbieranie Istot do iz dysku w razie potrzeby.

+0

Niestety, nie sądzę, że wzorzec Flyweight da mi dużo oszczędności, ponieważ Istoty zawierają głównie "zewnętrzne" dane (takie jak długa lista statystyk, inwentarz, itp.). Drugie podejście brzmi interesująco. Czy to jest podobne do mojego pomysłu nie. 2? Jeśli nie, czy mógłbyś powiązać mnie z przykładem tego podejścia? Dzięki! –