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.13.1.193 • 2024.13.1.242
wydana 182 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 317 dni temu
Beta
2024.1400.0.907 •
2024.1400.0.896
 0.17.0

wydana  2 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
10 użytkowników online na discordzie:
RogerDodg3r, LeD, Carl-bot, Andrzej Apparition, Wielki Druid, Destiny, Dyno, szmalu, 𝕯𝖎𝖆𝖓𝖆, Tidżi
Shoutbox
S
Sutikku (10:42, 14.10.25)
Ja jeszcze trafiam na fora jak szukam konkretnych haseł (chociażby wczoraj zepsuty pendrive który się identyfikuje jako Phison 2307 Boot ROM). Teraz projekty opensource często mają społeczności na discordzie i tam jest tona przydatnych informacji ale niedostępna poza discordem. Fajnie by to było wyeksponować
Korodzik (04:24, 14.10.25)
A w sumie to forum się normalnie indeksuje w wyszukiwarkach? Bo ja stwierdziłem, że np. w Google ciężko znaleźć cokolwiek z gmclanowego forum. Większość tematów jest chyba nieindeksowana od dawna...
S
Sutikku (08:44, 13.10.25)
mam niedokończony projekt bota, którego dodaje się do discorda, a on synchronizuje wiadomości z discorda -> na readonly forum. Wtedy treści mogą być indeksowane z wyszukiwarek i łatwo dostępne bez logowania. No ale leży w czyśćcu i czeka.
Wojo (11:52, 11.10.25)
Może kiedyś powróci moda na fora internetowe. Pamiętam w sumie, że czasami aktywność rosła i malała, ale tak pusto to chyba jeszcze nigdy nie było i myślę, że ta cała migracja użytkowników jest zasługą Discorda i zmiany czasów. Po prostu lata dwudzieste spowodowały zmiany trendów w internecie
S
Sutikku (09:06, 08.10.25)
najwyższa pora zopensourcować kod gmclanu!
gnysek (10:33, 06.10.25)
Może tak zrobię :D Jak znajdę czas :D
I am Lord (10:49, 01.10.25)
Tutaj powinna być na głównej jakaś wielka informacja o tym że na Discordzie teraz wszystko jest
Wojo (20:34, 17.07.25)
Discordy i Facebooki pogrzebały erę forów internetowych...
gnysek (10:36, 04.07.25)
Bo wszyscy piszą na discordzie :)
M
Modnar23 (20:08, 29.06.25)
Ja po 13 latach postanowiłem się zalogować i widzę, że straszne pustki na forum. Kiedyś to aż huczało na forum. :)
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?