XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
SRes
1110101000
offline
Опыт: 9,997
Активность:
Если есть утечки в приказах - отправляйте мыло близзам, чтобы пофиксили. Если не можете этого доказать (это доказывал n лет назад ваш "старичок" с форума такой-тосайт.ру) - то не надо всех запугивать, в стиле - как страшно жить.
Да, если я вам не авторитет - почему даже ADOLF считает что утечек нету ? Ведь он на этом форуме поизвестнее..
Приказ каждые 0.001 сек - ГЕНИАЛЬНО ! Это ж надо быть таким... Гхм, ладно. Мало того что это чистой воды креш тест, дык еще и "юнит дергается", ага, ну конечно.
Старый 11.02.2010, 16:54
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Хех, механизм "утечки" можно описать? Каким образом это может утекать?

FellGuard добавил:
Даже если системы "чистенькие", это ещё не значит что там нет неочевидных ошибок.
Старый 11.02.2010, 17:00
adic3x

offline
Опыт: 108,439
Активность:
почему даже ADOLF считает что утечек нету ?
я говорил что я ними невстречался ранее. ну логично что вар не настолько коряв (хотя да, местами коряв) что бы в таком достаточно узком месте (приказы используются повсеместно) были бы серьезные косяки. MF провел тест, и заметил, чт опри многократной отдаче приказов вырасло выделение памяти на процесс, хотя опять же это вовсе не значит утечку, мое первое же предположение - что это используется например для создания репы. да что угодно может быть. с точки зрения программиста - никаких аналогов отдаче приказам нету - значит юзать и не думать о всякой влиянии мочи на солнечные лучи
ADOLF добавил:
+ я никакого материала, доказывающего наличие утечек так и неувидел
Старый 11.02.2010, 23:44
DioD

offline
Опыт: 45,134
Активность:
лаги будут если в событии приказа отдаётся другой приказ, этого делать ни в коем случае нельзя, как бы по хорошему должен быть вертолёт, но вместо этого в память набивается мусор.
Старый 12.02.2010, 00:04
adic3x

offline
Опыт: 108,439
Активность:
в событии приказа отдаётся другой приказ
насколько мне помнится это останавливает ветку, вызывает все условия и события триггеров, зарегестрированных на отдачу приказа, и потом возобновляет основную ветку
это кстате и с нанесением урона помойму так же само
Старый 12.02.2010, 00:20
Doc

offline
Опыт: 63,163
Активность:
Всем, не знаю, вчера запустил свой простенький АИ на 11 игроков, через 10 мин пришел, и пришлость выдергивать компьютер из розетки, так как вар повис в вечном лаге. Выложить код?
Старый 12.02.2010, 09:56
SRes
1110101000
offline
Опыт: 9,997
Активность:
Делал ИИ "для арены" (сложно таковым назвать), бегают (даже к фонтану ! :D)\атакуют\имеют по паре переменных, и ничего, 100 юнитов держало, и 200 держало, хоть и подлагивало, но при удалении юнитов все было ок (подлагивало изза большого колва юнитов на экране или при одновременном приказе многим юнитам).
Так что тут уже твои косяки.
Старый 12.02.2010, 10:55
Doc

offline
Опыт: 63,163
Активность:
library AI initializer ini

private function bd takes nothing returns integer
local integer i = GetRandomInt(1,3)
if i == 1 then
return 'O000'
elseif i == 2 then
return 'Odmg'
elseif i == 3 then
return 'Otnk'
endif
return 0
endfunction

private function a takes nothing returns nothing
local integer i = 0
local region r = CreateRegion()
local region r2 = CreateRegion()
local unit u
local boolean b = false
call RegionAddRect(r, gg_rct_Buyzone)
call RegionAddRect(r2, gg_rct_Main)
loop
exitwhen i > Init_BotC
set u = Init_Orc[GetPlayerId(Init_Bot[i])]
if IsUnitInRegion(r, u) then
    if GetUnitStatePercent(u, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) > 95 and GetUnitCurrentOrder(u) != 851986 then
    call IssuePointOrderById(u, 851986, GetRectCenterX(gg_rct_ToMain),GetRectCenterY(gg_rct_ToMain))
    set b = true
    endif
endif
if IsUnitInRegion(r2, u) and b == false then
    if GetUnitCurrentOrder(u) != 851983 and GetUnitCurrentOrder(u) != 851986 then
    call IssuePointOrderById(u, 851983, GetRectCenterX(gg_rct_Main) + GetRandomReal(-1000, 1000),GetRectCenterY(gg_rct_Main) + GetRandomReal(-1000, 1000))
    endif
    if GetUnitStatePercent(u, UNIT_STATE_LIFE, UNIT_STATE_MAX_LIFE) < 20 and GetUnitCurrentOrder(u) != 851986 then
    call IssuePointOrderById(u, 851986, GetRectCenterX(gg_rct_ToSafe),GetRectCenterY(gg_rct_ToSafe))
    endif
