Проблема: часть хэш-ключей в game cache не записывается на диск.
Т.е. во время игры все данные в кэше работают нормально.
Но когда я вызываю SaveGameCache чтобы все сохранить, то часть данных записывается нормально, а часть пропадает и в следующей игре этой части нету - GetStoredInteger возвращает 0 для части значений.
Есть какой-то алгоритм для выбора этих ключей?

Я бы при старте вычищал кешь перед загрузкой, то он имеет багу - создаваться не пустым.
Так же процесс сохранение ресуросемкий, не стоит делать в циклах и так далее.
      string talentkey = ConvertTalentNumberToKey(n) //
        string creakey = ConvertCreatureToKey(i) //
Вот это всеще не советую юзать, у меня ломалось взятие имени абилки, поэтому прямо вбивайте в код ключи, никогда не пытайтесь читать строковые ключи откуда-либо, начинаются непонятные баги (вероятно упущение со строками, в JASM машине).
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
выбираешь все юниты,деструктэйблы,итемы и сохраняеш в кэш а также сохраняешь их координаты,но в мультиплеере кэш нельзя сохранить на диск,так что если надо сохранять в мультиплеере то юзай прелоад а если не надо сохранять на диск то юзай структуры или хэш
ответ
>глобальные переменные, не приватные
>куда-то выгружать, чтобы использовать в другом триггере

надеюсь, суть намёка понятна
ответ
~8gabriel8:
Camby, чем вас не устраивает способ Blizzard? Переносите в кэше героя с предметом, предмет перемещаете в нужное место, а героя из игры убираете.
ответ
ProximityCat:
Ну суть в том, что загруженную прелоадом информацию можно сохранить в кеш, а потом уже синхронизировать.
ответ
А её и не надо создавать
Смотри в сторону счетчика игр (ливнул/ доиграл до конца)
в коде всё есть и хорошо разжевано, что непонятно - спрашивай
Только тут начало идёт от какого-то 1940 (не помню число, надо с 0 начать считать), как начнёшь ковырять, сразу всё поймёшь

22
Vlod, не, такая проблема не только внутри циклов.
Даже если сохранять по одному за раз.
Записываю - Сохраняю кеш - вывожу дебагом - число на месте
Затем загружаю кеш с диска - в половине случаев число на месте, а в половине ноль.
Не в цикле, отдельно.
18
Ок, а если после записи проверять чтением успех. В случае неудачи - повторить попытку. Также можно увеличить таймаут между записями, если он есть.

Или у тебя определенные ключи не работают?
22
Vlod, вроде того. причем нет какого-то принципа почему ключ не подходит, дело не в длине.
задержка перед загрузкой с диска для проверки у меня была 3 секунды.
Одни ключи сохраняются, а другие нет.
Как пример, пара "гуль" + "талант1" работает, а "скелет лучник" + "2" не работает.
либо "настройки" + "язык" не работает, а "настройки" + "смещение текста" работает, хотя ключ длиннее.
При чем проблема именно в сохранении данных на диске, в сам кеш в озу все сохраняется и выгружается нормально
11
biridius, в таких делах еще б надо версию в вопросе писать в 1.31 изменения по части кэша произошли.
24
biridius, я очень надеюсь, что вы не пользуетесь кирилицей в ключах и это просто пример в комментарии выше.
23
Сколько карт? Ключи точно проверили на 10 раз, что они верные? Можно скриншот сохранения/загрузки, на всякий случай.
В свое время мне говорили, что кэш бывает не записывает данные в цикле, данные теряются.
Так же, если карт несколько, нужно сохранять из карты в карту все имеющиеся данные. Например, если вы сохранили "А" в карте "1", не загружаете его в карте "2", но загружаете в карте "3", то данные тоже могут потеряться.
У меня в моем проекте 5 полноценных карт и система сохранения/загрузки через кэш работает идеально. Логические вот точно знаю, что иногда пропадают, поэтому перешел полностью на целочисленные.
22
Obelick, карта одна, система используется для сохранения талантов.
код для тестов
        string talentkey = ConvertTalentNumberToKey(n) //
        string creakey = ConvertCreatureToKey(i) //

        StoreInteger(udg_cache, creakey, talentkey, 1)
        BJDebugMsg("saved "+I2S(GetStoredInteger(udg_cache, creakey, talentkey)))
        SaveGameCache(udg_cache)

        TriggerSleepAction(3.)
        BJDebugMsg("3sec later, the value is "+I2S(GetStoredInteger(udg_cache, creakey, talentkey)))

        ReloadGameCachesFromDisk()
        TriggerSleepAction(3.)
        BJDebugMsg("3sec after reloading the cache "+I2S(GetStoredInteger(udg_cache, creakey, talentkey)))
для части ключей дает после перезагрузки с диска 1, а для части 0
перед перезагрузкой с диска всегда показывает 1
26
Как-то сталкивались с переполнением кэша, лечили созданием нового пользователя.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.