hgter Opublikowano 16 Lutego 2017 Udostępnij Opublikowano 16 Lutego 2017 Witajcie, w sumie to nie szukam żadnej odpowiedzi, ale może ktoś mi wyjaśni. Mam sobie skrypt. W nim inicjuję zmienną wynik, która potem będzie przechowywać tablicę. I tu okazało się, że może być wyciek pamięci w zależności od tego jak ją inicjuję. Jeżeli zrobię to poprawnie albo nie zrobię zupełnie (inicjacją będzie pierwsze przypisanie wartości do danej komórki w tablicy) np. Trzy "dobre" sposoby: GML var wynik var wynik=0 wynik[17]=23456 To jest ok. Ale jeżeli coś skopię i jako tablicy użyję zmiennej, która przechowywała string bez wcześniejszego wyzerowania GML var wynik='' wynik[17]=23456 To mam wyciek. Jeżeli daną zmienną wcześniej wyzeruję: GML var wynik='' wynik=0 wynik[17]=23456 To będzie dobrze. Kurde ja wiem, że to błąd sztuki z tym użyciem stringu jako tablicy, ale dlaczego tu jest wyciek. Czemu po prostu nie zmieni się typ zmiennej i koniec? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Ignatus Opublikowano 16 Lutego 2017 Udostępnij Opublikowano 16 Lutego 2017 Nie rozumiem.Jaki wyciek, o chodzi,jak to poznałeś ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 16 Lutego 2017 Autor Udostępnij Opublikowano 16 Lutego 2017 Nie rozumiem.Jaki wyciek, o chodzi,jak to poznałeś ? Testuję teraz wydajność kilku wersji różnych moich skryptów rozwiązujących ten sam problem. Przygotowałem "środowisko testowe" składające się z prostego obiektu, który w stepie wywołuje ten skrypt w pętli po kilkaset wywołań i patrzę ile "faktycznych klatek" wciąga dana wersja. Przy jednej z nich zaobserwowałem, że prędkość spada w czasie. Sprawdziłem w uruchomieniu z debbugerem ile pamięci zużywa mój program (wyświetla się to na dole debugera w czasie rzeczywistym) i w przypadku użycia tego konkretnego skryptu widać, że zużycie rośnie - a nie powinno - uruchamiam wiele razy ten sam skrypt i program nie robi nic innego poza tym. W innych wersjach skryptu użycie pamięci jest stałe. Metodą prób i błędów szukałem co w skrypcie daje taki efekt i znalazłem właśnie to co napisałem. Piszę bo może komuś się przyda - a ponadto ciekaw jestem czemu gm tutaj tak się zachowuje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 16 Lutego 2017 Udostępnij Opublikowano 16 Lutego 2017 Twój problem jest raczej w tym że robisz zmienną lokalną którą potem zamieniasz w tablicę lokalną. Poczytaj dokładnie jak działa var. ;) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 16 Lutego 2017 Autor Udostępnij Opublikowano 16 Lutego 2017 Twój problem jest raczej w tym że robisz zmienną lokalną którą potem zamieniasz w tablicę lokalną. Poczytaj dokładnie jak działa var. smile2.gif To chyba nie o to chodzi. Sprawdziłem czy to się powtórzy jeżeli będę miał utworzoną wcześniej zmienna globalną i to na niej będzie zmiana typu. Wyszło mi, że jest tak samo i że nie ma znaczenia czy zmieniam string w tablicę czy tablicę w string. Wyciek: GML global.testowa[1]=1 global.testowa='' I tu też: GML global.testowa='' global.testowa[1]=1 Ale jest różnica, jeżeli chodzi o "naprawienie": Brak wycieku: GML global.testowa='' global.testowa=0 global.testowa[1]=1 Wyciek: GML global.testowa[1]=1 global.testowa=0 global.testowa='' Ale brak wycieku: GML global.testowa[1]=1 global.testowa='' global.testowa=0 Wyciek: GML global.testowa[1]=1 global.testowa='' global.testowa=0 global.testowa='' Serio nie wiem o co chodzi. Nic głupota, ale warto na to uważać. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 17 Lutego 2017 Udostępnij Opublikowano 17 Lutego 2017 Samo robienie czegoś takiego jak tworzenie tablicy a potem zmienianie jej na coś innego jest głupotą. Natomiast jak gml na to pozwala i potrafisz zrobić scenariusz w którym się to reprodukuje to wyślij do yoyo zgłoszenie buga(opisując jak odtworzyć twój problem) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 17 Lutego 2017 Autor Udostępnij Opublikowano 17 Lutego 2017 Samo robienie czegoś takiego jak tworzenie tablicy a potem zmienianie jej na coś innego jest głupotą. Jeżeli chodzi o GML global.testowa[1]=1 global.testowa='' to się w pełni zgadzam - po prostu błąd (choć tak czy siak powinien być obsłużony poprawnie - gml z założenia pozwala na zmianę typu zmiennej -ale nie mogę znaleźć w dokumentacji "oficjalnego" przyzwolenia). Rzecz w tym, że global.testowa[1]=1 global.testowa=0 global.testowa='' jest to zgodne z dokumentacją: You can also delete an array simply by "re-assigning" the variable that defines it to a single value. This will free up the memory associated with all the entries and values for that array. For example: //Create the array for (var i = 9; i > -1; i--;) { a = i; } //Delete the array a = 0; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 17 Lutego 2017 Administratorzy Udostępnij Opublikowano 17 Lutego 2017 Ale jak testujsz "wyciek" ? Wyciek to jest, jak tworzysz zmienne i zostają w pamięci, chociaz nie są uzywane. Np. odpalasz grę i zajmuje 5MB. Dodajesz obrazek i zajmuje 6MB. Usuwasz obrazek i nadal zajmuje 6MB zamiast 5MB. Może mówisz jednak o dłuższym czasie wykonania? Pokaż metodologię, pomyślimy co tam nie gra. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
hgter Opublikowano 17 Lutego 2017 Autor Udostępnij Opublikowano 17 Lutego 2017 Ale jak testujsz "wyciek" ? Wyciek to jest, jak tworzysz zmienne i zostają w pamięci, chociaz nie są uzywane. Np. odpalasz grę i zajmuje 5MB. Dodajesz obrazek i zajmuje 6MB. Usuwasz obrazek i nadal zajmuje 6MB zamiast 5MB. Może mówisz jednak o dłuższym czasie wykonania? Pokaż metodologię, pomyślimy co tam nie gra. Zerknij na początek - tam opisałem jak to wychwyciłem (3 post od góry). Każde wykonanie serii instrukcji w stylu: GML global.testowa='' global.testowa[1]=1 w skrypcie (u mnie były to pierwotnie zmienne lokalne - potem testowałem też globalne po sugestii Threefa) powodowało przyrost zużywanej przez program pamięci (obserwowałem w debugerze). Na początku zaobserwowałem spadek prędkości z czasem (całość była wykonywana w kontrolowanych warunkach - tylko ten jeden skrypt był wywoływany wiele razy) w przypadku jednego testowanego skryptu, w debugerze okazało się, że w miarę wykonania zużycie pamięć rośnie (przy innych skryptach tego nie było). Po poszukiwaniach okazało się, że przez wiele przeróbek przeoczyłem fakt, że inicjowałem go jako string a wykorzystywałem jako tablicę. Dopiero potem zacząłem sprawdzać inne sytuacje, kolejności itp. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 8 Maja 2017 Udostępnij Opublikowano 8 Maja 2017 Pytanie czy jak zrobisz ten swój wyciek, w stepie podobno to robisz, weź daj mu sie "nawyciekać" a potem zrób sobie pod klawiszem kod GML global.testowa = 0; i zobacz czy jak wcisniesz klawisz to to zużycie pamięci nagle spadnie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
lew_leo Opublikowano 8 Maja 2017 Udostępnij Opublikowano 8 Maja 2017 a jakbyś po prostu zrobił tak: GML wynik[17]=23456 o dziwo gm da radę możesz też chyba zrobić tak tylko nie pamiętam czy do tablicy przydaje się var GML wynik[0]='' wynik[0]=0 wynik[17]=23456 tu masz text o tablicach https://docs.yoyogames.com/source/dadiospic..._06_arrays.html tak a pro po co ci ta tablica tam? może używasz złej metody to uzyskania swojego efektu Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę