Вылетает варкрафт (1.26) при загрузке сохраненной игры из за HashTable:
Not enough memory resources are avalible to process this command
Object: GamehashTableIntegerReg
(.?AUGameHashTableIntegerReg@@)


Да, у меня тяжелая генерация, но хеш она не юзает.
А памяти для загрузки hashtable почему то не хватает.

Зато реплеи работают.

Принятый ответ

Кажется разобрался:
Как ни странно хеш оказался ни при чем.
Проблема была в слишком длинной строке на ~900 русских символов которую я использовал для описания квеста.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
25
4 года назад
Отредактирован Jack-of-shadow
0
Bergi_Bear:
Да, с длинными строками известная проблема, я ее обошел путем сложения. Но тут проблема именно при загрузке сохраненной игры.

Вроде все пофиксил, даже освещение и фейд фильтр, но столкнулся похоже с нерешаемой проблемой(


Видимо всетаки придется свою систему сохранений писать, не через загрузку, а через новую игру.

Тест карта


Хотя нет решение есть, это записывать все действия с рельефом и потом повторять их при загрузке через LoadGameEvent. Но в моем случае этих действий слишком много, наверно упрусь в лимиты. Буду пробовать.
Загруженные файлы
0
17
4 года назад
Отредактирован Vlod
0
Jack-of-shadow, а восстанавливать рельеф из карты высот?
Даже подтягивая из файла, все равно придется с ней работать
0
25
4 года назад
Отредактирован Jack-of-shadow
0
Vlod:
Jack-of-shadow, а восстанавливать рельеф из карты высот?
Попробую щас через массивы если индексов не хватит, то через хеш.
типо того
globals
 int TerrainDeformC   = 0
 float array TerrainDeformX
 float array TerrainDeformY
 float array TerrainDeformD
 float array TerrainDeformZ
 
endglobals

void TerrainDeformCraterJ (float x, float y, float d, float z){
 TerrainDeformC++
 TerrainDeformX[TerrainDeformC] = x
 TerrainDeformY[TerrainDeformC] = y
 TerrainDeformD[TerrainDeformC] = d
 TerrainDeformZ[TerrainDeformC] = z
 TerrainDeformCrater(x, y, d, z, 1, true)
}

//LoadTerrain
void LoadTerrainDeform (){
 Msg(StrY("LoadTerrain: ")+I2S(TerrainDeformC))
 for_c(TerrainDeformC)
  TerrainDeformCrater(TerrainDeformX[c], TerrainDeformY[c], TerrainDeformD[c], TerrainDeformZ[c], 1, true)
 end_c
}
0
37
4 года назад
0
В vJass есть большие массивы, главное, поток не порвать, но всегда можно перейти на lua)
0
28
4 года назад
0
ScorpioT1000, на самом деле уже нет, максимальный размер массива в vJass совпадает с максимальным размером массива с версии 1.29.
0
16
4 года назад
0
дай краш лог (не дамп)
0
25
4 года назад
Отредактирован Jack-of-shadow
0
DracoL1ch:
дай краш лог (не дамп)
Лог
Пример карта
Загруженные файлы
0
16
4 года назад
0
ничего интересного, аргумент передается супер-большой, который должен быть индексом (?) массива
0
25
4 года назад
Отредактирован Jack-of-shadow
0
ScorpioT1000:
В vJass есть большие массивы, главное, поток не порвать, но всегда можно перейти на lua)
Уже пофиксил тем там всего 1500-3000 вызовов TerrainDeformCrater было, так что массива вполне хватило.

А вот SetTerrainType у меня было 32 к вызовов. Так как я их на этапе генерации использую их как разметку, для быстрой проверки местности. Тут пришлось слегка пожертвовать визуалом при загрузке сохранения (ужал до 7 к) . После загрузки сохранения она немного отличается, но это незаметно.
1
24
4 года назад
1
Если карта рандомно генерится - почему не запоминать зерно рандома и не рескручивать рандом из него заново для генерации карты после загрузки? Тогда останется запоминать только изменения которые произошли после генерации, в результате действий игрока.
0
25
4 года назад
Отредактирован Jack-of-shadow
0
prog:
Да я это планирую сделать в дальнейшем, но пока просто исправлял баг обычных сохранений.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.