Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Akademia GMCLANu
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy dla początkujących
Treść artykułu
Referencje - jak GameMaker przechowuje informacje o zasobach
autor: gnysek (17.11.11)
W GameMakerze każdy zasób oznaczany jest kolejną liczbą naturalną. Dla ułatwienia pod większość z nich podkładana jest nazwa (zmienna globalna), tak aby łatwiej było nam operować. Każda z tych zmiennych, które są nazwami zasobów (obiekty, poziomy, grafiki) tak naprawdę zwraca jakiś numer.

Widać to dobrze tworząc nowe zasoby. Kolejne obiekty nazywane są object0, object1, object2, skrypty script0, script1, script2 itd. Końcowa liczba to właśnie id owego zasobu. Wszystkie zasoby mają swój własny licznik, do tego usuwając już istniejący zasób licznik ten nie cofa się, a istniejące zasoby nie zmieniają numeracji, aby nie generować problemów. Poza identyfikatorami zasobów, mamy też identyfikatory struktur map, particli, plików czy modeli 3D. W każdym miejscu w dokumentacji gdzie widzimy "Returns its index" - otrzymujemy jako wartość konkretne id zasobu - czyli jego referencję.

Referencje zasobów

Jak już wspomniałem, nazwy obiektów to po prostu globalne zmienne, które przetrzymują id danego zasobu. I tak np. object45 = 45. Jeśli zmienimy nazwę tego obiektu na np. objPilka, to w tym momencie id zasobu się nie zmienia - zatem poprawne jest stwierdzenie, że objPilka = 45. Warto też pamiętać, że nazwanie tegoż obiektu object99 nadal będzie zwracać 45 - ta zasada dotyczy tylko automatycznie generowanych nazw.
Zatem poniższe zapisy są równoważne:

gml:
object2.x = 17;
(2).x = 17;


Identyfikator zasobu nazywamy "referencją". Referencja odnosi się do konkretnego zasobu.

Dowód:

gml:
show_message(string(object2));


Referencje struktur danych

Jak już wspomniałem, swoje identyfikatory zwracają też np. struktury danych. Tak samo jak w przypadku drzewa zasobów (grafiki, obiekty, skrypty, czcionki itd) są to kolejne liczby naturalne, przy czym skasowanie jakiejś struktury nie powoduje cofnięcia licznika, ale jest on nadal inkrementowany.

gml:
a = ds_list_create(); // zwraca 1


Zatem poniższe zasoby są sobie równoznaczne:

gml:
ds_list_add(a,'wartosc');
ds_list_add(1,'wartosc');


W podobny sposób działają referencje na tworzone particle, modele 3D, czy otwierane pliki.

To nie zmienna przetrzymuje zasób

Nieprawdą jest, że zasób zostaje przypisany do zmiennej. Zasoby w GM są "gdzieś" w pamięci, a my dostajemy jedynie ich referencje i modyfikujemy je posługując się tymi referencjami.
To znaczy, że jeśli jakaś zmienna zostanie usunięta (najczęściej gdy znika obiekt) - zasób którego referencję ta zmienna przetrzymywała wcale nie zniknie - dla GM taka zmienna jest po prostu jakąś zmienną przetrzymującą liczbę. To programista wykorzystuje ten fakt, aby edytować zasoby.

Zatem dodając nową grafikę czy obiekt:

gml:
//jakiś kod
{
var a,b;
a = sprite_add(...);
b = instance_create(...);
}
// zmienne a i b zostały usunięte, ponieważ ich zasięg ogranicza się do bloku kodu i podrzędnych mu bloków


Po tak napisanym kodzie ani obiekt, ani grafika nie znikną - mimo, iż zmienne które miały ich referencje przestały istnieć. Dzieje się tak dla tego, że zmienna jedynie przechowuje wartość liczbową pod jakim id znajduje się dany zasób.

Wady referencji
Wadami referencji w GM jest to, że musimy pamiętać o zwalnianiu zasobów. GM nie posiada licznika referencji oraz garbage collectora który usuwałby zasoby do których nie trzymane są już referencje. Oznacza to, że dodajac w trakcie gry nową grafikę, otwierając plik czy tworząc strukturę danych (ds_xxx) zasób taki zajmuje pamięć tak długo, aż go nie usuniemy, nawet pomiędzy kolejnymi planszami (nie dotyczy to jedynie instancji obiektów).

