GMS 2023.4 - hashe struktur

Sobota, 15 Kwietnia 2023, 15:06
Czas czytania 2 minuty, 3 sekundy
Zgodne z GM: gms2
Do czego służą funkcja variable_get_hash() ?
W GameMakerze co prawda istnieje zasada, że nazwy zmiennych mogą zawierać jedynie znak podkreślenia, łacińskie litery i cyfry (i nie mogą się zaczynać od cyfry), ale struktury pozwalają na używanie dowolnych nazw (włącznie ze spacjami i znakami diakrytycznymi) za pomocą funkcji:
kodvariable_struct_set(struct, name, value);oraz jej skróconego akcesora: struct[$ name] = value;

Żeby jednak to obsłużyć, pod maską GM używa hashy do przetrzymywania takich wartości, dzięki czemu jest to szybsze i odchodzi problem nietypowych liter w różnych językach.

Wskazówka:
Od wersji 2023.4 wprowadzono dodatkowe aliasy funkcji variable_struct_set, variable_struct_get, variable_struct_get_names, variable_struct_names_count, variable_struct_remove, variable_struct_exists, zabierając słowo "variable_". Możemy więc zamiennie używać struct_exists, struct_get, struct_set, struct_get_names, struct_names_count, struct_remove

Niestety, używanie struct[$ "klucz"] zamiast struct.klucz jest ok. 3x wolniejsze, gdyż za każdym razem wyliczany jest odpowiedni hash.

Dlatego w wersji 2023.4+ postanowiono udostępnić możliwość zapamiętania wyliczonego hasha i w ten sposób odczytywania wartości zmiennych w strukturze.

kodhash = variable_get_hash("klucz")
W ten sposób otrzymujemy na stałe hasha do zmiennych nazwanych "klucz" w dowolnej strukturze (wszystkie struktury hashują swoje nazwy tak samo).

Potem wystarczy już tylko odczytać zmienną "a" w strukturze za pomocą tej składni:

kodval = struct_get_from_hash(struct, hash);
Chociaż taki zapis od strony programisty nie jest szybszy, to jest on wolniejszy od struct.klucz raptem o max 1.15x.

Wskazówka:
Jeśli pobieramy jakąś wartość w evencie step 1 raz i wcześniej liczymy hash w tym samym evencie, nie uzyskamy żadnego zysku z tej konstrukcji. Aby uzyskać różnicę, dany hash musi albo nie być wyliczany co każdy step, albo użyty przynajmniej dwa razy w jednym stepie. Oznacza to, że najlepszy zysk dostaniemy, gdy hash wyliczymy w evencie Create, a potem używamy go np. w pętli, gdzie operujemy na tablicy struktur, lub na jakiejś zagłębionej strukturze.
.

Hashowanie ma zatem największy sens w przypadku dużych struktur danych, gdy mamy jakieś dynamiczne klucze, lub koniecznie chcemy używać nazw które nie są dozwolone jako zmienne w GML (np. aby generować JSON) - zapis struct.variable zawsze będzie najszybszy.
Komentarze (łącznie 0):
Nie ma jeszcze żadnego komentarza. Czas to zmienić

Najnowsze wersje GameMakera:

Stabilna
2024.11.0.179 • 2024.11.0.227
wydana  2 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 18 dni temu
Beta
2024.1100.0.713 •
2024.1100.0.726
 0.14.0

wydana 10 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
37 użytkowników online na discordzie:
🧁Cupcake🧁, Alice, Carl-bot, Wielki Druid, Kowu, LadyLush, GMRussell, fervi, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, Kalor, PhysX ᴺⱽᴵᴰᴵᴬ, r..., antek, HappyOrange, Arrekin, Rozen, MagnusArias, yazaa, Domeen0, Dyno, szmalu, LeD, ZYGZAK, Miłosz, blackamul, Ulti, bagno, Sporek, Danieo, Mtax, Huder, l..., moeglich, s..., Add92, Shockah, PeekoHiko
Shoutbox
Uzjel (20:17, 10.12.24)
Cały ruch przeniósł się na Discorda.
MagnusArias (17:43, 01.12.24)
O matko... a ja tutaj jestem od ponad 15 lat i czasami zaglądam... biernie bo biernie, ale czasem wpadnę
gnysek (11:46, 17.11.24)
Witamy, witamy!
baca (12:22, 16.11.24)
To już 25 lat.. Witam po paru latach nieobecności.
gnysek (11:05, 15.11.24)
Natomiast obecne forum istnieje od 2004, jak z iglu.cz na gmclan.org przeszliśmy i od tego czasu nie było resetów danych.
gnysek (12:35, 13.11.24)
Ogólnie GMCLAN istnieje 22 lata, ale na to trofeum nie zrobiłem (jeszcze xD)
Chell (20:41, 08.11.24)
wow, ta emotka w ogóle nie wygląda jak : O xD
Chell (20:40, 08.11.24)
tylko? :O 4tk ma 15
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?