konto usunięte

Temat: Położenie obiektu

Witam,

mam do Was takie pytanie. Do lepszego zobrazowania podaję zdjęcie

http://i.minus.com/iKMKgMuflkvUg.jpg

Legenda:
- Niebieskie koło to moja pozycja jako użytkownika.
- Zielone koła to pozycje innych userów online
- Szare pole to zakres widoczności

Pytanie:
W jaki sposób wyświetlić userów tylko z obszaru widoczności? Chodzi tutaj o problem na przykładzie gry online. Zwiedzam mapkę i serwer odsyła mi pozycje/akcje jakie posiadają userzy z aktualnego pola widzenia. Mile widziane tutoriale, artykuły itp.

Z góry dzięki.
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: Położenie obiektu

Chodzi ci o samo scrollowanie mapy ? (tak by rysować tylko kadr) czy również o wyłapywanie kolizjii analizowanie tylko tego co jest an ekranie ewentualnie tego co jest w okolicy?

Odnośnie kolizji itp to spróbuj podzielić przestrzeń na siatkę o różnej gęstości:
http://www.gamedev.net/page/resources/_/technical/grap...

konto usunięte

Temat: Położenie obiektu

chodzi wlasnie o lokalizowanke tego co jest w okolicy i w zasiegu pola widzenia
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: Położenie obiektu

musisz podzielić przestrzeń na sektory. Sprawdzasz tylko to co jest w danym sektorze.
Po googluj to:
http://mst.mimuw.edu.pl/lecture.php?lecture=gk1&part=Ch8

Nie implementowałem quad tree ale zawsze chaiłem (akurat jako LOD przy budowie terenu w 3d). Daj znać jak ci poszło bo chciałem się wziąć za podobny problem ale w 3d (wyszukiwanie drogi, AI
przeciwników i detekcja kolizji)Jerzy W. edytował(a) ten post dnia 21.08.12 o godzinie 11:42

konto usunięte

Temat: Położenie obiektu

Glownym problemem jest to, ze chcialbym aby serwer odsylal mi tylko pozycje userow ktorych mam w zasiegu wzroku i to musi dzialac na zasadzie Real Time bo ma to byc gra online, wiec musze ogarnac jakis serwer. Smartfox jest godny polecenia?
Karol Dulęba

Karol Dulęba Programista

Temat: Położenie obiektu

Jerzy W.:
musisz podzielić przestrzeń na sektory. Sprawdzasz tylko to co jest w danym sektorze.
Po googluj to:
http://mst.mimuw.edu.pl/lecture.php?lecture=gk1&part=Ch8

Nie implementowałem quad tree ale zawsze chaiłem (akurat jako LOD przy budowie terenu w 3d). Daj znać jak ci poszło bo chciałem się wziąć za podobny problem ale w 3d (wyszukiwanie drogi, AI
przeciwników i detekcja kolizji)

To jak skomplikowany algorytm musisz opracować zależy w dużej mierze od spodziewanego obciążenia serwera i co rozumiesz przez real time w twoim przypadku (tzn jakiego rzędu opóźnienia są do przyjęcia)
Jeżeli zakresem widzenia miał by być prostokąt to sprawa jest o wiele prostsza obliczeniowo w stosunku do okręgu, chociaż i z tym nie było by większego problemu.

Czy mógłbyś powiedzieć na jakim backend będziesz miał do dyspozycji (np. baza danych, bo nie sądzę żebyś trzymał wszystkie dane cały czas w pamięci aplikacji).

Moim zdaniem cała zabawa polega na odpowiednim zapisie danych, indeksowaniu, demormalizacji.
Można tak jak Jerzy W. wspomniał podzielić obszar na sektory i zrobić sprawdzenie typu (tylko może zoptymalizowane):
(|sektor_x - user_sektor_x| < dlugosc_widzenia) i (|sektor_y - user_sektor_y| < dlugosc_widzenia)
Takie zapytanie w baze da ci userow w zasiegu wzroku.
Zmieniając ilość sektorów zmienia się dokładność obliczeń i ich koszt.
Warto w mieć w bazie (czy gdzie tam będą dane o położeniach) zachowane oprócz dokładnych pozycji również policzone do którego sektora należą (obliczenia powinny być szybsze)

konto usunięte

Temat: Położenie obiektu

