Skocz do zawartości

[DLL] GMThreads


Rekomendowane odpowiedzi

Lul, tu sie powoli robi gej-party ;p

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 172
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

Snake: Musze Ci powiedziec ze Twoj DLL jest nie wydajny na dluzsza mete - uzywajac go zauwazylem ze chyba nie zwalniasz pamieci uzywanej przez watki po ich wykonaniu - po niedlugim czasie pamiec sie strasznie zapelnia :/ dasz rade to naprawic? bo w takiej postaci dll jest niezdolny do dlugiej pracy :/

PS. zeby nie bylo - sprawdzalem w c++ i tam ja calkowicie czyszcze po sobie pamiec ale i tak jest ona zapychana przez tworzone watki.

Odnośnik do komentarza
Udostępnij na innych stronach

Na dodatek chyba blokuje zuzyta pamiec bo z kazdym kolejnym wlaczeniem programu tworzacego watki coraz mniej czasu potrzebuje na wywalenie bledu z brakiem dostepu do pamieci :0

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm... znalazłem przyczynę, każda zmienna lokalna zdefiniowana w wątku nie jest zwalniana z pamięci. Będę musiał zwalniać "ręcznie" pamięć z runnera ;o Zauważyłem to dopiero, gdy użyłem tablic ;d

 

Jak byś dopatrzył się jeszcze, czy jakieś funkcje z GM-a nie zapychają czasami pamięci to napisz. Tymczasem muszę pomęczyć się z access violation...

Odnośnik do komentarza
Udostępnij na innych stronach

Tyle ze ja wogole nie tworze zmiennych lokalnych, tworze same globale - i to jest zastanawiajace.. :0 To wracam do testowania reszty funkcji

Odnośnik do komentarza
Udostępnij na innych stronach

podam Ci funkcje jakie uzywam w aplikacji (ich wartosc od razu wyslam do dlla):

 

instance_create(0,0,logo)

keyboard_check(ord('W'))

keyboard_check(ord('S'))

keyboard_check(ord('A'))

keyboard_check(ord('D'))

 

EDIT: przydalo by sie zrobic mozliwosc przypisania watku do danego obiektu (bez zabawy w with()) - zeby mozna bylo uzywac zmiennych lokalnych

 

PS. Chyba jestem jedynym ktory na powaznie zajal sie testowaniem tego dlla xD

Odnośnik do komentarza
Udostępnij na innych stronach

Snake: ciagle sprawdzam funkcje i musze powiedziec ze zuzycie procka siega max 25% (co jest dla mnie zadowalajace) ale za to co sekunde zuzycie pamieci wzrasta o 90-110 k :/ a uzywam co stepa wylacznie tych funkcji co podalem

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, sprawdzimy czy po update nadal będą wycieki pamięci przy tych funkcjach ;d Teraz w sumie usuwam całą pamięć alokowaną przez "kompilator" GM-a więc nie powinno być problemów, ale zawsze lepiej sprawdzić ;D

 

przydalo by sie zrobic mozliwosc przypisania watku do danego obiektu (bez zabawy w with()) - zeby mozna bylo uzywac zmiennych lokalnych

Nad czymś takim raczej nie chce mi się męczyć, nie wiem jakby to wpływało na runnera. Możesz napisać sobie taki skrypt z with żeby nie pisać w kółko ;p

GML
// arg0 - kod gml

// arg1 - wstrzymac?

// arg2 - id obiektu

// zwraca: uchwyt

return external_call( global._thread_create, "with (" + string( argument2 ) + ") {" + argument0 + "}", argument1 );

 

PS. Chyba jestem jedynym ktory na powaznie zajal sie testowaniem tego dlla xD

Nie dziwię się, jak potrzebujesz go do PlayGate ;D

 

btw. teraz zauważyłem, że zapomniałem dopisać w przykładzie gm definiowania i wywołania thread_create z argumentem "suspended?" xd

 

EDIT: Zapomniałem o return w skrypcie ;p

Odnośnik do komentarza
Udostępnij na innych stronach

btw. teraz zauważyłem, że zapomniałem dopisać w przykładzie gm definiowania i wywołania thread_create z argumentem "suspended?"

z tym od razu sobie poradzilem. Mam nadzieje ze update do gm6.1 wyjdzie w miare szybko bo coraz bardziej przesuwa mi sie koniec roboty z frameworkiem :)

Odnośnik do komentarza
Udostępnij na innych stronach