Korzystanie z referencji do podróżowania pomiędzy zasobami
Postawienie kropki po zmiennej/referencji w GM powoduje, że odnosimy się do właściwości (zmiennej lokalnej) danej instancji/obiektu. Pisząc więc taki kod:

gml:

var a,b;
a = -1;
b = a;
repeat(10) {
a = instance_create(x,y,test);
a.nadrzedny = b;
b = a;
}


z ostatniego stworzonego obiektu możemy znaleźć pierwszy:

gml:

var a,b;
a = nadrzedny;
while (a!= -1)
{
a = a.nadrzedny;
if (a != -1) b = a;
}

show_message('Pierwszy stworzony obiekt ma id: ' + string(b));

// powyzszy kod jest rownoznaczny z:

b = nadrzedny.nadrzedny.nadrzedny.nadrzedny.nadrzedny.nadrzedny.nadrzedny.nadrzedny.nadrzedny;
show_message('Pierwszy stworzony obiekt ma id: ' + string(b));




W ten sposób można tez wkładać w siebie struktury danych. Załóżmy, że nasza gra ma 100 różnych itemów, numerowanych od 0 do 100. Każdy item ma nazwę, cenę oraz ikonkę. Do przechowywania tych danych zamiast tablic można użyć ds_mapy:

gml:
//skrypt: stworz_item
var m;
m = ds_map_create();
ds_map_add(m, 'nazwa', argument0);
ds_map_add(m, 'cena', argument1);
ds_map_add(m, 'ikona', argument2);
return m; //zwarca referencję na tę mapę


a samą listę tworzymy:

gml:

global.itemy = ds_list_create();
ds_list_add( global.itemy, stworz_item('Miecz', 500, spriteMiecz) );
ds_list_add( global.itemy, stworz_item('Potion', 100, sprPotion) );
ds_list_add( global.itemy, stworz_item('Gazeta', 10, sprGazeta) );


teraz, aby pobrać np. 2 item wystarzczy:

gml:

var mapa;

mapa = ds_list_find_value(global.itemy, pozycja-1); //pozycje numerowane są od 0, zatem drugi item ma pozycję 1.

show_message( ds_map_find_value(mapa, 'nazwa') ); //pokaże komunikat "Potion"


Oczywiście zamiast korzystania ze stringów typu 'nazwa', 'cena', 'ikona' proponuję dodać sobie jakieś stałe i przypisać im kolejne wartości jako liczby naturalne. Raz, że takie stałe będą podpowiadane w kodzie, a dwa, że zajmują mniej pamięci.

Pamiętajcie jednak, że:

gml:
ds_list_destroy(global.itemy);


Tak naprawdę kasuje tylko listę z cyferkami które odpowiadają jakimś tam referencjom na ds_mapy, ale te ds_mapy nadal istnieją w pamięci i nadal można się do nich odwoływać!
Można by powiedzieć, ze w GM referencje to po prostu kopie identyfikatora liczbowego na jakiś zasób i przypisanie do zmiennych powoduje po prostu przypisanie jakiejś liczby, która tak naprawdę nie wpływa na ten zasób. Referencje nie są wskaźnikami na miejsce w pamięci.
głosów: 7 | ocena: 8.57 oceń zasób | dodał: gnysek
Komentarze
stron: 1

1


av

Borek (21:35, 17.11.2011)

Bardzo fajny artykuł. Wszystko dobrze opisane, myślę że nie jednemu użytkownikowi się przyda

av

I am Lord (22:05, 17.11.2011)

Już wcześniej się spotkałem z zagnieżdżaniem struktur w jakimś silniku Minecrafto-podobnym ale miałem spore problemy ze zrozumieniem jak to działa, teraz już wiem dzięki

av

TO_mek (7:36, 18.11.2011)

Wadą odwoływania się w kodzie bezpośrednio do referencji jest to, że mimo iż po skasowaniu danego obiektu referencje kolejnych są numerowane dalej, to jednak po zaimportowaniu ponownie resources do nowego projektu, następuje przenumerowanie referencji.
Warto o tym pamiętać bo można się zdziwić po przeprowadzeniu exportu i ponownego importu resources i scripts do nowego projektu.

av

gnysek (10:50, 18.11.2011)

Tak, bo są numerowane wg. tego nowego projektu, jako nowo dodane zasoby.

