Jump to content

Wydajność a wygoda


Recommended Posts

Mam dość rozbudowany gamemode pisany około roku temu. Wygląda całkiem dobrze z zewnątrz, nie ma błędów i bugów, ale w środku kod wygląda dość mało wydajnie. Zauważyłem, że z czasem tracę pare FPS, pewnie mam wycieki pamięci itd.

Ogólnie go pisałem na setElementDatach i wszystko pisane było w 1 zasobie/resource, aby było mi wygodniej.

Chciałbym sobie powoli wyciągać kody i skrypty z głównego gamemoda i stworzyć osobne zasoby, w taki sposób, aby nie musiałby one być aktywne przez cały czas. Byłby to dobry sposób naprawiania i szukania wycieków pamięci i nieoptymalnych kodów, bo pisałbym cały gamemod od początku.

Największym problemem jest tutaj komunikatywność z innymi zasobami. Nie mogę wszystko rozłączyć, bo gamemod by nie pracował poprawnie. Dla przykładu: wiele razy pewnie będę musiał sprawdzać czy dany gracz jest VIPem, adminem itd

I moje główne pytanie:

Czy

exports:resource.function() 

jest tak samo wydajne jak zwykłe wywoływanie funkcji, które znajdują się w takim samym zasobie/resource?

Zapytam jeszcze o jedną sprawę:

Jak korzystać z bazy danych. Teraz mój gamemod działa na zasadzie, że gdy gracz loguje się, z bazy pobierane jest około 30 wartości statystyk (zabicia, smierci, strzaly, kasa itd), zapisywane w elementDatach, które zostają aktualizowane podczas gry i po zakończeniu grania, w momencie opuszczenia servera, dane z elementData są wysyłane do bazy danych

czy może lepsze jest aktualizowanie bazy na bieząco? drobne i krótkie polecenia

UPDATE stats SET kills=kills+1 WHERE id=5312 

?

Aha i jeszcze połączenie obu pytań:

To w takim razie jeżeli mam jakąś wartość po stronie klienta i inne resource potrzebuje odczytać tą daną to czy lepiej:

- jest zapisać ją w setElementData (która jak wszyscy wiedzą jest globalna i każdy zasób ją widzi)

- przesłać za pomocą call'a

(chociaż tu pewnie decyduje czynnik jakim jest częstotliwość przesyłania tej wartości i jej wielkość)

Wszystkie te pytania odnoszą się wydajności

Link to comment

Ja bym nie aktualizował bazy na bieżąco, ale robiłbym to np. co 15 minut dla wszystkich graczy - żeby w razie sypnięcia się serwera za dużo nie stracić. Twój przykład zapytania wykonuje się w ułamku sekundy, więc nawet na bieżąco można by było się pokusić, ale jak sobie napiszesz 15 minutowe zapisywanie a kiedyś dojdzie tych informacji znacznie więcej, to będzie pod ręką.

setElementData - pewny nie jestem - ale zapewne call jednak będzie szybszy. (z setElementData musisz potem sprawdzać czy wartość się zmieniła itd, a call to po prostu wywołanie funkcji z danymi)

exports:resource.function() 

jest tak samo wydajne jak zwykłe wywoływanie funkcji, które znajdują się w takim samym zasobie/resource?

W sensie chcesz wywoływać eksportem funkcję w tym samym zasobie z której ją wywołujesz? Może to mieć niezauważalny w zasadzie nadmiar operacji (pewny nie jestem, nie znam lua od strony samego silnika), ale przede wszystkim wydaje mi się niewygodne podczas pisania ;)

Link to comment

W sensie chcesz wywoływać eksportem funkcję w tym samym zasobie z której ją wywołujesz? Może to mieć niezauważalny w zasadzie nadmiar operacji (pewny nie jestem, nie znam lua od strony samego silnika), ale przede wszystkim wydaje mi się niewygodne podczas pisania ;)

Nie nie , teraz moj gamemod to jest jeden zasób i przy np komendzie admina po prostu sprawdzam if isAdmin(player)

i wszystko jest okey. Gdybym jednak chciał podzielić ten zasób na 20-30 mniejszych, które działałby niezależnie od siebie to byłbym zmuszony wykorzystywać call aby dowiedzieć się o tym czy gracz jest administratorem, bo taki mały zasób nie 'zajmowałby' się logowaniem itp

Chodzi mi o to czy zasób jako całość jest szybszy niż posiadania 30 zasobów powiązanych exportami

Link to comment

Czy

exports:resource.function() 

jest tak samo wydajne jak zwykłe wywoływanie funkcji, które znajdują się w takim samym zasobie/resource?

Według prędkości działania: funkcje eksportowane (najwolniejsze), funkcje globalne, funkcje lokalne (najszybsze)

Ale różnica w większości przypadków jest niezauważalna lub pomijalna.

Używanie funkcji eksportowanych powoduje konieczność odszukania ich w tablicach, sprawdzenia czy dany zasób jest uruchomiony i czy dana funkcja jest wyeksportowana. Siłą rzeczy trwa to dłużej niż wywołanie funkcji która jest pod reką interpretera lua, ale myślę, że różnica jest zupełnie niezauważalna i w ogóle nie powinieneś na nią zwracać uwagę.

Jak korzystać z bazy danych. Teraz mój gamemod działa na zasadzie, że gdy gracz loguje się, z bazy pobierane jest około 30 wartości statystyk (zabicia, smierci, strzaly, kasa itd), zapisywane w elementDatach, które zostają aktualizowane podczas gry i po zakończeniu grania, w momencie opuszczenia servera, dane z elementData są wysyłane do bazy danych

Tak jest najlepiej, ale miej na uwadze, że warto czasami zapisać te dane mimo wszystko przed wyjściem gracza, gdyż ten może opuscić serwer bez wywołania eventu onPlayerQuit (poprzez np. crash serwera lub bug #7710).

czy może lepsze jest aktualizowanie bazy na bieząco? drobne i krótkie polecenia

UPDATE stats SET kills=kills+1 WHERE id=5312 

Im mniej zapytań, tym lepiej.

Przy kilku graczach nie zauważysz różnicy, ale jak na serwer wejdzie ich kilkaset, to sytuacja będzie miała się inaczej.

To w takim razie jeżeli mam jakąś wartość po stronie klienta i inne resource potrzebuje odczytać tą daną to czy lepiej:

- jest zapisać ją w setElementData (która jak wszyscy wiedzą jest globalna i każdy zasób ją widzi)

- przesłać za pomocą call'a

Szczerze mówiąc nie wiem, ale osobiście zawsze korzystam z elementData.

Chodzi mi o to czy zasób jako całość jest szybszy niż posiadania 30 zasobów powiązanych exportami

Może i jest szybszy, ale rozwój go jest na pewno mniej wygodny niż odpowiednio napisanych (i przygotowanych do wznowienia działania po restarcie bez przerywania graczom gry) 30 zasobów.

Możliwość przeładowania dowolnego zasobu w MTA to jedna z wielu właściwości która znacznie ułatwia rozwój serwerów w tej grze. Warto z tego korzystać.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...