No w końcu dziala jak należy :D teraz pozostała reszta testów

 

EDIT: w c++ nie dziala funkcja last error a plik naglowkowy i ladowanie funkcji z dlla mam dobrze napisane :/ wyglada normalnie jakby wykonywal jakas nieskonczona petle

EDIT2: hmm, ale tak sie dzieje tylko w jednym miejscu w pliku, zaraz to inaczej sprobuje rozwiazac

Odnośnik do komentarza
Udostępnij na innych stronach

jak wiesz (bo widziales szkielet aplikacji w gm) mam 3 funkcje: jedna wykonywana na starcie, jedna na zakonczeniu a trzecia wykonywana co step i jak umiescilem kod z wykrywaniem bledow w funkcji tworzenia watku i dalem wykonywanie w funkcji na starcie to mi blokowalo aplikacje, ale jak dalem w stepie to spoko dzialalo. wiec po prostu dalem kod z wykrywaniem bledow do osobnej funkcji i dalem jej wykonywanie spowrotem na startup i wszystko o dziwo dzialalo. nadal nie wiem czego wtedy tak blokowalo ale grunt ze juz dziala, jak na razie nie mam zadnych skarg.

 

EDIT: i znalazlo sie cos w koncu - czy ten dll kasuje aby na pewno pamiec zajmowana przez watki? bo do PlayGate'a zwracam pewna wartosc i ta wartosc wyswietla poprawnie, a po wywolaniu innego watku w jakis sposob dane w zmiennej zostaja nadpisane(?) bo wyskakuje mi zupelnie inna wartosc niz byla na poczatku a nigdzie nie reallocowalem zmiennej ani nie zmienialem jej wartosci O.o

Odnośnik do komentarza
Udostępnij na innych stronach

czy ten dll kasuje aby na pewno pamiec zajmowana przez watki? bo do PlayGate'a zwracam pewna wartosc i ta wartosc wyswietla poprawnie, a po wywolaniu innego watku w jakis sposob dane w zmiennej zostaja nadpisane(?) bo wyskakuje mi zupelnie inna wartosc niz byla na poczatku a nigdzie nie reallocowalem zmiennej ani nie zmienialem jej wartosci O.o

Wątki na pewno są zwalniane... hmm, zapodaj może jakiś przykład czy cuś gdy to występuje, bo ja nie zauważyłem niczego takiego. ;p

 

Aha, chyba nie próbujesz się dostawać z kilku wątków do jednej zmiennej jednocześnie ?

Odnośnik do komentarza
Udostępnij na innych stronach

To aplikacja:

https://gmclan.org/up1105_4_PlayGateBeta_unsec_.html

 

A tu jest kod (C++ & GML) (czesc ktora sie dobiera do zmiennej):

 

start:

PlayGate.ExecuteResult(3,"global.player=PlayGateReturnDouble(instance_create(0,0,logo));");
player.id=PlayGate.GetResultDouble();
MessageBox(GMappHandle,"PlayGate Framework: system test.\nPlayGate system start!","PlayGate",MB_OK);
PlayGate.ExecuteResult(3,"PlayGateReturnChar('PlayGate User');");
player.nick=PlayGate.GetResultChar();
player.x=320;
player.y=240;
MessageBox(GMappHandle,player.nick,"PlayGate: Welcome!",MB_OK);

 

gdzie obiekt player ma nastepujaca zawartosc:

double id;
double x;
double y;
char* nick;

 

koniec:

MessageBox(GMappHandle,player.nick,"PlayGate: Good bye!",MB_OK);

 

Tak to sie robi, na starcie zawsze pokazuje dobrze "PlayGate User", ale nie wiem czemu sie tak kaszani - dziwne ze za kazdym razem reaguje inaczej, raz pokazuje na koncu "PlayGate User" a raz nic nie pokazuje albo taki smiec: "240." O.o

 

EDIT: A zaraz, cos mi tu niegra - moze blad jest w tym ze pobieram tylko wskaznik do lancucha znakow w pamieci GMa ("PlayGate User")? Moze jednak to bedzie dzialac jak przepisze to do zmiennej po prostu :D TAAA to chyba musi dzialac - zaraz sprawdze ;D

 

EDIT2: LOL DZIALA! ^^ tak jak myslalem - wystarczylo przepisac ze wskaznika znaki do tablicy w aplikacji

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

No i jest nowa wersja ;) Teraz jest wsparcie dla procesorów wielordzeniowych :D

 

