Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
Очень странная ошибка, которую не могу выявить
В общем есть такой триггер (код всего триггера ниже). Назначение триггера: Создает нового крипа спустя некоторое время после его смерти, к каждому юниту всегда привязана одна и та же позиция по хештаблице, с этим проблем нет, не в этом суть. Чтобы реснуть юнита мне нужно записать его в хештаблицу, ассоциировав с таймером, чтобы по его истечению реснуть юнита. Но такой ошибки я еще никогда не видел, может даже вас это удивит. Внизу под таймером есть цикл, который дебажит этот процесс. Ошибка: При загрузке юнита из хештаблице в таймере выдает нулл! Если время где-то до 5 секунд, то выдает того самого юнита. Я сначала думал, что юнита что-то удаляет, я проверял в цикле, но нет. Сам юнит продолжает существовать, к нему можно обращаться, получать его тип, игрока, хендл-айди и тд. С этим 100% проблем нет, юнит - существует. Но если в цикле каждый тик снова считывать юнита с хештаблицы где-то через 5 секунд он будет считывать нулл О_о. Я решил записывать юнита в отдельную хештаблицу, с вообще левыми асоциациями. Всё равно выдает нулл. Тогда я делаю так: Записываю юнита после этих 4х секунд еще раз каждый шаг цикла в хештаблицу и следующим действием сразу его считываю, ведь всё ок. Существует юнит? Существует, 100%. Значит его можно записать в таблицу? Можно. Считается ли он оттуда если его считать мгновенно после записи? Да, обязан. Но он опять после считывания выдает нулл. Я отрубал уже все триггеры, кроме этого в карте, всё равно выдает гребаный нулл! Но хештаблица со всеми остальными случаями в игре работает нормально, только тут появляется эта странная ошибка. Почему именно через 4-5 сек наступает мертвое время для этого юнита, когда он существует, но его невозможно считать ни из одной хеш-таблицы?!
Код:
|
30.04.2014, 19:09 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Msey
????
offline
Опыт:
67,346Активность: |
Время разложения юнита в константах указано какое? |
30.04.2014, 20:51 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZLOY5
offline
Опыт:
912Активность: |
после разложения юниты удаляются из игры |
30.04.2014, 20:53 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
Я понимаю, что разложение, но я кажется писал, что если обращаться к юниту напрямую, без хештаблиц он спокойно себе существует, к тому же там стоит в настройках "Не разлагается".
|
30.04.2014, 21:10 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
online
Опыт: отключен
|
потому что таблица хендлов не следит за жизнью юнитов, т.е. она какбы более низкоуровневая, а в юзерской хештаблице есть сборщик мусора, просто он так криво работает, "предостерегает" от утечек. это просто бага такая =) не ресай юнита, пересоздавай его, либо сделай героем |
30.04.2014, 21:20 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
ScorpioT1000, а, то есть моя проблема это не мой косяк, а косяк самой скриптовой системы?)
|
30.04.2014, 21:23 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
107,539Активность: |
Пару заметок:
IsUnitDummy(u) == false -> ! IsUnitDummy(u)
LoadOver == true -> LoadOver Если cJass - тол локалс не нужен:
local timer t = CreateTimer(); -> timer t = CreateTimer (); Можно также использовать callback:
|
30.04.2014, 23:06 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
Всем спасибо, пришлось изобретать велосипед. Вместо самого юнита, я сохраняю его хендл-айди и сохраняю юнита и все необходимые для него данные в специальный стек структур, в таймере получаю по загруженному айди я нахожу нужную мне структуру и извлекаю из неё все нужные мне данные. Забавно, юнит существует и выдает хендл айди, но возвращает нулл если спросить его type-id и или игрока-владельца. Проблема решена, дело было в забагованном варкрафте.
|
01.05.2014, 00:35 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
RemoveUnit(u);
днище... |
01.05.2014, 08:51 | #9
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,124Активность: |
о\ |
01.05.2014, 11:21 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
DioD, кто еще тут днище, ты чем код читал? Юнит удаляется только после всех манипуляуций считывания, по твоему если сначала считать, потом удалить он не считается? Не позорься и читай код внимательно, если беглым взгядом увидел RemoveUnit это еще не значит, что ты самый умный. Ты даже мою тему не читал, просто беглым взглядом посмотрел на проблему, увидел ремув юнит и о, всё, я нашел проблему! Какой же автор глупый, сейчас я-то раскрою этому днищу глаза, вот же он, ремув юнит!!! Как же бесит такой подход к делу, когда стараешься и расписываешь проблему, чтоб не докопались по мелочам, но найдется такой умник который обязательно посчитает себя умнее других, ничего не читая и решит всю проблему 1 постом!
Hate, разве нужно делать оптимизированным и продуманным дебаг код который я запускаю 1 раз для проверки и удаляю? Не понимаю придирок к таким вещам, этот вариант удобнее любого существующего, пускай не оптимизированный, но кому это надо если этот код я уберу когда проблема решится? |
01.05.2014, 12:20 | #11
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hate
конь вакуумный
offline
Опыт:
43,124Активность: |
вы знаете что существует лимит операций? это во первых, и во вторых как вейт работает |
01.05.2014, 12:27 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
Hate, несомненно знаю. И вейт работает с низкой точностью, я им пользуюсь только в таких случаях, я его поставил чтобы просто замедлить цикл. Еще раз напоминаю, что этот код мне нужен на пару секунд, я посмотрю что он выводит, разбираюсь что к чему и удаляю его.
|
01.05.2014, 12:29 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
так как видимо это слишком тяжело для неокрепшего детского ума проверить\догадатся что пишут, посоветую посмотреть компилированный результат когда и сделать еще раз выводы.
многопоточность, пусть даже мнимая, это достаточно сложное для понимания явление, так как человеческий мозг работает в один поток, лично я увидел 3 возможных источника проблем просто взглянув на код ничего не выполняя и не отлаживая, очень жаль что вы так не можете и вообще отладка не для вас. |
01.05.2014, 12:51 | #14
+0/−2
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Drulia_san
Великий Дрюля жив.
offline
Опыт:
8,529Активность: |
DioD,
Спасибо. Это, безусловно, очень интересно!
» Спойлер
Пора бы темку закрыть. Отредактировано Drulia_san, 01.05.2014 в 13:09. |
01.05.2014, 13:03 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nvc123
new status
offline
Опыт:
59,284Активность: |
DioD, скорость распространения импульса в мозге 3 метра в секунду
если бы мозг работал в 1 поток то ты бы был растением количество потоков в мозге = количеству нейронов во входном слое(в начале обработки) поэтому последовательные действия(например перемножить 6-значные числа)мы выполняем долго, а параллельные(распознание образов методом обработки каждого нейрона памяти) довольно быстро а вот сознание да
работает в 1 поток nvc123 добавил:
на счёт кода юзай стек структур с периодическим таймером и будет тебе счастье(в структуре храни равкод юнита и координаты) |
02.05.2014, 22:24 | #16
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|