Существуют ли какие-нибудь способы оптимизировать карту так, чтобы она не лагала в лейтгейме? Дело в том, что при игре на 16 человек карта сильно лагает даже на весьма мощном компьютере, падает фпс до 30 и, самое худшее, что появляются фризы каждые несколько секунд.

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

От плохих рук ещё не придумали оптимизаторов.
Могу предположить что почти весь код у тебя на GUI и там дофига работы с точками (которые потом не удаляются)
+ гуишные действия для юнитов в области и т.д (в этом случае утекает группа, и как объект и как переменная)
+ тоже самое с гуишным созданием юнитов
Перечислять возможные утечки и т.п - можно долго
Ну и большой размер игровой карты тоже ухудшает ситуацию
Вместе с большим размером игровой карты - увеличивает нагрузку большое кол-во триггеров
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
6 лет назад
0
Похожие вопросы:

ответ
Roy Mustang:
ну у тебя там почти 1000 юнитов. конечно будет лагать, незнаю попробуй откл список кистей.
Окно - > Список кистей
ответ
XGM Bot:
Похожие вопросы:

ответ
Roy Mustang:
ну у тебя там почти 1000 юнитов. конечно будет лагать, незнаю попробуй откл список кистей.
Окно - > Список кистей
ответ
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка
Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
ответ
При конвертации моделей из игр в MDX их вес велик как и вес их текстур ! Я оптимизирую и сжимаю модель через MDLvis а текстуры через BLP Laboratory но их вес все еще внушителен ( Есть ли другие варианты среза веса без дефектов материала ?
Нет. Только удаление лишних анимаций. Остальную оптимизацию веса сделает mdlvis.
При импорте некоторых моделей в карту возникает проблема с их выбором при манипуляции ( Передвижения ) словно их Выбор отсутствует , Думаю некоторые с подобным сталкивались ...
Если модель нельзя выделить в игре курсором, у неё отсутствуют collision shapes (формы коллизии). Их можно добавить в War3ModelEditor -> Окна -> Редактор узлов -> правый клик -> Создать форму - > отредактировать размеры и положение. Их можно добавить несколько, чтобы покрыть модель целиком. Они отвечают за взаимодействие модели с курсором.

Один ресурс - один вопрос, после пойдут замечания.
ответ
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
ответ
в самой последней строке самой последней функции присваивай какое-то значение глобалке и будет тебе счастье знать, что всё закончилось успешно

ответ
call SaveInteger(udg_Hash,StringHash("x"),1,GetPlayerId(GetOwningPlayer(Caster)))

function Trig_R_Boom takes unit d, unit c returns nothing

call GroupEnumUnitsInRange(g, x, y,500,Condition(function FilterR))
loop
	set f = FirstOfGroup(g)
    exitwhen f == null
    call UnitDamageTarget(c,f,400, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
    call GroupRemoveUnit(g,f)
endloop

В конце функции Trig_R_Actions( )не обнулена переменная типа timer.
- Короче, вот:
function Trig_LOCAL_TimerR takes nothing returns nothing
    local  timer   timerer =  GetExpiredTimer( )
    local  integer i       =  GetHandleId( timerer )
    local  unit    Caster  =  LoadUnitHandle( udg_Hash, i, 4 )
    local  unit    Dummy   =  LoadUnitHandle( udg_Hash, i, 3 )
    local  real    xd      =  GetUnitX( Dummy )
    local  real    yd      =  GetUnitY( Dummy )
    local  group   g       =  null
    local  unit    f       =  null

    if ( GetWidgetLife( Dummy ) < 0.405 ) then

        set  g  =  CreateGroup( )

        call GroupEnumUnitsInRange( g, xd, yd, 500.0, null )
        loop
            set  f  =  FirstOfGroup( g )
            exitwhen ( f == null )
            call GroupRemoveUnit( g, f )

            if IsUnitEnemy( f, GetOwningPlayer( Caster ) ) and ( GetWidgetLife( f ) > 0.405 ) and ( not IsUnitType( f, UNIT_TYPE_STRUCTURE ) ) and ( not IsUnitType( f, UNIT_TYPE_FLYING ) ) then
                call UnitDamageTarget( Caster, f, 400.0, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
            endif

        endloop

        call DestroyGroup( g )
        set  g  =  null

        call FlushChildHashtable( udg_Hash, i )
        call DestroyTimer( timerer )
        set  Dummy  =  CreateUnit( GetOwningPlayer( Caster ), 'u001', xd, yd, 0.0 )
        call UnitApplyTimedLife( Dummy, 'BTLF', 2.0 )

    else
        set  xd = GetUnitX( Dummy ) + 10.0 * Cos( GetUnitFacing( Dummy ) * bj_DEGTORAD )
        set  yd = GetUnitY( Dummy ) + 10.0 * Sin( GetUnitFacing( Dummy ) * bj_DEGTORAD )
        call SetUnitPosition( Dummy, xd, yd )
    endif

    set  timerer  =  null
    set  Caster   =  null
    set  Dummy    =  null
endfunction


function Trig_R_Actions takes nothing returns nothing
    local  unit     Caster   =  GetTriggerUnit( )
    local  real     xt       =  GetSpellTargetX( )
    local  real     yt       =  GetSpellTargetY( )
    local  real     xc       =  GetUnitX( Caster )
    local  real     yc       =  GetUnitY( Caster )
    local  unit     Dummy    =  CreateUnit( GetOwningPlayer( Caster ), 'u000', xc, yc, bj_RADTODEG * Atan2( yt - yc, xt - xc ) )
    local  timer    timerer  =  CreateTimer( )
    local  integer  i        =  GetHandleId( timerer )

    call SetUnitAnimation( Dummy, "Birth" )
    call UnitApplyTimedLife( Dummy, 'BTLF', 1.0 )
    call SaveUnitHandle( udg_Hash, i, 3, Dummy )
    call SaveUnitHandle( udg_Hash, i, 4, Caster )
    call TimerStart( timerer, 0.01, true, function Trig_LOCAL_TimerR )

    set  Caster   =  null
    set  Dummy    =  null
    set  timerer  =  null
endfunction

0
18
6 лет назад
Отредактирован Hodor
0
От плохих рук ещё не придумали оптимизаторов.
Могу предположить что почти весь код у тебя на GUI и там дофига работы с точками (которые потом не удаляются)
+ гуишные действия для юнитов в области и т.д (в этом случае утекает группа, и как объект и как переменная)
+ тоже самое с гуишным созданием юнитов
Перечислять возможные утечки и т.п - можно долго
Ну и большой размер игровой карты тоже ухудшает ситуацию
Вместе с большим размером игровой карты - увеличивает нагрузку большое кол-во триггеров
Принятый ответ
0
12
6 лет назад
0
Ознакомьтесь сначала со статьей про оптимизацию
0
32
6 лет назад
0
Ну оптимизаторы убирают самые тупые и типичные проблемы, остальное - можно только руками. На гуи делать динамичные карты в 2018 - себя не уважать, учите jass сразу попадут и лаги и долгие загрузки и в игре добавится куча фишек и интересных деталей, ранее вам недоступных как и 90% картоделов прошлого.
0
12
6 лет назад
0
Спасибо всем за ответы. Как я понял, на "просто" сделанной карте (я использовал только стандартные фичи типа редактора объектов, кодить не умею). На будущее буду изучать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.