IPB

Witaj Gościu ( Zaloguj | Rejestruj )

> Uwaga!

Zanim zadasz pytanie:

1. Sprawdź czy odpowiedzi nie ma w dziale FAQ lub czy podobnego tematu nie było na forum
2. Zapoznaj się z polskim tłumaczeniem dokumentacji (help)
3. Zapoznaj się też z naszymi kursami i przykładami


Powtarzające się pytania będą karane ostrzeżeniami lub usuwaniem tematów !!!

Nigdy nie nazywaj tematu "Pomoc", "Help me!" itp. Tytuł tematu powinien być "mówiący" czyli taki, który od razu po przeczytaniu informuje o poruszanym w nim problemie.

PROSIMY PISAĆ CZY TEMAT DOTYCZY GameMaker 8.1, GameMaker:Studio LUB WCZEŚNIEJSZYCH!!!!

 
Reply to this topicStart new topic
Wyciek pamięci związany z tablicami
hgter
post 16.02.2017 - 18:32
Post #1


Smart Newbie
*

Wiek: ?
Grupa: Użytkownicy
Postów: 64
Dołączył: 15.09.2014
Uploader
Ostrzeżenia:
(0%) -----


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?
Go to the top of the page
 
+Quote Post
post 16.02.2017 - 18:32
Post #





Wiek:



Uploader


Pani kontekstowa pokazuje swe wdzięki tylko w Valhalli lub wszędzie jeżeli nie jesteś zalogowany(a)! :3
Go to the top of the page
 
Quote Post
Ignatus
post 16.02.2017 - 19:49
Post #2


Forum Veteran
*****

Wiek: 32 lata
Grupa: Użytkownicy
Postów: 368
Dołączył: 12.12.2014
Skąd: POZ
Team: 7Bones
Uploader
Ostrzeżenia:
(0%) -----


Nie rozumiem.Jaki wyciek, o chodzi,jak to poznałeś ?
Go to the top of the page
 
+Quote Post
hgter
post 16.02.2017 - 21:41
Post #3


Smart Newbie
*

Wiek: ?
Grupa: Użytkownicy
Postów: 64
Dołączył: 15.09.2014
Uploader
Ostrzeżenia:
(0%) -----


CYTAT
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.
Go to the top of the page
 
+Quote Post
Threef
post 16.02.2017 - 21:44
Post #4


Lawful Evil
Ikona grupy

Wiek: 24 lata
Grupa: Moderatorzy
Postów: 2,723
Dołączył: 7.04.2008
Skąd: Szczecin
Team: Huuuge Games

threef_games


Nagrody:
Najlepszy Uzytkownik (CA 2014)
Najlepszy Uzytkownik (CA 2012)

Uploader
Ostrzeżenia:
(0%) -----


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


--------------------
Pracuję nad: 2 Guys 1 Gun, Gra IDLE, The Great Improvisation,aVoid, Joy-N
Gry które zrobiłem na Jamach:

Boom Ball | Flappy Souls | IT was only a dream | MinoTour | Super Space Dragons Delta - Unity | Warsaw Demonstrations | Small House in Red Woods | Clearing Floor | To The Princess, up we go! | 半 満 杯 瓶 (Half Full Vial) | 2 Guys 1 Weapon | Mash for Three | Fall Of: The Run | Racist game | Dashwood's Daring Delves | Dungeon Auto-Crawler | Infection | Blesk | Hero of Tower | Gra Tekstowa | Castle Conqueror | Not so space GAME | Dozo Gozaimazu | Hokej | Icy Tower | PotatoMan want to save world, but you'll not finish the game! | Dodge 'n' Dodge | Side Scroller | Catch The Easter Egg | WarWord Kittens | Icy Towel | Super'Bad'Man | Spell Hell | Notes | Lab Experiment Demo | Invaders! | The Roaring Game | Ucieczka | dotK | LD26 | Młot | Plants vs Plants | Ogień Olimpu | MotherShip | The Ship | Symulator jaskółki | Aparature Science - Tornado | Wyścig z AI | 3423
Go to the top of the page
 
+Quote Post
hgter
post 16.02.2017 - 22:58
Post #5


Smart Newbie
*

Wiek: ?
Grupa: Użytkownicy
Postów: 64
Dołączył: 15.09.2014
Uploader
Ostrzeżenia:
(0%) -----


CYTAT
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ć.


Go to the top of the page
 
+Quote Post
Danielus
post 17.02.2017 - 10:53
Post #6


Forum Veteran
*****

Wiek: 24 lata
Grupa: Użytkownicy
Postów: 384
Dołączył: 1.07.2006
Skąd: Zakopane/Kraków
Uploader
Ostrzeżenia:
(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)


--------------------
Warn nr 1(13.08.2009):
CYTAT

Za duża sygna. Warn.
Platyna

Etoro-Kopiuj najlepszych na rynku forex
skype: Arrekinpl
Go to the top of the page
 
+Quote Post
hgter
post 17.02.2017 - 12:42
Post #7


Smart Newbie
*

Wiek: ?
Grupa: Użytkownicy
Postów: 64
Dołączył: 15.09.2014
Uploader
Ostrzeżenia:
(0%) -----


CYTAT
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
CYTAT
global.testowa[1]=1
global.testowa=0
global.testowa=''


jest to zgodne z dokumentacją:

CYTAT
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--smile2.gif
{
a[i] = i;
}
//Delete the array a = 0;



Go to the top of the page
 
+Quote Post
gnysek
post 17.02.2017 - 13:09
Post #8


Emerytowany Admin
************

Wiek: 29 lat
Grupa: Użytkownicy
Postów: 8,995
Dołączył: 2.06.2004
Skąd: Banino / Trójmiasto
Team: Gear-Studio

gnysek


Nagrody:
Najbardziej pomocny uzytkownik (CA 2011)

Uploader
Ostrzeżenia:
(0%) -----


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.


--------------------
GMCLAN NA FACEBOOKU: facebook.com/GMCLAN

Aktualne gry w PlayStation Plus

Obecne Projekty:
[||||||||||] Word Memo - 35%
[||||||||||] Digy Digy Dig - 30% [on hold]
[||||||||||] Almora Origins - 50%
Go to the top of the page
 
+Quote Post
hgter
post 17.02.2017 - 13:36
Post #9


Smart Newbie
*

Wiek: ?
Grupa: Użytkownicy
Postów: 64
Dołączył: 15.09.2014
Uploader
Ostrzeżenia:
(0%) -----


CYTAT
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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 użytkownik(ów) przegląda ten temat (1 gości i 0 anonimowych użytkowników)
0 Użytkownicy:

 



RSS Wersja Lo-Fi Aktualny czas: 25.02.2017 - 3:14