|
|
|
|
[Вопрос] Утечки в карте
|
|
Tsarego | Дата: Вторник, 05 Июня 2012, 21:42:23 | Сообщение # 1 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| После часа игры в моей карте возникают лаги. Это - единственные цикловые триггеры, которые активны на момент начала лагов. Кто-нибудь может сказать, есть ли в них утечки? http://s019.radikal.ru/i621/1206/ea/576daec61b47.jpg http://s019.radikal.ru/i617/1206/c0/9ee547959aa9.jpgДобавлено (05 Июнь 2012, 21:42:23) --------------------------------------------- Забыл добавить, что первый триггер - счет существующих юнитов у игроков в таблице. Второй - спаун Огненных тварей у здания и направление их к точке сбора этого здания.
|
|
|
|
kapa6acvlk | Дата: Вторник, 05 Июня 2012, 21:43:26 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Создание юнита через Гуи вызывает кучу утечек само по себе. Да и вайты лучше не использовать.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Ty3uK | Дата: Вторник, 05 Июня 2012, 21:48:12 | Сообщение # 3 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| в каком месте создание юнита на бж утекает? куча действий - да, утекает- лолнет
|
|
|
|
Tsarego | Дата: Вторник, 05 Июня 2012, 21:55:35 | Сообщение # 4 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| kapa6acvlk, а что плохого в wait? Я думал, что ожидание разгружает компьютер .
|
|
|
|
Ty3uK | Дата: Вторник, 05 Июня 2012, 22:00:52 | Сообщение # 5 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| ты плохо разбираешься в работе центрального процессора ожидание создает еще один поток, который процессору нужно обработать вроде как
|
|
|
|
kapa6acvlk | Дата: Вторник, 05 Июня 2012, 22:02:04 | Сообщение # 6 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| 2Ty3uK Если делать так, как Tsarego, то утечки на создании юнита не будет, но в 99,999% не используют переменную для точки с последующем удалением, и появляется утечка.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Tsarego | Дата: Вторник, 05 Июня 2012, 22:18:55 | Сообщение # 7 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Quote (Ty3uK) ты плохо разбираешься в работе центрального процессора Будем честными. Вообще не разбираюсь . Quote (kapa6acvlk) но в 99,999% не используют переменную для точки с последующем удалением, и появляется утечка. Когда в карте появляются лаги, волей-неволей будешь использовать все средства оптимизации, которые знаешь, в зацикленных триггерах . ______
Теперь тоже вопрос по теме. Будет ли вызывать расчет массива count для 12-и игроков, если каждый из них имеет ~100 живых юнитов, лаги? (триггер 1)
|
|
|
|
kapa6acvlk | Дата: Вторник, 05 Июня 2012, 23:00:04 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Tsarego, Лучше напиши на JASS, всего пара строчек.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 09:56:32 | Сообщение # 9 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Кстати, в коде используется GetPlayerUnitsCount. Вызывает ли утечки данная функция? Добавлено (06 Июнь 2012, 09:56:32) --------------------------------------------- Вот, я поменял триггер с этого (что было сделано с помощью GUI). Code function Trig_table_redacted1_Actions takes nothing returns nothing set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 12 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd set udg_count[GetForLoopIndexA()] = GetPlayerUnitCount(ConvertedPlayer(GetForLoopIndexA()), false) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop set bj_forLoopAIndex = 1 set bj_forLoopAIndexEnd = 12 loop exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd call LeaderboardSetPlayerItemValueBJ( ConvertedPlayer(GetForLoopIndexA()), udg_Tableaudescore, udg_count[GetForLoopIndexA()] ) set bj_forLoopAIndex = bj_forLoopAIndex + 1 endloop call LeaderboardSortItemsBJ( udg_Tableaudescore, bj_SORTTYPE_SORTBYVALUE, false ) endfunction
//=========================================================================== function InitTrig_table_redacted1 takes nothing returns nothing set gg_trg_table_redacted1 = CreateTrigger( ) call DisableTrigger( gg_trg_table_redacted1 ) call TriggerRegisterTimerEventPeriodic( gg_trg_table_redacted1, 5.00 ) call TriggerAddAction( gg_trg_table_redacted1, function Trig_table_redacted1_Actions ) endfunction на это Code function Trig_table_redacted_JASS_Actions takes nothing returns nothing local integer a set a = 1 loop exitwhen a == 12 call LeaderboardSetPlayerItemValueBJ( ConvertedPlayer(a), udg_Tableaudescore, GetPlayerUnitCount(ConvertedPlayer(a), false) ) set a = a + 1 endloop call LeaderboardSortItemsBJ( udg_Tableaudescore, bj_SORTTYPE_SORTBYVALUE, false ) set a = 0 endfunction
//=========================================================================== function InitTrig_table_redacted_JASS takes nothing returns nothing set gg_trg_table_redacted_JASS = CreateTrigger( ) call TriggerRegisterTimerEventPeriodic( gg_trg_table_redacted_JASS, 5.00 ) call TriggerAddAction( gg_trg_table_redacted_JASS, function Trig_table_redacted_JASS_Actions ) endfunction Но разве что-то изменилось в производительности?
|
|
|
|
Gamefr@nk | Дата: Среда, 06 Июня 2012, 11:19:07 | Сообщение # 10 |
8 уровень
Группа: Проверенные
Сообщений: 638
Награды: 0
Репутация: 188
Блокировки:
| Tsarego, я не уверен, но вроде где то читал что с мб,лб в бж утечек нет,т.е по сути(я не уверен на 100%) ты просто сократил пару строк текста. Добавлено (06 Июнь 2012, 11:17:58) --------------------------------------------- а создание юнитов ,можно перевести в jass и вместо точек юзать x,y Добавлено (06 Июнь 2012, 11:19:07) --------------------------------------------- И вроде как Quote (Tsarego) которые активны на момент начала лагов. не суть важно, ибо утеки накапливаются постепенно.
|
|
|
|
SirNikolas | Дата: Среда, 06 Июня 2012, 11:42:06 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Code function Trig_table_redacted_JASS_Actions takes nothing returns nothing local integer i = 0 loop call LeaderboardSetItemValue(udg_Tableaudescore, LeaderboardGetPlayerIndex(udg_Tableaudescore, Player(i)), GetPlayerUnitCount(Player(i), false)) exitwhen i == 11 set i = i + 1 endloop call LeaderboardSortItemsByValue(udg_Tableaudescore, false) endfunction
function InitTrig_table_redacted_JASS_Actions takes nothing returns nothing call TimerStart(CreateTimer(), 5., true, function Trig_table_redacted_JASS_Actions) endfunction Так немного лучше. Но здесь утечек нет. Покажи другие периодические триггеры.
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 13:36:26 | Сообщение # 12 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Вот еще триггеры, которые периодические/выполняются много раз. Вопрос: создает ли утечку камера? (действие триггера не периодическое) Quote (Gamefr@nk) не суть важно, ибо утеки накапливаются постепенно. Но ведь триггеры, которые не активны, не должны вызывать лагов. Разве нет? __________ 1.Удаление погибших из игры (в карте войск создается очень много) http://i008.radikal.ru/1206/4d/9c913e6c6a80.jpg 2.Написание игрового сообщения каждые 5 минут http://s019.radikal.ru/i644/1206/7f/c296c75512fe.jpg 3.Выдача денег игрокам по таймеру (каждые 15 сек.) и сообщение о том, сколько далось http://s52.radikal.ru/i138/1206/d0/cfc0f603228e.jpg 4.Создание 2-х колдунов в позиции юнита http://s53.radikal.ru/i140/1206/11/bc252553a2ef.jpg 5.Спец. юниту приказывается призвать голема в любой точке на карте http://s48.radikal.ru/i121/1206/31/a1b78b6a6da0.jpg 6.Всем юнитам игрока окрашиваются в красный цвет, получают хар-ку "нежить", способность "возрождение", а те у кого +1000хп - способность "уменьшение здоровья" http://s019.radikal.ru/i624/1206/b9/ddd708c321bb.jpg 7.Триггер используется только 1 раз, но в нем используются спецэффекты без переменных. Мб. он создает утечки? http://s019.radikal.ru/i637/1206/9d/fbc22bb24222.jpg ________
Не используются во время начала лагов триггеры 4,5,6,7
|
|
|
|
SirNikolas | Дата: Среда, 06 Июня 2012, 13:56:25 | Сообщение # 13 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Player group(Player(Integer A)) создает утечку. All players controlled by a (Player(legion_number)) создает утечку. Center of (Playable map area) offset by (legion_position[1], legion_position[2]) создает две утечки. Position of Страж 0206 <gen> создает утечку. Также, возможно, утекает группа при создании (см. код BJ). Фиксится следующим образом:Code set udg_group = CreateGroup() call GroupEnumUnitsOfPlayer(udg_group, udg_FrostmournePlayer, null) //Pick every unit in... call DestroyGroup(udg_group)
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 14:23:33 | Сообщение # 14 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| SirNikolas, спасибо, устранил некоторые утечки, только есть проблемы. Quote (SirNikolas) Center of (Playable map area) offset by (legion_position[1], legion_position[2]) создает две утечки. Я здесь вижу только одну утечку Quote (SirNikolas) Player group(Player(Integer A)) создает утечку. функция For each Integer A from 1 to 12 //действия с игроками Player(Integer A)
Pick every player in group and do //действия с игроками Picked Player
Эти 2 функции равноценно ущербны?
Спасибо за помощь. Но можно еще ответ на вопрос? Quote (Tsarego) Но ведь триггеры, которые не активны, не должны вызывать лагов. Разве нет? Добавлено (06 Июнь 2012, 14:23:33) ---------------------------------------------
Quote (SirNikolas) All players controlled by a (Player(legion_number)) Я заменил это на Player group(Player(legion_number)). Это, я так понимаю тоже вызовет утечку?
|
|
|
|
Gamefr@nk | Дата: Среда, 06 Июня 2012, 14:27:03 | Сообщение # 15 |
8 уровень
Группа: Проверенные
Сообщений: 638
Награды: 0
Репутация: 188
Блокировки:
| Quote (Tsarego) Но ведь триггеры, которые не активны, не должны вызывать лагов. Разве нет? Ну если у тя до вот начала утечек были какие либо тригеры, и они имеют утечки, то утечки даже после выключения тригера остаются.
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 14:28:49 | Сообщение # 16 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Quote (Gamefr@nk) Ну если у тя до вот начала утечек были какие либо тригеры, и они имеют утечки, то утечки даже после выключения тригера остаются. Я просто хотел "отсеить" триггеры, которые уж точно вызывают много утечек. А получилось так, что все утечки были в триггерах, которые были выключены .
|
|
|
|
SirNikolas | Дата: Среда, 06 Июня 2012, 14:38:35 | Сообщение # 17 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Tsarego) Эти 2 функции равноценно ущербны? Нет, вторая ущербнее. Quote (Tsarego) Я заменил это на Player group(Player(legion_number)). Это, я так понимаю тоже вызовет утечку? Да. Сначала нужно записать это в переменную типа force, а затем сделать DestroyForce(...).Quote (Tsarego) Я здесь вижу только одну утечку Я перепутал это с polar offset. Здесь действительно одна. Однако в данном случае не лучше ли использовать Location(x, y)?Quote (Tsarego) Я просто хотел "отсеять" триггеры, которые уж точно вызывают много утечек. А получилось так, что все утечки были в триггерах, которые были выключены. И карта все равно тормозит?
|
|
|
|
Gamefr@nk | Дата: Среда, 06 Июня 2012, 14:47:33 | Сообщение # 18 |
8 уровень
Группа: Проверенные
Сообщений: 638
Награды: 0
Репутация: 188
Блокировки:
| Tsarego, Ну суть в том что если тригер когда либо работал и был даже вырублен, его действия "записальись в памяти" ,ну утечные то точно SirNikolas, Если не прав поправь,самому интересно,но сам лично стараюсь убрать везде утечки.
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 14:50:21 | Сообщение # 19 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Quote (SirNikolas) И карта все равно тормозит? Ага. Но только в мультиплеереДобавлено (06 Июнь 2012, 14:50:21) ---------------------------------------------
Quote (Gamefr@nk) Tsarego, Ну суть в том что если тригер когда либо работал и был даже вырублен, его действия "записальись в памяти" ,ну утечные то точно Я, друг, это знаю, т.к. пришлось прочитать не мало документации по утечкам
|
|
|
|
Ty3uK | Дата: Среда, 06 Июня 2012, 14:52:52 | Сообщение # 20 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| стараюсь писать без утечек Добавлено (06 Июнь 2012, 14:52:52) --------------------------------------------- лаги в мультике могут обуславливаться высоким пингом
|
|
|
|
Tsarego | Дата: Среда, 06 Июня 2012, 15:00:27 | Сообщение # 21 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Quote (Ty3uK) стараюсь писать без утечек Когда я начинал, я был совсем нубом, который даже не знал, что триггеры создают утечки Quote (Ty3uK) лаги в мультике могут обуславливаться высоким пингом Пинг между мною и моими друзьями не выходит за черту 20-40 обычно. Насколько я знаю, это - невысокий пинг
Сейчас мне приходится начинать учить JASS, ибо тупой GUI не понимает локальных переменных, а создавать кучу глобальных - это ужас.
|
|
|
|
SirNikolas | Дата: Среда, 06 Июня 2012, 15:01:29 | Сообщение # 22 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Quote (Ty3uK) лаги в мультике могут обуславливаться высоким пингом this. Попробуй протестировать на других компьютерах, помощнее.
|
|
|
|
DragoN | Дата: Среда, 06 Июня 2012, 17:40:00 | Сообщение # 23 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (Tsarego) 1.Удаление погибших из игры (в карте войск создается очень много) http://i008.radikal.ru/1206/4d/9c913e6c6a80.jpg в принципе бессмысленно, т.к после разложения юнит удаляется из памяти также добавлю, что вэйты использовать как минимум плохо: может без проблем убить поток и время считается неправильно если хочешь "дать отдохнуть", то лучше разбить действия в несколько функций и вызывать через ExecuteFunc, что вызывает функцию в новом потоке(но через неё нельзя передавать параметры)
Добавлено (06 Июнь 2012, 17:40:00) --------------------------------------------- вместо период. триггеров используйте таймер, если период таймера один и тот же, то лучше использовать 1 таймер
El Psy Congroo
|
|
|
|
kapa6acvlk | Дата: Среда, 06 Июня 2012, 21:13:26 | Сообщение # 24 |
Группа: Проверенные
Сообщений: 612
Награды: 0
Репутация: 361
Блокировки:
| Quote (Tsarego) 4.Создание 2-х колдунов в позиции юнита http://s53.radikal.ru/i140/1206/11/bc252553a2ef.jpg Точка утекает, именно то, о чем я и говорил.
Как говориться, не обязательно есть всю кучу говна, чтобы понять, что она однородна. © Александр Зорич
|
|
|
|
Tsarego | Дата: Четверг, 07 Июня 2012, 07:13:29 | Сообщение # 25 |
1 уровень
Группа: Пользователи
Сообщений: 19
Награды: 0
Репутация: 3
Блокировки:
| Всем спасибо! Проблема решена. Проблема была в счете живых юнитов: при большом кол-ве просчет вызывал тормоза. Решение - замена на PLAYER_SCORE_UNITS_TRAINED. Теперь ничего не глючит, но счет не уменьшается. Впрочем, это неважно.
|
|
|
|
|
|
|
|
|
|
|