Стал замечать что у некоторых игроков вылетает варкрафт на полосе загрузки в моей карте
У меня и у тех с кем я обычно играю ни разу не было вылета

Смог узнать побольше инфы у одного игрока:
При первой загрузке карты у него карта догрузилась до "Ожидание игроков" и через несколько секунд просто вылетел варкрафт с сообщением вроде "Приложение перестало отвечать"
При второй загрузке было тоже самое, но уже айкап отреагировал и айкап выдал фатал (а варкрафт просто вылетел без единой ошибки)
При третьей загрузке вылет был уже прямо в самом начале полосы загрузки карты вместе с черным экраном
И повторюсь, во всех случаях варкрафт не фаталил, он либо зависал, либо вылетал без ошибок

Возможно полезная информация:
В карте ~520 trackable, около двадцати триггеров и огромная туча константных массивов (на самом деле в карте не больше 50 глобальных переменных, триггеры через локалку создаются)
Всё это создается/инициализируется в main потоке, в некоторых местах ExecuteFunc
Ещё в начале игры с 0.00 секунды инициализируется мультиборд
И ещё стоит обратить внимание на этот участок кода который вызывается в main потоке через ExecuteFunc:
    void Lag()
    {
        int i = 1
        unit u = CreateUnit(Player(0), 'hfoo', 0., 0., 0.)
        RemoveUnit(CreateUnit(Player(0), 'h007', 0., 0., 0.))
        RemoveUnit(CreateUnit(Player(0), 'o006', 0., 0., 0.))
        RemoveUnit(CreateUnit(Player(0), 'o001', 0., 0., 0.))
        RemoveUnit(CreateUnit(Player(0), 'H00A', 0., 0., 0.))
        whilenot( i > 41 )
        {
            RemoveDestructable(CreateDestructable(udg_decorationID[i], 0., 0., 0., 1., 1))
            RemoveUnit(CreateUnit(Player(0), udg_units[i], 0., 0., 0.))
            UnitAddAbility(u, udg_abilityQ[i])
            UnitRemoveAbility(u, udg_abilityQ[i])
            UnitAddAbility(u, udg_abilityW[i])
            UnitRemoveAbility(u, udg_abilityW[i])
            UnitAddAbility(u, udg_abilityE[i])
            UnitRemoveAbility(u, udg_abilityE[i])
            UnitAddAbility(u, udg_abilityR[i])
            UnitRemoveAbility(u, udg_abilityR[i])
            UnitAddAbility(u, udg_cardNext[i])
            UnitRemoveAbility(u, udg_cardNext[i])
            i++
        }
        RemoveUnit(u)
        u = null
    }

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

UrsaBoss:
Всё из за настройки "Качество текстур"
А что делать, я не совсем понял)
Наверное, какая-то текстура имеет размеры не кратные степени двойки.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
28
5 лет назад
Отредактирован PT153
0
Ещё в начале игры с 0.00 секунды инициализируется мультиборд
Поставь 0.01 хотя бы, это и может крашить, как писалось в некоторых туториалах.

В коде, что показан, всё чисто, но я бы вынес 41 как константную глобалку)

inject на config есть?
Какие глобалки у тебя сразу имеют значение? например constant integer A = 1
0
18
5 лет назад
0
В коде, что показан, всё чисто, но я бы вынес 41 как константную глобалку)
там define стоял, я просто для поставил туда число)
inject на config есть?
нету
Какие глобалки у тебя сразу имеют значение?
я почти всем глобалкам ставлю при объявлении null или 0 или ""
0
28
5 лет назад
Отредактирован PT153
0
я почти всем глобалкам ставлю при объявлении null или 0 или ""
ну это ты зря

Тогда остаётся только инициализацию мультибоарда передвинуть, а также проверить вызовы ExecuteFunc (что имя вызываемой функции точно есть в карте) на всякий случай.
0
18
5 лет назад
0
PT153:
Тогда остаётся только инициализацию мультибоарда передвинуть, а также проверить вызовы ExecuteFunc (что имя вызываемой функции точно было) на всякий случай.
но ещё надо учитывать что у меня и у 80% игроков всё нормально, Execute сразу можно вычеркнуть)
А насчет мультиборда я попробую
Но затестить я смогу не раньше чем завтра, поэтому можно ещё варианты предположить)
И опять повторюсь, варкрафт не крашил, просто вылет без ничего
0
26
5 лет назад
0
UrsaBoss, у него всегда вылетает при загрузке твоей карты? Грешить только на код, который у тебя и других игроков всегда исправно работает, как-то мелко.
0
18
5 лет назад
Отредактирован Hodor
0
PT153:
ну это ты зря
можно подробнее?)