Dodałem 3 nowe funkcje:

  • thread_affinity_mask( UchwytWatku, Maska ) - ustawia maskę affinity (typ wektora bitowego) podanego wątku. Jak to działa ?

    Każdy bit podanej wartości (maski) rozprezentuje procesor (rdzeń) czyli np.

    3 w postaci binarnej to 0000 0011, więc wątek z taką maską będzie korzystał z pierwszego i drugiego rdzenia

    10 w postaci binarnej to 0000 1010, więc wątek będzie korzystał z 2 i 4 rdzenia.

    Żeby sobie dopasować taką wartość możecie użyć kalkulatora windowsowego w trybie naukowym.

    Jeśli funkcja zawiedzie - zwraca 0, w innym wypadku zwraca poprzednia maskę.

    more info: <a href="http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx</a>

  • thread_ideal_processor( UchwytWatku, NumerProcesora ) - ustawia preferowany procesor (rdzeń) dla wątku. Numer procesora ustawiany jest od 0, czyli 0 = pierwszy rdzeń, 1 = drugi itd.

    Zwraca -1 gdy wystąpi błąd, inaczej zwróci poprzedni ustawiony numer procesora.

    more info: <a href="http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx</a>

  • thread_num_of_processors() - Zwraca ilość rdzeni/procesorów.
Download:

http://www.gmclan.org/up541_4_GMThreads14.html

 

Podziękowania dla Maxpayna, za testowanie nowej wersji na swoim procku (Quad) :D

Odnośnik do komentarza
Udostępnij na innych stronach

Oby wprowadzili ;D

Tylko że na pewno te wbudowane wątki działały by szybciej niż z GMThreads ;p Tzn, wątek tworzony przez GMThreads jest nieco opóźniony przy starcie, bo musi kompilować podany kod (kompilacja też odbywa się w wątku, więc to nie przerywa głównego wątku gry). Ale interpretacja odbywa się z taką samą szybkością, co w GM.

Odnośnik do komentarza
Udostępnij na innych stronach

Nieźle, nieźle :P

 

I pytanie: W jakich sytuacjach te 2 pierwsze funkcje mają wywalać błąd? Jak niepoprawną wartość podam? Czy może jak Windows nawali? Bo nie do końca rozumiem :P

 

Hmmm... czyli teraz gra napisana przy udziale twojego dll'a będzie szybsza niż w samym GM'ie :P?

Odnośnik do komentarza
Udostępnij na innych stronach

W thread_affinity_mask wystąpi błąd gdy podasz nieprawidłową maskę (nie odpowiadającą procesorom/rdzeniom, np. na komputerze z procesorem single-core dasz maskę dla dual-core), albo uchwyt wątku będzie nieprawidłowy.

W thread_ideal_processor wystąpi błąd gdy podasz nieprawidłową wartość w ProcessorNum, lub nieprawidłowy uchwyt wątku.

 

I tak, dzięki GMThreads gry mogą działać szybciej na procesorach wielordzeniowych. (właściwie to system operacyjny decyduje na którym procku/rdzeniu ma być wykonywany jakiś wątek i nie trzeba używać tych funkcji, bo mogą zostać przydzielone automatycznie, ale dzięki nim można lepiej tym zarządzać [w ogóle zarządzać ;D])

Odnośnik do komentarza
Udostępnij na innych stronach

Jakby to było takie proste to gier używających możliwości wielowątkowości było by około 90% a tak nie jest. Nawet bardzo doświadczeni programiści zastanowią się 40 razy zanim do swojego projektu zastosują multithreading. Tak więc zastanów się przez krótką chwile dlaczego.

Odnośnik do komentarza
Udostępnij na innych stronach

Dobra, ale ja mam takie pytanie - rozdzieli się prace na 4 rdzenie, spoko. A co jak ktoś ma tylko 2, albo tak jak ja, 1? Co wtedy? Połowa lub 3/4 instrukcji nie zostanie wykonana, czy to będzie jakoś rozdzielone na rdzenie istniejące? Jakby się programowało na konsolę, to tak można dawać, bo tam jest jeden i ten sam procesor, nikt go nie wymieni, i można zoptymalizować grę na maxa pod sprzęt konkretny, a w PC takiej możliwości nie ma, dlatego się pytam z tym przypadkiem, jak ktoś nie ma tylu rdzeni ile gra wykorzystuje.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...