endif
set b = false
set i = i + 1
endloop
call RemoveRegion(r)
call RemoveRegion(r2)
set r = null
set r2 = null
set u = null
endfunction

private function ini takes nothing returns nothing
local timer tm = CreateTimer()
local integer i = 0
call TriggerSleepAction(1)
loop
exitwhen i > Init_BotC
call DialogDisplay(Init_Bot[i], Init_D, false)
set Init_Orc[GetPlayerId(Init_Bot[i])] = CreateUnit(Init_Bot[i], bd(), GetRectCenterX(gg_rct_Buyzone), GetRectCenterY(gg_rct_Buyzone), 0)
set i = i + 1
endloop
if Init_BotC > -1 then
call TimerStart(tm, 3, true, function a)
endif
endfunction

endlibrary
Старый 12.02.2010, 11:08
DioD

offline
Опыт: 45,134
Активность:
еретический код, зачем каждую итерацию пересоздавать объекты?
Старый 12.02.2010, 11:57
Doc

offline
Опыт: 63,163
Активность:
DioD, да знаю, что уг, но не в том суть, даже если я создам глобальные регионы, что изменится?
Старый 12.02.2010, 12:02
XOR

offline
Опыт: 38,159
Активность:
Используй всегда одну глобалку, это как с GetTerrainZ.
Старый 12.02.2010, 12:07
Doc

offline
Опыт: 63,163
Активность:
XiMiKs, . . . тема совершенно не об этом, регионы ведь удаляются так? Обнуляются, так? Где утечка?
Старый 12.02.2010, 12:09
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
"Утечка" в нерациональном использовании ресурсов. Если я буду постоянно создавать кучу юнитов в разных областях карты без надобности, к примеру, с большой частотой, игра у меня тоже будет тормозить.
Старый 12.02.2010, 12:20
DioD

offline
Опыт: 45,134
Активность:
смысл каждую итерацию пересоздавать регионы с точно такими же параметрами для того чтобы использовать нативку на регион когда есть такая же нативка на rect ??????????????????
с таким гнилым и убогим подходом к решению задачи лаги это не баг а фича.
Старый 12.02.2010, 12:21
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Кстати, если мне не изменяет память, есть ещё такая функция RegionClearRect(). Сам не проверял, так что не знаю, но вероятно, прежде чем удалять регион, неплохо бы почистить оттуда все cell-ы и ректы. Это если говорить об утечках. Вообще подход страшенный, да, тут можно в принципе без всяких регионов обойтись, одной математикой.
Старый 12.02.2010, 12:26
Doc

offline
Опыт: 63,163
Активность:
DioD, не нашел я такой нативки на рект, ладно забейте, сейчас перепишу код.
FellGuard, но я ж не просто создаю, удаление то есть. А лаги все время усиливаются.
DoctorGester добавил:
FellGuard, ок сейчас попробую еще и чистить ректы, мне лень обходиться одной математикой.
Старый 12.02.2010, 12:30
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Не надо оставлять этот кошмар, регион вообще юзать только в крайних случаях! В примитивных проверках надо обходиться примитивными действиями, что мешает просто сделать if и вынести в свою функцию?

Нативки нету, есть BJ
Код:
function RectContainsCoords takes rect r, real x, real y returns boolean
    return (GetRectMinX(r) <= x) and (x <= GetRectMaxX(r)) and (GetRectMinY(r) <= y) and (y <= GetRectMaxY(r))
endfunction

//И ещё вот это. 
function RectContainsUnit takes rect r, unit whichUnit returns boolean
    return RectContainsCoords(r, GetUnitX(whichUnit), GetUnitY(whichUnit))
endfunction

//Всё легко выносится в виде
local rect r = рект
local real x = GetUnitX(unit)
local real y = GetUnitY(unit)
...
if ( (GetRectMinX(r) <= x) and (x <= GetRectMaxX(r)) and (GetRectMinY(r) <= y) and (y <= GetRectMaxY(r)) ) then
   действия
endif
FellGuard добавил:
за 3 минуты написал то что тебе было лень делать. В результате сэкономил... не знаю, это надо представлять что творится в ОЗУ, когда начинаются манипуляции с регионами, с их созданием и удалением.

Отредактировано FellGuard, 12.02.2010 в 12:38.
Старый 12.02.2010, 12:40
DioD

offline
Опыт: 45,134
Активность:
не нужны эти функции и вообще не нужны ни точки (кроме получения высоты) ни ректы (кроме события появления юнитов на карте) (ну и может быть энумерации дудадов вещей и ряда других прикладных задач) всё решается чистой математикой которую можно загнать под функцию при соблюдении ряда условий.
Старый 12.02.2010, 12:44
Doc

offline
Опыт: 63,163
Активность:
Всем спасибо, все свободны, RegionClearRect() помогло абсолютно, нужно записать в какой нибудь FAQ.
FellGuard, спасибо
Старый 12.02.2010, 12:45
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 07:41.