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.
- 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.
- 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.
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