av

Muuuuczek567 (17:11, 18.11.2011)

Wszystko to wiedziałem już wcześniej. Mimo to, fajny artykuł, ładnie napisany i przejrzyście wyjaśniony (ta, powtarzam się) ; )

av

kt1117 (17:18, 18.11.2011)

Tak samo jak Muuuuuczek567.

av

pablo1517 (2:33, 27.11.2011)

Nic nowego. Jednakże ciekawi mnie jak to jest w momencie game_end(); ? Czy gdy gra zostanie wyłączona, to nieskasowane przez nas "leaki" same się zwolnią czy może uratuje nas dopiero reset komputera ?

av

Sernat (15:28, 27.11.2011)

Tak jak w maszynie Javy - my mamy to gdzieś, niech się martwi za nas.

av

pablo1517 (17:54, 27.11.2011)

To nie jest odpowiedź na moje pytanie.

av

Sernat (21:23, 27.11.2011)

Ależ oczywiście, że jest. Mówimy o instrukcji delete odpowiedzialnej za usuwanie konkretnych elementów z pamięci, która nie istnieje ani w GMie, ani w Javie. Jeśli masz coś innego na myśli, to sorry.

av

pablo1517 (21:36, 5.12.2011)

No to ty chyba tego artykułu nie zrozumiałeś... No i w javie masz odpowiednik delete. Tak samo w GM MOŻNA zwalniać zasoby takie jak grafika, dźwieki itp. Ja zaś zapytałem, co w przypadku, gdy tego się nie zrobi, a wyłączy się grę.

av

karolo320 (21:39, 5.12.2011)

powinno usunąć przy wyłączaniu

av

Muuuuczek567 (21:47, 5.12.2011)

GM w czasie wyłączania zwalnia wszelkie załadowane zasoby (choć niektóre DLL-e trzeba zwalniać ręcznie), funkcje zwalniania/ładowania zasobów w czasie gry są po to, żeby odciążyć pamięć i nie przepełniać pamięci wszystkimi grafikami, dźwiękami itd.

av

gnysek (23:27, 5.12.2011)

System powinien zwolnić obszar chroniony pamięci zarezerwowany przez program.

av

Sernat (23:30, 5.12.2011)

"No to ty chyba tego artykułu nie zrozumiałeś... No i w javie masz odpowiednik delete. Tak samo w GM MOŻNA zwalniać zasoby takie jak grafika, dźwieki itp. Ja zaś zapytałem, co w przypadku, gdy tego się nie zrobi, a wyłączy się grę."
Weź zamilcz, jeśli twierdzisz, że w Javie mamy operator "delete". Gdyby tak było, zmieniłoby to bardzo oblicze całej ideologii Javy. Widzę, że nie dojdziemy do porozumienia . Czy wiesz na czym polega zwalnianie zasobów w GMie?

av

pablo1517 (11:39, 8.12.2011)

Na tym samym co wszędzie -.-. Na usunięciu tego zasobu z pamięci. Nie muszę dochodzić z tobą do porozumienia, skoro inni już odpowiedzieli na moje pytanie, hah!

av

I am Lord (16:58, 17.12.2011)

Gnysek popraw ostatni przykład bo funkcje mają złe nazwy ds_map_value i ds_list_value zapomniałeś o _find_

av

Sernat (17:00, 17.12.2011)

"Na tym samym co wszędzie -.-. Na usunięciu tego zasobu z pamięci. Nie muszę dochodzić z tobą do porozumienia, skoro inni już odpowiedzieli na moje pytanie, hah!"

W takim razie pragnąłbym zauważyć, że odpowiedziałem na nurtujące cię pytanie pierwszy . Widzisz to, co chcesz widzieć .

av

gnysek (20:15, 17.12.2011)