8gabriel8:
UrsaBoss, у него всегда вылетает при загрузке твоей карты? Грешить только на код, который у тебя и других игроков всегда исправно работает, как-то мелко.
да, при этом на других картах которые намного тяжелее моей - всё нормально
И ещё у некоторых игроков такие же вылеты

Ещё однажды заметил ситуацию, игрок со второго раза смог прогрузить карту, но его выкинуло через 5-10 сек после старта игры (он даже успел выбрать несколько карт)
1
26
5 лет назад
1
Запускал свою карту на минимальных настройках графики?
2
18
5 лет назад
2
8gabriel8:
Запускал свою карту на минимальных настройках графики?
хм, ща попробую
Да, вылетел варкрафт с черным экраном. Нифига себе)))
Сейчас научным методом выясню какая настройка делает такое
0
26
5 лет назад
0
Скорее всего модель)
Посмотри:
0
18
5 лет назад
0
Вот блин
Всё из за настройки "Качество текстур"

А что делать, я не совсем понял)
0
28
5 лет назад
Отредактирован PT153
0
можно подробнее?)
А зачем инициализировать null, "" или 0? Все глобалки, что имеют присвоение в своём определении, выполняются в то время, как игрок кликнул на карту в списке карт. Потому лучше либо вообще ничего не прописывать, либо прописать нормальные значения, например:
globals
    constant trigger TestBuildMase = CreateTrigger()
    constant trigger TestLevelUp = CreateTrigger()
    constant trigger TestPauseTime = CreateTrigger()
    constant trigger TestResumeTime = CreateTrigger()
    constant trigger TestKillMinion = CreateTrigger()
    constant trigger TestCreateHero = CreateTrigger()
endglobals
Однако не для всех это работает. GetLocalPlayer(), CreateRegion(), CreateLeaderboard, CreateMultiboard() нельзя использовать в определении глобалок, они крашнут игру, как только игрок кликнет на карту. А, вот например, InitHashtable(), CreateTimer(), CreateTrigger() карту не крашат, потому можно сделать так:
globals
    constant hashtable Hash  =InitHashtable()
    constant timer Timer = CreateTimer()
endglobals
А ещё присвоение во время определения экономит место и, при использовании с constant, защищает переменную от случайного переназначения.

А что делать, я не совсем понял)
Найти проблемную модель и выяснить, почему она крашит.
3
26
5 лет назад
3
UrsaBoss:
Всё из за настройки "Качество текстур"
А что делать, я не совсем понял)
Наверное, какая-то текстура имеет размеры не кратные степени двойки.
Принятый ответ
0
18
5 лет назад
0
8gabriel8, благодарю
0
26
5 лет назад
0
Экспортируй все файлы в папку и начинай просмотр текстур
0
32
5 лет назад
0
8gabriel8, Про степень двойки интересное заключение, а как вы дошли до этого? я никогда не слышал за такое, охотно верю, это же поможет решить многие проблемы с вылетами
0
26
5 лет назад
Отредактирован 8gabriel8
0
Запамятовал уже, где-то читал, что размеры текстур должны быть степенью двойки. В свежем вопросе Obelick'а, на который выше оставил ссылку, просто решил проверить, будет ли у меня вылет, скачал его архив, увидел текстуру нестандартного размера, по привычке исправил, и всё нормально запустилось) Так с ним и открыли для себя и для вас причину многих вылетов.
0
18
5 лет назад
0
8gabriel8, бесконечно благодарю)))
удалил две текстуры, одна 1x1 и другая 70x70 - всё стало работать)))
Сейчас сделаю 2x2 и 64x64 и будет всё шикарно)
0
26
5 лет назад
0
Рад за тебя) Ну ты знаешь, как меня отблагодарить (плюсами)
0
18
5 лет назад
0
8gabriel8:
Рад за тебя) Ну ты знаешь, как меня отблагодарить (плюсами)
никогда не ставил плюсы/минусы, но сейчас уже поставил)
0
32
5 лет назад
0
Жаль, у меня ни одной текстуры не кратной 2 не нашлось =(
0
28
5 лет назад
0
одна 1x1
Ну так-то это нулевая степень двойки.
0
26
5 лет назад
0
Ну очень похожа на нулевую степень тройки просто)
2
18
5 лет назад
2
Вообще-то это единица в 1 степени)))
P.S я знаю что такое нулевая степень, просто боялся что вар не схавает такую текстуру)
0
26
5 лет назад
0
Bergi_Bear:
Жаль, у меня ни одной текстуры не кратной 2 не нашлось =(
А у тебя тоже довольно хитрая задачка, карта не работает на простом варике, но работает на таком же варике, заточенном всяким софтом под сетевую игру.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.