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.14.4.222 • 2024.14.4.268
wydana 52 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 539 dni temu
Beta
2024.1400.5.1065 •
2024.1400.5.1031
 0.19.0

wydana 13 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:
Miłosz, 🧁Cupcake🧁, Nikas, Alice, LeD, Carl-bot, pABLO, Fox, GibkiKaktus, HappyOrange, Wielki Druid, Destiny, GMRussell, fervi, r..., Threef, Uzjel, Pako, Dyno, szmalu, Korodzik, sgames, Marco, Kandif, Danieo, Tidżi, Mtax, g..., GreenClover, s..., l..., Borek, moeglich, Add92, Krzysiek1250, h..., Shockah
Shoutbox
gnysek (11:13, 05.05.26)
czekamy na GMRT
Wojo (14:53, 04.05.26)
Co tak cicho?
gnysek (11:01, 30.04.26)
Grill panie, grill.
Wojo (14:18, 29.04.26)
Jak planujecie spędzić najbliższą majówkę?
Wojo (13:15, 13.03.26)
Ja zainstalowałem sobie Linux mint na swoim laptopie :)
Wojo (10:21, 12.02.26)
Tak, po zmianach gmclan przeżywa drugą młodość. Najnowsze trendy wskazują, że ten rok będzie rokiem Linuxa, rokiem odejścia od Facebooka i rokiem odejścia od discorda na rzecz forów internetowych B)
K
Kamilek (21:57, 08.12.25)
Ale klimat tu znowu wrócić! :-D
Wojo (13:03, 07.12.25)
Żeby nie było to jednak discord jest żywy :)
Wojo (12:50, 07.12.25)
Ehh znak czasu. Prawie dwa miesiące ciszy w shoutboxie, na forum też raczej cisza i jest głównie swego rodzaju archiwum ostatnich dwóch dekad
gnysek (16:01, 16.10.25)
To już google decyduje. Mam wrażenie, ze po datach obcina stare treści.
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?