@HuderLord: dzięki za info. Tak to jest jak się pisze z pamięci

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
2 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 2, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
MaxGaming (3:18, 23.04.18):
Niekoniecznie dla reklamodawcy, ale w dużym uproszczeniu średnia wyjdzie taka sama(nie biorąc pod uwagę targetu właściciela serwisu/aplikacji, ale to już problem reklamodawcy i właściciela nośnika tych reklam).
MaxGaming (3:16, 23.04.18):
Ale dlaczego miałoby się równać? Myślę że to lepsze rozwiązanie niż stałe zużycie niezależnie od tego jaki ktoś ma komputer. Procentowe zużycie wydaje mi się dużo bardziej sprawiedliwe niż stałe dla każdego urządzenia
Wojo (10:29, 20.04.18):
Jeśli chodzi o reklamy to odpowiadają mi takie co są na gmclanie teraz niż zamienianie połowy gmclanu na reklamę podpasek czy czegoś podobnego
Wojo (10:27, 20.04.18):
Tylko, że 10% zużycia słabego komputera nie równa się 10% zużyciu dobrego komputera
Wojo (10:27, 20.04.18):
Tylko, że 10% zużycia kom
MaxGaming (1:00, 20.04.18):
Wiesz wirusy też są mimo tego że nie powinny, ale jakoś radzimy sobie z tym
MaxGaming (1:00, 20.04.18):
Mi mniej przeszkadza kopanie bitcoinów w tle niż npnatarczywe reklamy. Wolałbym natomiast aby takie strony mogły się do tego przyznać i nie były linczowane
MaxGaming (0:59, 20.04.18):
przeciwko oszustą byłby fakt braku ograniczeń. Strona musiałaby tylko informować, a czy wkorzysta 90% to jej sprawa. BYleby użytkownik wiedział sam na co się pisze
MaxGaming (0:58, 20.04.18):
Ale o to chodzi z procentami. Dzięki temu nawet jak mamy wolny komputer odczujemy tak samo. Co do innego prawa. Na każdej stronie jakoś jest informacja np. o plikach cookies. Dałoby to sięogarnąć, tym bardziej gdyby powstałą organizacja sprawdzająca takie informacje i byłaby np na jej stronie lista nieuczuciwych stron które należy unikać. Możnaby wprowadzić także w przeglądarkach żeby takie strony nie otwierały się, albo wymagały wyraźnego potwierdzenia użytkownika. Myślę że głównym argumentem
Wojo (23:08, 19.04.18):
tak samo bodajże w szwecji partia piratów chciała założyć własne małe państwo gdzie piractwo byłoby legalne dzięki czemu niektóre strony mogłyby obejść prawo w taki lub inny sposób
Wojo (23:06, 19.04.18):
a żeby mieć jakiś faktyczny zysk z takich koparek bitcoinów to musiałbyś je ustawić na jakiejś popularnej stronie bo np na takim gmclanie zbyt wiele nie wydobędziesz
Wojo (23:05, 19.04.18):
Ale to brzmi abstrakcyjnie Stronę zawsze można założyć w innym państwie gdzie takie prawo nie obowiązuje, 10% mocy obliczeniowej komputera przecież się różni w zależności od tego jak mocny mamy komputer
MaxGaming (21:08, 19.04.18):
Według mnie jeśliby ustanowić prawnie że strona która twierdzi że pobierze np. 10% mocy obliczeniowej naszego komputera na prawdę musi tyle pobierać pod groźbą kary to np kopanie bitcoin w tle jest fajną alternatywą dla reklam
Wojo (10:33, 19.04.18):
Jak dla mnie to sprytne rozwiązanie ktoś wymyślił
I am vader (0:53, 19.04.18):
Nie pamietam jak ten program sie nazywal ale za jaja bym powiesil skurczybyka ktory to zrobil.
I am vader (0:52, 19.04.18):
Odmowilem, nic wielkiego, ale potem przed pobraniem programu kazano mi kopac conajmniej jakastam chwile, tu juz sie podniosly czerwone flagi. Wiec sprawdzilem ten program pod katem wirusow i okazalo sie ze wygenerowane exeki instaluja koparki na kompach uzytkownikow.
I am vader (0:52, 19.04.18):
Znalazlem taki program ktory zamienia pliki bat w exe poniewaz powody, ale na stronie zostalem zapytany czy uzycze komputera na mineowanie kryptowalut podczas przegladania strony zeby wspomoc tworce.
I am Lord (23:59, 18.04.18):
może flash coś dodaje?
Wojo (23:06, 18.04.18):
Nawet pobrałem sobie ADW cleanera i nic nie wykrył
Wojo (22:38, 18.04.18):
No ale co mi po tym, że ktoś ma ip z Gdańska i jest zainteresowany zabawkami dla psów co jest bezużytecznymi danymi nawet dla hakera
Wojo (22:36, 18.04.18):
W sumie jak tak siedzę i się zastanawiam to może wydobyć pliki cookies, przechwycić naciśnięte klawisze
Wojo (22:33, 18.04.18):
Ale co ma śledzić? Lokalizację na podstawie ip? Bo nie rozumiem za bardzo
PsichiX (21:38, 18.04.18):
mowie o skrypcie js-agent.newrelic.com, ktory rozpoznawany jest jako narzedzie sledzace.
PsichiX (21:36, 18.04.18):
prowo?
Wojo (19:40, 18.04.18):
To tak zwane "prowo", które było nieudolną próbą "prowo" yxa
I am Lord (16:59, 18.04.18):
Aż tak ci się zacina to?
Wojo (16:11, 18.04.18):
Pół biedy ze śledzeniem ale denerwuje mnie kopanie BitCoinów przez ten link Nie ma to jak napychać portfel komuś kogo nie znam
I am Lord (0:04, 18.04.18):
Nic o tym nie wiem, a co to za skrypt?
PsichiX (23:56, 17.04.18):
a ten skrypt śledzący to Ty wrzucałeś, czy twórcy scratcha są na tyle ułomni, że coś takiego od siebie dodają? ;>
I am Lord (22:56, 17.04.18):
gnysek (9:35, 12.04.18):
No ja raz miałem nieważną z winy sekretariatu i też chyba musiałem 10zł zapłacić.
Wojo (12:34, 11.04.18):
A wszyscy co chcieli rzucić gimnazjum to po prostu strzelali kible do oporu i ich przenosili do ohp
Wojo (12:08, 11.04.18):
Nie mam jak się zapytać gdyż nie posiadam żadnych znajomych
Gibki Kaktus (10:15, 11.04.18):
To powiedz, że ich popierdoliło xD
MaxGaming (19:39, 10.04.18):
Ustawowa opłata za duplikat to właśnie 9zl. Przeczytajcie jeszcze raz o czym ja mówię :/
Gibki Kaktus (17:11, 10.04.18):
Ja jak zgubiłem to płaciłem 9 czy tam 10 zł xD
MaxGaming (23:07, 9.04.18):
Opłata 9zł to co innego, Nie bardzo, bo kolega z innej szkoły miał podobne doświadczenia...
Chell (22:59, 9.04.18):
albo uisc oplate, jeszcze nie slyszalem o darmowych duplikatach dokumentow
Ignatus (22:20, 9.04.18):
Chyba po prostu Cię nie lubią i robią sobie jaja.Przysłuchaj się przy drzwiach od sekretariatu czy nie kwiczą ze śmiechu zaraz po Twoim wyjsciu
MaxGaming (21:29, 9.04.18):
Szukam na necie i nigdzie nie widzę że jest taki przepis. I wątpie że jeśli jest to muszą to być drogie i nie czytane przez nikogo anonse. Wie ktoś coś?
MaxGaming (21:28, 9.04.18):
Ma ktoś pojęcie na jakiej podstawie szkoła może ode mnie żądać płatnego(i to słono jak za taką usługę) ogłoszenia w anonsach jeśli zgubiłem legitymacje? Twierdzą że nie mogą mi wyrobić nowej bez potwierdzenia zamieszczenia ogłoszenia w anonsach i uiszczenia opłaty...
Wojo (21:11, 9.04.18):
Nie ogarnalem ze jest tylko 48h ,myslalem ze z tydzien ;p
Ignatus (21:04, 7.04.18):
Nie ogarnalem ze jest tylko 24h ,myslalem ze z tydzien ;p
I am vader (19:00, 7.04.18):
Troche pozno zaalarmowales
Ignatus (18:25, 7.04.18):
Nieważne już ,zabrakło kilku głosów,przepadło
Ignatus (16:36, 7.04.18):
Moja żona robi charytatywnie lalki dla chorych i niepełnosprawnych dzieci.Mogę prosić o "wykop" ? www.wykop.pl/li...epelnosprawnych
PsichiX (0:04, 6.04.18):
uuu, antyleniwizm!
I am Lord (23:43, 5.04.18):
Ale kierowniczka widziała że sam ładuję to mu da popalić
I am Lord (23:42, 5.04.18):
zacząłem ładować przed 22 i gość miał mi pomóc a dał nogę
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.02671 sekund ] [ Liczba zapytań MySQL: 13 ]