Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   26 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
  • 0
hgter

Wyciek pamięci związany z tablicami

Pytanie

hgter    5

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?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

10 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
hgter    5
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Threef    14

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. ;)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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ć.

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Danielus    0

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)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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;

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
gnysek    31

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
hgter    5
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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
pablo1517    0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
lew_leo    0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

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

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

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

×