Próbuję stworzyć architekturę dla gry MMO i nie wiem, w jaki sposób mogę przechowywać tak wiele zmiennych, jakich potrzebuję w GameObjects, bez konieczności wykonywania wielu połączeń wyślij je na drucie w tym samym czasie, kiedy je aktualizuję.Słuchaj zmienników o zmiennej C++ (ponad 100 klas)
Co mam teraz jest:
Game::ChangePosition(Vector3 newPos) {
gameobject.ChangePosition(newPos);
SendOnWireNEWPOSITION(gameobject.id, newPos);
}
To sprawia, że śmieci kodu, trudne do utrzymania, zrozumieć, przedłużyć. Więc pomyśl o przykład Champion:
musiałbym zrobić wiele funkcji dla każdej zmiennej. I to jest tylko uogólnienie dla tego Czempiona, mogę mieć 1-2 inne zmienne dla każdego bohatera typu/klasy.
Byłoby idealnie, gdybym mógł mieć OnPropertyChange z .NET lub coś podobnego. Architektura Próbuję odgadnąć będzie działać dobrze jest, jeśli miałem coś podobnego do:
Dla HP: gdy go zaktualizować, automatycznie zadzwonić SendFloatOnWire("HP", hp);
na stanowisko: gdy go zaktualizować, automatycznie zadzwonić SendVector3OnWire("Position", Position)
Dla Nazwa: gdy go zaktualizować, automatycznie zadzwonić SendSOnWire("Name", Name);
Jakie są dokładnie SendFloatOnWire
, SendVector3OnWire
, SendSOnWire
? Funkcje, które serializują te typy w buforze znaków.
lub metoda 2 (Preferowany), ale może być drogie
Aktualizacja Hp, pozycja normalnie i wtedy każdy wątek Network kleszcz skanowania wszystkie instancje GameObject na serwerze dla zmiennych zmieniły i wysłać ci.
W jaki sposób zostałby on wdrożony na serwerze gry o dużej skali i jakie są moje opcje? Czy przydatna książka do takich przypadków?
Czy makra okażą się przydatne? Wydaje mi się, że zostałem odsłonięty do jakiegoś kodu źródłowego czegoś podobnego i myślę, że używał makr.
Z góry dziękuję.
EDYTOWANIE: Myślę, że znalazłem rozwiązanie, ale nie wiem, jak bardzo jest ono w rzeczywistości. Zamierzam spróbować i zobaczyć, gdzie stoję. https://developer.valvesoftware.com/wiki/Networking_Entities
Czy na pewno nie chcesz, aby serwer był tym, który uruchamia grę, a klientem po prostu głupim rendererem? W ten sposób nie musisz wysyłać wszystkich tych atrybutów przez przewód (i pomaga to zapobiec oszustwom, ponieważ nie można manipulować klientem w celu zgłoszenia nieuczciwych wartości). – Cornstalks
Dokładnie to działa, ale nadal muszę powiadomić klienta o tym, co ma on do renderowania. – ioanb7
ChangePosition() to tylko przykład, w którym klient decyduje, dokąd chce się udać. To tylko cel, serwer może zdecydować, czy jest ważny, czy nie, itp. Podałem go jako przykład. – ioanb7