Ооооооо, где берутся такие гении? xgm.ru/forum/showthread.php?t=18742 xgm.ru/project.php?id=100&page=jass_local_vars
Вот цитата из твоего тутора:
Quote
неудаленный обьект - к примеру мы использовали констуркцию Код: local location l=GetSpellTargetLoc() после этого мы обязаны удалить эту локацию, иначе память отведенная под нее не освободиться и она будет все время "висеть". более того неудаленный юнит будет грузить движок - и как результат лаги.
То же относится и к таймеру. И если ты так веришь указанному тутору(мне он не оч понра, на хайве имхо лучше, хоть и на англ.), то ты просто обязан удалить таймер
Сообщение отредактировал Svyaga - Среда, 24 Февраля 2010, 23:02:02
Ааааа, чтобы система перестала работать? Тогда да.
ВОТ Ё-МОЁ:
Quote (Dragon93)
Svyaga, а не реально в функции "а" ловить хэндл этого таймера через GetExpiredTimer() ?,а потом удалять таймер будет удалён,проверено это ещё кот доказал
Добавлено (24-02-2010, 23:07) --------------------------------------------- О да, кстати, вот ещё, из того же тутора
Quote
Код: local unit u=GetTriggerUnit() // ---> ---> ---> set u=null
медленне чем
Код: call GetTriggerUnit() call GetTriggerUnit()
т.е. если вам надо вызвать какую либо функцию несколько раз, крепко подумайте, стоит ли ее результат заносить в локальную переменную.
в теории так,но практика показывает что в некоторых случаях куда удобнее юзать локалки + на современных(например интеловских) так особенно не ощущается разница,офк если у тебя не over9000 вызовов на один такт процессора или в очень короткое время(~0.001с)
в теории так,но практика показывает что в некоторых случаях куда удобнее юзать локалки
Ну например когда я убрал подобные локалки из своей карты, то она минимум раза в 1.5 стала меньше лагать, особенно при первом использовании какой-либо функции. Да, в некоторых случаях их очень удобно использовать. Вот например когда я использую: -Назначить спецэффект чтоб потом его уничтожить (со временем т.е.) -Назначить созданного юнита чтоб спокойно с ним выполнять действия -Использования типа: если условие выполняется то сделать локалку = 1, если нет, то локалка = 2, а потом с этой локалкой выполнять действия. Ну есть и ещё, но я отхожу от темы=) Так что всё)
Quote (Dragon93)
+ на современных(например интеловских) так особенно не ощущается разница,офк если у тебя не over 9000 вызовов на один такт процессора или в очень короткое время
Ну то что не ощущается разница это не значит что её нет=) Тем более мы говорили не о том насколько она ощущается, а о правильности использования. И ТЕМ БОЛЕЕ у мя комп средненький xD
function Trig_MoveUnitBack_Timer takes nothing returns nothing // Заносим цель спелла в локалку. local unit u = GetSpellTargetUnit() // Угол тоже занесём в локальную переменную. Т.к. буде поворачивать спиной, отнимаем от него 180. local real a = GetUnitFacing(u) - 180 // Коорды. local real x = GetUnitX(u) + 20. * Cos(a * .0174532) local real y = GetUnitY(u) + 20. * Sin(a * .0174532) // Двигаем. call SetUnitX(u,x) call SetUnitY(u,y) // Если откинули уже на нужное расстояние, то стоп мотор! if udg_distance > SquareRoot((GetUnitX(u) - udg_targetx) * (GetUnitX(u) - udg_targetx) + (GetUnitY(u) - udg_targety) * (GetUnitY(u) - udg_targety)) then // Унпаузим цель... call PauseUnit(GetSpellTargetUnit(),false) call PauseTimer(GetExpiredTimer()) call DestroyTimer(GetExpiredTimer()) endif endfunction
function Trig_MoveUnitBack_Actions takes nothing returns nothing local timer t = CreateTimer() // Отправляем юнита-кастера в переменную. set udg_caster = GetSpellAbilityUnit() // Отброс на 500 пусть будет. set udg_distance = 500 // Исходные позиции сейвим в глобалки. set udg_targetx = GetSpellTargetX() set udg_targety = GetSpellTargetY() // Паузим цель... call PauseUnit(GetSpellTargetUnit(),true) // Запускаем таймер... call TimerStart(t,0.04,true,function Trig_MoveUnitBack_Timer) endfunction
//=========================================================================== function InitTrig_MoveUnitBack takes nothing returns nothing set gg_trg_MoveUnitBack = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_MoveUnitBack,EVENT_PLAYER_UNIT_SPELL_CAST) call TriggerAddCondition(gg_trg_MoveUnitBack,Condition(function Trig_MoveUnitBack_Conditions)) call TriggerAddAction(gg_trg_MoveUnitBack,function Trig_MoveUnitBack_Actions) endfunction
function NumberOfRect takes unit ent returns integer local integer i1 = 1 local integer a loop exitwhen i1 > 8 if (RectContainsUnit(udg_Resp[i1], ent)) then set a = i1 endif set i1 = i1 + 1 endloop return a endfunction
function Help1 takes unit u returns unit set u = GetEnumUnit() return u endfunction
//=========================================================================== function Trig_Choose_Actions takes nothing returns nothing local group g local unit u local unit u2 local unit svet = GetEnteringUnit() local player p local location l local integer NumRect set NumRect = NumberOfRect(svet) set p = GetOwningPlayer(svet) call RemoveUnit(svet) call ForGroupBJ( GetUnitsInRectMatching(udg_Resp[NumRect], Condition(function IsUnitHero)), function Help1(u) ) set g = GetLastCreatedGroup() call ShowUnitHide(u) if ( PlayerForce() ) then call CreateUnitAtLoc( GetPlayerId(p), GetUnitTypeId(u), GetRectCenter(gg_rct_base1resp), bj_UNIT_FACING ) else call CreateUnitAtLoc( GetPlayerId(p), GetUnitTypeId(u), GetRectCenter(gg_rct_base2resp), bj_UNIT_FACING ) endif set u2 = GetLastCreatedUnit() set l = GetUnitLoc(u2) call PanCameraToTimedLocForPlayer( p, l, 0 ) call CreateFogModifierRectBJ( false, p, FOG_OF_WAR_VISIBLE, gg_rct_Choosing_Area ) if ( PlayerForce() ) then call CreateFogModifierRectBJ( true, p, FOG_OF_WAR_VISIBLE, gg_rct_base1resp ) call CreateFogModifierRectBJ( true, p, FOG_OF_WAR_VISIBLE, gg_rct_EnterBase1 ) else call CreateFogModifierRectBJ( true, p, FOG_OF_WAR_VISIBLE, gg_rct_base2resp ) call CreateFogModifierRectBJ( true, p, FOG_OF_WAR_VISIBLE, gg_rct_EnterBase2 ) endif call RemoveLocation(l) call DestroyGroup(g) set u = null set u2 = null set svet = null set p = null set l = null endfunction
Ну во-первых нет такой функции как GetSpellTargetX или GetSpellTargetY. Во-вторых спелл не муи. "set udg_caster = GetSpellAbilityUnit()" вообще не пойму для чего сделан, ибо нигде не используется. Исправил кое-что, но не полностью уверен, потести. (кроме исправлений также оптимизировал) Если есть вопросы - задавай =)
Ладно не разводим холивар, но ты считаешь что 9 вызовов одной и той же функции лучше одной локалки? ОО
Добавлено (01-03-2010, 23:15) --------------------------------------------- И вообще пишите на вжасс, он удобней. Сжасс тоже хорошо, но код плохо читабельный на нем, хотя и короткий.
function NumberOfRect takes unit ent returns integer local integer i1 = 1 local integer a loop exitwhen i1 > 8 if RectContainsCoords(udg_Resp[i1],GetUnitX(ent),GetUnitY(ent)) then set a = i1 endif set i1 = i1 + 1 endloop return a endfunction
function Help1 takes nothing returns nothing set udg_TEMP_UNIT_1 = GetEnumUnit() endfunction
function Trig_Choose_Actions takes nothing returns nothing local group g = CreateGroup() local unit u local unit u2 local unit svet = GetEnteringUnit() local player p = GetOwningPlayer(svet) local real x local real y local integer NumRect = NumberOfRect(svet) call RemoveUnit(svet) call GroupEnumUnitsInRect(g,udg_Resp[NumRect],Filter(function IsUnitHero)) call ForGroup(g,function Help1) set u = udg_TEMP_UNIT_1 call ShowUnit(u,false) if IsPlayerAlly(p,Player(0)) == true then set u2 = CreateUnit(p,GetUnitTypeId(u),GetRectCenterX(gg_rct_base1resp),GetRectCenterY(gg_rct_base1resp),270.) else set u2 = CreateUnit(p,GetUnitTypeId(u),GetRectCenterX(gg_rct_base2resp),GetRectCenterY(gg_rct_base2resp),270.) endif set x = GetUnitX(u2) set y = GetUnitY(u2) if GetLocalPlayer() == p then call PanCameraTo(x,y) endif call CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_Choosing_Area,true,false) if IsPlayerAlly(p,Player(0)) == true then call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_base1resp,true,false)) call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_EnterBase1,true,false)) else call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_base2resp,true,false)) call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_EnterBase2,true,false)) endif call DestroyGroup(g) set u = null set u2 = null set svet = null set p = null endfunction
Ладно не разводим холивар, но ты считаешь что 9 вызовов одной и той же функции лучше одной локалки? ОО
Ну во-первых никакого холивара и не было, а просто обсуждение. Во-вторых, насчёт локалок уже был спор в этой же теме, и было теоретически и примером из тутора доказано что намного быстрее использовать так как я предложил (и доказано было мной ), почитай на 2-3 предыдущих страницах (не помню точно сколько)
Quote (DoctorGester)
И вообще пишите на вжасс, он удобней. Сжасс тоже хорошо, но код плохо читабельный на нем, хотя и короткий.
Svyaga, ты потрясающ. Твое чсв просто зашкаливает. Я гляжу ты самый тру кодер на сайте. Ты случайно в близард не работал? А теперь мой пример. Есть некая система, которая может повесить на юнита таймер. В действиях таймера 7 локалок. Система спокойно держит около 30 юнитов на моем компе с процессором 1.4 ггц. Специально убрал все локалки и производил все расчеты прямо в функции. При 8 юнитах игра превращается в пошаговою стратегию. Причем все на нативках. Я не видел здесь сжасс, я лишь сказал на чем лучше писать.
Svyaga, ты потрясающ. Твое чсв просто зашкаливает. Я гляжу ты самый тру кодер на сайте. Ты случайно в близард не работал?
Без комментариев, ибо небольшая провокация. Лишь скажу что утверждаю то что знаю, и в этом нет ничего "такого". Во всех туторах о джасс и локалках (да так и есть) указано что быстрее работает, если много раз использовать одну и ту же нативу, чем занести её в локалку и затем использовать, а затем обнулять локалку.
Quote (DoctorGester)
Есть некая система, которая может повесить на юнита таймер. В действиях таймера 7 локалок. Система спокойно держит около 30 юнитов на моем компе с процессором 1.4 ггц. Специально убрал все локалки и производил все расчеты прямо в функции. При 8 юнитах игра превращается в пошаговою стратегию. Причем все на нативках.
Систему в студию. И вот мой пример: у меня в карте раньше было много локалок, подобных этим (т.е. ненужных), всего было около 60 тригов (может больше), и в каждом по 5-8 таких локалок. После того как я их все убрал, многие лаги уменьшились раза в полтора, а некоторые и вообще исчезли.
Сообщение отредактировал Svyaga - Вторник, 02 Марта 2010, 10:45:58
Svyaga, нужен спелл отталкивание юнита назад без JNGP. Т.к. делаю карту в WE (Sacred RPG). В общем спелл таков: Отталкивание происходит как у баратрума в доте.
Svyaga, нужен спелл отталкивание юнита назад без JNGP. Т.к. делаю карту в WE (Sacred RPG). В общем спелл таков: Отталкивание происходит как у баратрума в доте.
Ммм... Всё что я сделал это оптимизировал твою систему (т.е. сделал её короче и быстрее, мог бы ещё 3 локалки убрать, но тогда функция выглядела слишком длинной), так что не думаю что повлияет jngp у тебя или нет. А что, твоя система не работает? Отталкивание я делать не пробовал, так как пока мне это не нужно было. Но посмотрю что можно сделать.
Почему "никаких vJass-примочек и JNGP!"? о_О Да и впервые подобное вижу. "а все джассеры не юзают JNGP и vJass. " Слово "все" значит все, а не все кого знаешь. Да и почему? P.S.Написал бы в ЛС, но у тя заблокировано.
[DUОS], спасибо большое тебе за правку кода Слушай, а ты можешь указать на ошибки? Даже не то, чтобы указать, а сказать, что не так я делаю? Я вижу ты заменил все функции, использующие точки, функциями с координатами. Почему лучше использовать координаты, а не точки? Можешь объяснить какую-то логику при написании кода и его оптимизации? Заранее спасибо.
Сообщение отредактировал DiR94 - Вторник, 02 Марта 2010, 15:51:07