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.2.0.132 • 2024.2.0.163
wydana 43 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 182 dni temu
Beta
2024.400.0.532 • 2024.400.0.551
wydana 14 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
42 użytkownicy online na discordzie:
Kysiu, debil debilowski, s..., Alice, DungeonFairy🧚, Nitro Slav, Carl-bot, RogerDodg3r, Grela, Wielki Druid, Add92, Kowu, Filyps, fervi, Kalor, r..., Dod, antek, LadyLush, lethian, Pako, Arrekin, Dyno, 🆅🅸🆃🅾74🅼, Deusald, szmalu, Korodzik, Miłosz, LeD, Ulti, 🧁Cupcake🧁, bagno, Tidżi, Mtax, g..., l..., Alkapivo, moeglich, Nikas, Shockah, Kandif, exigo
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?