Generalnie sprawdzenie czy user jest w zasięgu wzroku to nie problem.

Problemem jest to, że np.

Uruchamiam aplikację i pobieram sobie z serwera ID userów, którzy są w zasięgu wzroku. We flexie mam wtedy listę:

[ID 1]
[ID 2]
[ID 3]
[ID 4]

I teraz powiedzmy, że co 5-10 sec lista powinna być sprawdzana pod kątem:

- Czy nie pojawił się nowy user w zasięgu wzroku
- Czy któryś z userów z aktualnej listy nie opuścił pola widzenia

Problem w tym, żeby zrobić to jak najbardziej wydajnie, dlatego zastanawiam się, czy zapis XY usera do bazy MySQL jest tutaj dobrym rozwiązaniem.

O ten Real Time zapytałem przy okazji, ponieważ mam w planach stworzyć prostą grę online i chciałem się poradzić jak to rozwiązać w przypadku gdy opóźnienie powinno być jak najmniejsze.

Aktualnie priorytetem dla mnie jest aktualizacja listy na podstawie warunków opisanych wyżej.
Karol Dulęba

Karol Dulęba Programista

Temat: Położenie obiektu

Sądzę, że trzeba mieć gdzieś zapisany stan pozycji userów w taki sposób, aby konieczność np. restartu serwera była tylko przejściowym problemem z dostępnością do aktualnych danych a nie łączyła się z ich utratą. Trzymanie wszystkich danych w pamięci jednego wątku jakoś do mnie nie przemawia
Z problemem jaki przedstawiasz postąpiłbym prawdopodobnie 2 fazowo:
1. Stworzyć listę userów w polu widzenia w danej chwili t
2. Mając zawężoną listę userów, porównać ją z tym co widział user w chwili t-1 w następujący sposób: Policzyć diff w po np. user_id między listą dla t i t-1 tworząc 3 klasy (listy) - obecni tylko w t, obecni w t i t-1, obecni tylko w t-1. W zależności od języka w którym backend jest pisany są na to różne sposoby.

Operacje tylko na id powinny być wystarczająco szybkie. Jeżeli chciałbyś wiedzieć jak userzy który widzi gracz się przemieścili, wystarczy zrobić obliczenia tylko na grupie 2 (obecni w t i t-1). Te obliczenia mogą być przeprowadzone na serwerze lub też w samym Flexie. Chociaż dłuższe listy chyba wolałbym obliczać na serwerze.

Jeżeli chodzi o Real time, to poczytaj o silniku wyszukiwania Solr. Możliwe że to jest z mojej strony przesada sugerować Solr, ale czasem kiedy wyszukiwanie w bazach robi się zbyt kosztowne obliczeniowo/czasowo to Solr może znacznie pomóc.
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: Położenie obiektu

1. patrzysz w których komórkach mapy jesteś(w najgorszym przypadku twój statek znajduje się na przecięciu lub rogu komórek i jego obrys zachodzo 2 lub 4 komórki).
2. Robisz zapytanie do serwera o statki znajdujące się na tych komórkach.
3. sprawdzasz w jakiej odległości są od Ciebie(poprostu liczysz długość wektora do kazdego z nich). Z listy wysyłasz te które są za daleko by kolidować z twoim statkiem.
4. Te co zostało sprawdzasz hitTest'em albo trikiem z bitmapdata.

Proponuje zrobić to w ten sposób i zobaczyć czy daje radę. Później spróbuj przenieść punkt 3 i 4 na stronę serwera(by nie hakowali).
Jeżdżenie po bazie co klatkę * X userów może boleć...
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: Położenie obiektu

Daj znać jak rozwiążesz problem opóźnień i lagów. Jakiś czas temu przyglądała się dark orbit i tam nieźle to działa. Ciekawy jestem jak sprytnie sobie z tym radzić. Ps jeżeli chcesz używać socketów po TOP to nie pisz serwera w Air bo tam nie ma opcji TCP NO DELAY i jak szybko wysyłasz male paczki to on czeka aż zbierze kilka i wysyła je w jednym pakiecie (opóźnienie widać nawet jak połączysz dwa kompy bezpośrednio że sobą kablem)

Następna dyskusja:

Dynamiczna zmiana rozmiaru ...




Wyślij zaproszenie do