Skocz do zawartości

Wyciek pamięci związany z tablicami


hgter

Rekomendowane odpowiedzi

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

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

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

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

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

  • Administratorzy

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

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

  • 2 miesiące temu...

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

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ę...