Skocz do zawartości

Snake

Użytkownicy
  • Postów

    1 445
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Snake

  1. Jak zamrozisz/wyłączysz rysowanie obrazu w GM to tak. Ale chodzi tu o to hmm... np. używasz supersound.dll (taki DLL dla GM który odtwarza dźwięk) i chcesz załadować jakiś plik z muzyką, to okno gry się zamrozi dopóki muzyka się nie załaduje. A jeśli załadujesz muzykę przez wątek to zamrozi się tylko wątek dopóki się nie załaduje, a gra będzie normalnie chodzić ;p Szybciej niż normalnie w GM może działać jak zmienisz priorytet wątku na "Czasu rzeczywistego", bo użyje wtedy całego procesora.
  2. Dougal & Gammer - Nobody Likes The Records [hardcore mix] http://pl.youtube.com/watch?v=DS4QKg9IlPw
  3. K, nowa wersja: - Teraz GMThreads będzie działał na GM6.1 ;p http://www.gmclan.org/up541_4_GMThreads11.html
  4. Hmm... chyba sobie nie pogram ;p Intro w ogóle nie mogłem obejrzeć, strasznie przycinało (1 frame per 2 - 5 second). Menu już lepiej szło (na oko z 20 fps), a podczas gry miałem z 10 fps ;[ A mam taki sprzęt: Procesor: Intel Celeron 2.8 Ghz Pamięć ram: 768 MB DDR Karta Graficzna: Nvidia GeForce FX 5200 Dodam jeszcze, że wyłączyłem wszystkie procesy, a sam trip korzystał z ~850MB pamięci ;o Aha, i dysk formatowałem dwa dni temu ;p
  5. lul xd zapomniałem modulo pewnie ;D Nie szybciej tylko asynchronicznie z grą ;p nie może być szybciej bo okno GM-a rysuje obraz w trakcie wykonywania kodu w wątkach ;p No chyba że ustawisz priorytet na time critical ;D
  6. Last update: 29.12.2009: FAQ style Co to jest ? GMThreads to biblioteka DLL dzięki której można wykonywać podany kod GML w... wątkach ;D Właściwie, to to jest eksperyment i trzeba to przetestować. Co to są "wątki" ? ;o Hmm... nie chce mi się tego opisywać więc zacytuje: Zdaje sobie z tego sprawę że większość użytkowników Game Makera nie wie o co biega więc łopatologicznie: Wątek to taki "proces" który działa w tle aplikacji i wykonuje kod niezależnie od tego, co się z nią dzieje. Do czego te wątki mogą mi się przydać ? Cóż, kod wykonywany w wątkach jest cały czas tzn. nawet gdy okno gry jest zminimalizowane, przemieszczane, wyświetla wiadomość [show_message] itd. Poza tym, dzięki nim można ładować zasoby, wykonywać obliczenia i tak dalej w tle, przez co główne okno się nie "zawiesi" w czasie ładowania (FPS-y mogą spaść, chociaż to też zależy od priorytetu wątku). Hmm... więc jak tego używać ? Może najpierw wymienię funkcje: thread_init( NazwaPliku ) - Inicjuje GMThreads. Można podać inną ścieżkę do pliku (domyślnie: GMThreads.dll). Ta funkcja musi być wykonana żeby korzystać z dll-a. thread_create( SkryptGML, Wstrzymany? ) - Tworzy nowy wątek, w którym będzie wykonywany podany kod GML. Wątek można stworzyć wstrzymany. Zwraca uchwyt wątku, dzięki któremu można nim zarządzać za pomocą poniższych funkcji (jeśli wystąpił błąd w utworzeniu wątku - zwraca 0). Uchwyt powinien zostać zamknięty za pomocą funkcji thread_close. thread_close( UchwytWątku ) - Zamyka uchwyt podanego wątku. Uwaga: Wątek nie jest zakańczany po wywołaniu tej funkcji. thread_wait( UchwytWątku, Czas ) - Wstrzymuje wątek, który wywołuje tą funkcję do czasu aż podany wątek nie zakończy pracy lub dopóki nie upłynie podana ilość czasu. Czas podajemy w milisekundach, podając -1 funkcja wróci jedynie, gdy podany wątek zakończy pracę. Zwraca -1 jeśli wystąpił błąd (np. podano nieprawidłowy uchwyt), 0 gdy upłynęła podana ilość czasu a wątek nadal nie zakończył pracy i 1 gdy wątek zakończył pracę. thread_suspend( UchwytWątku ) - Wstrzymuje podany wątek. Zwraca 1 jeśli nie wystąpił żaden błąd. thread_resume( UchwytWątku ) - Wznawia podany wątek. Zwraca 1 jeśli nie wystąpił żaden błąd. thread_set_priority( UchwytWątku, Priorytet ) - Ustawia priorytet podanego wątku. Zwraca 1 jeśli nie wystąpił żaden błąd. Argument "Priorytet" można ustawić na: 0 = Bezczynny (Idle) - wątek będzie wykonywany gdy inne aplikacje nie będą używały procesora. 1 = Niski (Lowest) 2 = Poniżej normalnego (Low) 3 = Normalny (Normal) - Domyślny priorytet każdego wątku 4 = Powyżej normalnego (Higher) 5 = Wysoki (High) 6 = Czasu rzeczywistego (Time critical / Realtime) - Najwyższy priorytet, jako że wątek będzie korzystał z całej mocy procesora - wszystko w koło się zawiesi (system, myszka itd.), ale wątek będzie wykonywany. thread_get_priority( UchwytWątku ) - sprawdza jaki priorytet ma podany wątek, gdy wystąpi błąd przy sprawdzaniu zwraca -1. thread_get_error( UchwytWątku ) - zwraca kod błędu, który wystąpił w danym wątku. ( -1 - zły uchwyt, 0 - brak błędu, 1 - błąd GML ). thread_terminate( UchwytWątku ) - Wymusza zamknięcie wątku. Zwraca 1 jeśli wątek został zamknięty. Ostrzeżenie: używać tylko w ostateczności - zamknięty wątek nie będzie mógł zwolnić użytych zasobów, doprowadzając do wycieków pamięci. thread_is_running( UchwytWątku ) - Sprawdza czy podany wątek jest uruchomiony / czy istnieje. Jeśli tak - zwraca 1 (true). thread_set_affinity( UchwytWatku, Maska ) - ustawia maskę affinity (typ wektora bitowego) podanego wątku. Jak to działa ? Każdy bit podanej wartości (maski) reprezentuje 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: http://msdn.microsoft.com/en-us/library/ms686247(VS.85).aspx thread_set_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: http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx thread_get_cpucount() - Zwraca ilość rdzeni/procesorów. Tworzenie wątku: Wątek tworzy się za pomocą funkcji thread_create, której zwróconą wartość należałoby zapisać w zmiennej, żeby móc go później kontrolować np. GML moj_watek = thread_create( "repeat (1000) global.zmienna += 1;", 1 ); // stworz watek (wstrzymany) if ( moj_watek ) { thread_set_priority( moj_watek, 2 ); // ustaw priorytet na "ponizej normalnego" thread_resume( moj_watek ); // wznow watek } else show_message( "Nie można utworzyć wątku." ); Powyższy kod uruchomi wątek z niższym priorytetem, a jeśli nie uda się go stworzyć zostanie wyświetlona wiadomość z błędem. ;p Proste, nie ? Z takim kodem GML na pewno ;d W podanym skrypcie GML można definiować zmienne ( zmienna = 0... ), ale nie będą one dostępne z żadnego obiektu ( nawet z tego w którym wątek został utworzony ), nie licząc zmiennych globalnych. Po wykonaniu kodu wątek zostaje zakończony. "Nieskończone" wykonywanie kodu w wątkach Też proste i chyba oczywiste. ;D Do tego można użyć pętli while. np. GML moj_watek = thread_create( " while ( true ) { if ( costam ) { zrob_cos(); } zmienna += 0.1; } ", 0 ); Jednak trzeba pamiętać, że kod w pętlach jest wykonywany niezależnie od prędkości pokoju (room_speed) i dlatego taki kod spowoduje większe użycie procesora. Tak, więc nieraz trzeba użyć sleep(), żeby opóźnić wykonywanie pętli np. GML moj_watek = thread_create( " while (1) { if ( costam ) { zrob_cos(); } zmienna += 0.1; sleep( 1000 ); // poczekaj sekunde } ", 0 ); Zakończenie wątku Zakończyć wątek można za pomocą funkcji thread_terminate, ale używać jej należy tylko w ostateczności, gdyż wymuszenie zamknięcia wątku uniemożliwi mu zwolnienia zasobów z pamięci powodując tzw. memory leak. Żeby bezpiecznie zakończyć wątek trzeba skorzystać z warunków ;d przykładowy kod: GML moj_watek = thread_create( " while (!global.zakonczony) { // wykonuj dopoki watek nie zostal zakonczony usun_cos(); zrob_cos(); zrob_cos(); if ( global.zakonczony ) exit; // przerwij w tym miejscu jesli zostal zakonczony dodaj_cos(); zrob_cos(); } ", 0 ); i po prostu ustawiasz zmienną global.zakonczony na true ;o Dodatkowe informacje: Wątek jest wykonywany nawet podczas i po zmianie pokoju, dlatego trzeba sprawdzać czy dany obiekt czy zmienna istnieje. Gdy wystąpi błąd w GML (syntax error, nieznana zmienna czy obiekt itd.) wtedy wątek zostaje zakończony, bez wyświetlenia komunikatu błędu. No i można używać komentarzy ;D Znane bugi: - W wątkach GM-owych okienek wiadomości (show_message*) nie można zamknąć. - W wątkach wszystkie otwierane okna nie blokują głównego okna gry. Download (V2.0): http://www.gmclan.org/up541_4_GMThreads2.html (~9KB) W archiwum jest prosty przykład, DLL i kod źródłowy. Jeśli chcesz używać tej biblioteki - umieść mnie w credits ;D Podziękowania dla Maxpayna, za testowanie nowej wersji na swoim procku (Quad) :D Jeśli masz konto na GMC, możesz napisać w tym temacie swoją ocenę: ;D http://gmc.yoyogames.com/index.php?showtopic=390517 Testujcie i zgłaszajcie bugi ;d DLL działa tylko z GM6.1, GM7.0 i GM8.0
  7. Requiem For A Dream OST http://pl.youtube.com/watch?v=acROOrKvDPQ
  8. No niestety, w 100% nie da się zrobić odporności na fake'i / uszkodzone dane w pamięci ;p No nie wiem, czy to że MemExtractor skanuje wszystkie DLL-e używane przez proces to minus ;p Muszę w końcu dodać tą opcję żeby można było wybrać czy skanować ma też DLL-e używane przez proces ;d
  9. Snake

    Galeria Grafik

    @Cloud, bardzo fajne logo ;D
  10. Zastosuj się do szablonu albo trzeba będzie zamknąć temat. https://forum.gmclan.org/index.php?showtopic=4124 EDIT: Lul, to o teraz zrobiłeś to nie jest szablon ;[ W tamtym temacie masz kod wzoru.
  11. Snake

    AO: peal.no-ip.org

    Chyba Jakim zrobił programik edytujący pliki postaci ;p Ale żeby go dostać trzeba by było do niego napisać ;p
  12. Zmień to XORowanie z jedną liczbą losową na XORowanie z całą serią liczb losowych. Do hasha dodałbyś ziarno randoma i już jest troszeczkę ciężej to złamać ;p Dużo roboty z tym nie masz ;) Chociaż co ja mówię, "troszeczkę" nie robi różnicy ;D Trzeba by użyć czegoś znacznie lepszego ;p
  13. Wiesz... może być mocniejsze jeśli nie będziesz używał samego XOR ;] Szyfrujesz tylko 128 bajtów więc możesz użyć lepszych algorytmów ;p
  14. Hmm... przeanalizowałem Twój program i niestety w ciągu 5 minut dowiedziałem się jak to zabezpieczenie złamać ;p chodzi mi tu o drugą metodę. Niestety nie jest zbyt bezpieczna ;p
  15. Snake

    Nasze strony

    Wskaźniki do map bitowych ? W sumie to spróbuję to rozpracować ;> A jeśli chodzi o stronę Marmota to podoba mi się - prosty design :)
  16. Z aplikacji gier z Game Makera zawsze będą wyciągane zasoby trzymane w exeku (czyli te logo game makera i tło od okna messageboxa). Muzyka z zasobów zewnętrznych jest wyciągana dlatego, że została załadowana do pamięci. A sprity/backgroundy nie mogą zostać wyciągnięte bo po załadowaniu pliku obrazka od razu jest on przetwarzany na czystą mapę bitową i plik obrazka zostaje zwolniony z pamięci. A o AVI już mówiłem dlaczego są wyciągane.
  17. Snake

    Hidden Swords

    @Crack: Neue Luther Frak.
  18. To dlatego, że MemExtractor skanuje cały proces, wraz z załadowanymi modułami. A większość programów korzysta z biblioteki shell32.dll w której znajdują się animacje w AVI, więc cały czas te filmiki są z niej wyciągane ;p Muszę dodać opcję wyboru, czy ma skanować moduły czy nie ;p
  19. Kijowy pomysł. A temat przenoszę do Valhalli.
  20. W pewnym momencie hasło będzie musiało być odszyfrowane. Snifferem też idzie podejrzeć przy łączeniu. End.
  21. Takich rzeczy jak hasła do baz danych nie trzyma się w plikach. Żadne zabezpieczenia Ci nie pomogą.
  22. Myślę, że Dexarzowi chodzi o to, że każdy zobaczy jak te jego pliki są szyfrowane ;p W sumie to tak jak mówiłem - można dać locka na gry z GM. Tylko że dzięki dekompilatorowi też łatwo złamią twoje zabezpieczenia ;d
  23. Nie sądzę. Trzeba by było zwolnić je z pamięci bądź nadpisać wszystkie bajty każdego skryptu żeby to jakoś ukryć. No chyba, że ktoś będzie chciał wszystko chować w plikach i uruchamiać przez execute_file() lub execute_string(). Zastanawiam się po co Mark Overmars zrobił tak, żeby te skrypty zostawały w pamięci... pewnie po to, żeby wyświetlały się linijki kodu w razie wystąpienia błędu w gml ;p Wyciąga wszystkie obsługiwane formaty plików... tylko oczywiście takie pliki muszą znajdować się w pamięci. To raczej nie jest błąd programu tylko firefox tak na to reaguje ;P
×
×
  • Dodaj nową pozycję...