Mam grę online, w której gracze mogą w jakiś sposób kształtować świat - np. Obudowa Ultima Online, w której możesz budować domy bezpośrednio na określonych częściach mapy świata. Są to zmiany, które powinny trwać z czasem w ramach trwałego świata.
W tym samym czasie zespół projektowy dodaje nowe treści i modyfikuje stare, aby ulepszyć i rozszerzyć grę dla nowych graczy. Zrobią to najpierw na serwerze programistycznym podczas testowania, a następnie będą musieli połączyć swoją pracę z „pracą” graczy na serwerze na żywo.
Zakładając, że rozwiązujemy problemy z projektem gry - np. gracze mogą budować tylko w wyznaczonych obszarach, więc nigdy nie kolidują geograficznie z edycjami projektantów - jakie są dobre sposoby obsługi danych lub uporządkowania struktur danych, aby uniknąć konfliktów, gdy nowe dane projektanta zostaną połączone z danymi nowego gracza?
Przykład 1: gracz tworzy nowy typ przedmiotu, a gra przypisuje mu identyfikator 123456. Wszystkie instancje tego przedmiotu odnoszą się do 123456. Teraz wyobraź sobie, że projektanci gier mają podobny system, a projektant tworzy nowy przedmiot o numerze 123456. Jak tego uniknąć?
Przykład 2: ktoś tworzy popularny mod, który nadaje wszystkim twoim smokom francuski akcent. Zawiera skrypt z nowym obiektem o nazwie, assignFrenchAccent
którego używają do przypisania nowych zasobów głosu do każdego obiektu smoka. Ale masz zamiar wdrożyć swoje DLC „Napoleon vs Smaug”, które ma obiekt o tej samej nazwie - jak możesz to zrobić bez wielu problemów z obsługą klienta?
Myślałem o następujących strategiach:
- Możesz użyć 2 oddzielnych plików / katalogów / baz danych, ale wtedy operacje odczytu są znacznie skomplikowane. „Pokaż wszystkie elementy” musi wykonać jeden odczyt na DB projektanta i jeden na DB odtwarzacza (i nadal musi jakoś rozróżniać 2).
- Możesz użyć 2 różnych przestrzeni nazw w jednym sklepie, np. używanie ciągów jako klucza podstawowego i poprzedzanie ich słowami „DESIGN:” lub „PLAYER:”, ale tworzenie tych przestrzeni nazw może być nietrywialne, a zależności nie są jasne. (np. w RDBMS możesz nie być w stanie efektywnie używać ciągów jako kluczy podstawowych. Możesz użyć liczb całkowitych i przydzielić wszystkie klucze podstawowe poniżej pewnej liczby, np. 1 miliona, aby być danymi projektowymi i wszystko powyżej tego dane odtwarzacza. Ale te informacje są niewidoczne dla RDBMS, a linki klucza obcego przekroczą „podział”, co oznacza, że wszystkie narzędzia i skrypty muszą jawnie je obejść).
- Zawsze możesz pracować na tej samej współużytkowanej bazie danych w czasie rzeczywistym, ale wydajność może być niska, a ryzyko uszkodzenia danych odtwarzacza może zostać zwiększone. Nie obejmuje również gier, które działają na więcej niż 1 serwerze z różnymi danymi światowymi.
- ... jakieś inne pomysły?
Przyszło mi do głowy, że chociaż jest to przede wszystkim problem w przypadku gier online, koncepcje mogą dotyczyć również modowania, w którym społeczność tworzy mody w tym samym czasie, gdy twórcy łatają swoją grę. Czy zastosowano tu jakieś strategie, aby zmniejszyć ryzyko złamania modów, gdy pojawią się nowe łatki?
Oznacziłem to również jako „kontrolę wersji”, ponieważ na jednym poziomie to jest to - 2 gałęzie rozwoju danych, które wymagają scalenia. Być może z tego kierunku mogą pochodzić pewne spostrzeżenia.
EDYCJA - kilka przykładów dodanych powyżej w celu wyjaśnienia problemu. Zaczynam myśleć, że problemem jest tak naprawdę przestrzeń nazw, którą można zaimplementować w sklepie za pomocą kluczy kompozytowych. To przynajmniej upraszcza strategię scalania. Ale mogą istnieć alternatywy, których nie widzę.