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

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

Закрытая тема
 
DotA_DR

offline
Опыт: 103
Активность:
Цитата:
Сообщение от Toadcop
вот ссыль на оригинал и т.д. http://wc3campaigns.net/showthread.php?t=85984
Код:
...

вот посмотрите =) короче будет все ОК ! а потом удалите вот это код после call DestroyTrigger(GetTriggeringTrigger()) //Without this call, the bug won't happen.
до конца функции. и увидите счастье про РБ =) то что локации будут иметь одинаковый хандле индекс но будут полностью рабочии ! вот РБ говно ! точнее Вар а может имено и РБ незнаю =)
еще попробуйте разное количество call TriggerSleepAction(0.00) в перед созданием локацийй и т.д. =)

желаю удачи...

это по ходу отдельный баг связаный с вызовом TriggerSleepAction в тригере который был удалён

DotA_DR добавил:
Ха-Ха

Toadcop всё что ты тут написал неверно (интерес имеет только баг с TriggerSleepAction), в твоей системе были баги, потому что, вопреки всеобщему мнению, вар сам освобождает память умерших юнитов, раз память освободилась значит этот хендл тоже освободиться(если нет ссылок) и может быть занят другим юнитом.

Пример простой (переделать пример Sergey'я):

Код:
function test takes nothing returns nothing
local unit U = CreateUnit( Player(0), 'hfoo',0,0,0)
local item I = CreateItem('texp',0,0)

call DisplayTimedTextToForce( GetPlayersAll(),60, H2S(U))
call DisplayTimedTextToForce( GetPlayersAll(),60, H2S(I))
call SetWidgetLife(I, 0)
set U = null
set I = null
endfunction


если вызвать этот код с периодом например 30 хендл итема будет переиспользован
Старый 30.08.2006, 17:04
DioD

offline
Опыт: 45,134
Активность:
мы это знаем, и давно
адэд
К сожалению это бага, и как бы то её использовать достаточно сложно.
Старый 30.08.2006, 21:14
Toadcop

offline
Опыт: 54,313
Активность:
DotA_DR я в принципе нехрена не понял что ты написал =) ну меньше с тем это не здвинуло мир =)

Цитата:
если вызвать этот код с периодом например 30 хендл итема будет переиспользован
- ты гений я для чего думаешь обнуляют локальные переменные ?
Старый 31.08.2006, 15:14
DotA_DR

offline
Опыт: 103
Активность:
Цитата:
Сообщение от Toadcop
- ты гений я для чего думаешь обнуляют локальные переменные ?

обнуляют что бы сохранить верное кол-во ссылок на объект.
и пример показывает совсем не это, а то что предмет удалился из вара без вызова RemoveItem.
Старый 31.08.2006, 15:36
DioD

offline
Опыт: 45,134
Активность:
Это может и освобождает хэндл, так как шмотка должна была умереть, а вещи удаляются корректно при использовании особенно.
Старый 31.08.2006, 15:48
Toadcop

offline
Опыт: 54,313
Активность:
я об этом тоже думал...
хотя хендл мне кажетьса не освобождаетьса...
Старый 31.08.2006, 15:50
DotA_DR

offline
Опыт: 103
Активность:
Пример можно переделать, что бы умирал юнит.
только в константах надо уменьшить время разложения костей например до 2 сек
тогда хендл который использовался умершим юнитом будет переиспользован
Старый 31.08.2006, 16:17
DioD

offline
Опыт: 45,134
Активность:
юниты не удаляюися автоматом...

DioD добавил:
Если есть вопросы или есть что спросить создавай новую тему, мы будем только рады.
Старый 31.08.2006, 16:22
DotA_DR

offline
Опыт: 103
Активность:
DioD
ты перед тем как утверждать что-то, хотя бы проверил...

DotA_DR добавил:
мне нечего спрашивать, мне была интерестна эта тема, но она себя исчерпала
Старый 31.08.2006, 16:45
Toadcop

offline
Опыт: 54,313
Активность:
DotA_DR
Цитата:
Пример можно переделать, что бы умирал юнит.
- это я недавно делал =) надеясь увидить то что юниты не дают утечку но оказалось наоборот... ну я думаю что ты на 90% прав. и вообщем интересные идеи есть я люблю таких людей =) ты у меня на списке =)


Цитата:
мне нечего спрашивать, мне была интерестна эта тема, но она себя исчерпала
- чого =) нет в принципе я могу дополнить то что если уничтожить масиер поток т.е. напр самый корневой триггер который сработал и в его функции есть слипы то он плужит с стекам свободных хендлов и начинает выдавать одни и тежи хенды (ну это уже понятно...) но это не как думуют буржии связано с вызавом функции уничтожения чего либо... короче надо использовать пре-груженые объекты типо как в Тс ОРС...
Старый 04.09.2006, 15:41
Toadcop

offline
Опыт: 54,313
Активность:
DotA_DR прав...

Буду краток =)
После того как юнит умер (был убит...) то юнит будет сам удалён из игры после того как будут проиграны все нужные анимации
такие как "death" -> "decay flesh" -> "decay / bone" именно в этом порядке после того как эти анимации были проиграны war3
САМ ! удаляет юнитов из игры и если к этому юниту нету ссылок то и освободитьса в стек ! т.е. удаления юнитов НЕ НУЖНО ! но если одна из выше пере
численых анимаций выше отсутствувает то war3 пропрыгивает их до доступной а если ВООБЩЕ нету то юнит будет еще существовать только на "время смерти"
которое настраиваетьса в редакторе объектов/юнитов. и после истечения этого времени вар сам его удалит ! это кстати не всегда хорошо т.к. иногда юнит удаляетьса за быстро и происходят глюки !
особенно модели (именно модели !) в которых нету анимаций разложения они удаляютьса буквально за несколько секунд ! т.е. всё зависит от модели + настроек в игровых константах + настроики "времени смерти" в редакторе объектов/юнитов !
т.е. если у нас есть модель грифона (и остальных летающих юнитов) которые НЕ имеют анимации разложения только анимация смерти то они удалятьса сразу после истечения времмени смерти ! что надо делать елементарно прийдётьса
изменить время смерти в редакторе объектов на секунд 20 (или сколько надо...) и визуального еффекта это не будет имееть (конечно если у юнита нету анимации разложения иначе юнит будет 20 сек. находитьса в анимации смерти т.е. в конечной стадии этой анимации) только
этот юнит будет удалён из игры через 20 секунд. (это иногда ОЧЕНЬ важно !) это же касаетьса предметов просто там нету времени смерти так что всё зависит от модели ! или это время смерти есть но оно констаное. но это не очень важно =) т.к. возраждения предметов нету.
еще про разрушаемые (Destructables) одним словом они НЕ УДАЛЯЮТЬСА ! ну в принципе логично простейший пример это когда дерево срубывают то после него остаётьса пень а пень это конец анимации "death" т.е. вар замараживает на последней метки анимации анимацию =).
после анимаций "decay..." тоже вроде (на 100% не уверен... уверен на 90% =) т.к. тестировал ) разрушаемые не удаляютьса ! т.е. впринципе это логично и не так уж страшно. так что то что создаетьса динамически надо удалять (имееитьса ввиду разрушаемые !). ну вроде бы всё :)

код пример для юнитов :
Код:
function echo takes string s returns nothing
 local integer i=0
 loop
   exitwhen i>11
    if GetLocalPlayer()==Player(i) then
        call DisplayTextToPlayer(GetLocalPlayer(),0,0,s)
    endif
   set i=i+1
 endloop
endfunction

function UnitCheck takes nothing returns nothing
    local unit u=CreateUnit(Player(15),'hgry',0,0,0)  // Create a Gryphon Rider
    call echo(I2S(h2i(u))) // Show it's handle index
    call KillUnit(u) // Kill Gryphon Rider
    set u=null // Remove reference to Gryphon Rider
endfunction

//===========================================================================
function InitTrig_UnitCheck takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterTimerEvent(t,1.68,true) // the Death time of Gryphon Rider is 1.67 + little offset 0.01 !
    call TriggerAddAction(t,function UnitCheck)
endfunction
Старый 08.09.2006, 19:06
Toadcop

offline
Опыт: 54,313
Активность:
ну здесь всё просто =) на факте... хотя и не совсем =/
я даже незнаю как это всё высказать.
"удалять триггер в самом себе апасна или тогда когда он еще не завершилса." это типо почти и есть весь смысл хотя здесь расматривались иные фичи =)
вся бида этой фигня заключаетьса в том что нескока объектов имеют ОДИН И ТОТЖЕ хендл и черз множество объектов ты будеш ссылатьса всегда на одного т.е. своего рода те объекты будут просто ссылками. Триггер евенты "правят" хендлы в таком случие а точней если у объекта нету уникального хендла (как это определяетьса я незнаю...) то ему каждый раз при срабатываение триггера присваиваетьса новый (но неозначает что уникальный) хендл.
а вообщем всё просто. я бы нашол камне где то такой же давности с кампов... но мне лень... =) где я писал что "статик > динамик" а он типо неаа... и т.п. а сейчас сами ихние "тру кодеры" всё больше и больше юзают статичных объектов и конструкций. что я тока могу сказать... Т_Т
Старый 09.09.2008, 22:15
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
После того как юнит умер (был убит...) то юнит будет сам удалён из игры после того как будут проиграны все нужные анимации
такие как "death" -> "decay flesh" -> "decay / bone" именно в этом порядке после того как эти анимации были проиграны war3
САМ ! удаляет юнитов из игры и если к этому юниту нету ссылок то и освободитьса в стек ! т.е. удаления юнитов НЕ НУЖНО !


кста сергей писал пару недель назад что это не так) когда я пытался обьяснить что это как раз так)

про удаление тригера в его же потоке и потом абузе хендлов... ммм, ихмо с этим как то лучше не связываться) из этого фичу ну не сделать...

Цитата:
где я писал что "статик > динамик" а он типо неаа... и т.п. а сейчас сами ихние "тру кодеры" всё больше и больше юзают статичных объектов и конструкций. что я тока могу сказать... Т_Т


то что они ТТ это факт) а вообще я не совсем понял о чем ты)

ща первый пост гляну)

ADOLF добавил:
Цитата:
любой handle type объект который находитьса в не потока или переменной не своего типа (например. РБ + запись в integer variable)
не гарантируют то что текущий адрес (handle) не будет использован (выделен под ново созданый объект handle type'a) еще раз во время того как текущий объект существует !


ну мы щас и игроках и что там еще не говорим) ну да но это тока в случае если ремовить тригер и слипать акшин (насколько я понимаю) или! гхм, я писал об этом) если обьект ремувнуть)

Цитата:
вывод хранения переменых handle типов, в integer переменных являетьса не надёжным !


сцв лажа) ну да щас таук никто и неделает я надеюсь)

Цитата:
лично я кешом не для integer,real,string,boolean данных от ныне пользоватьса НЕ БУДУ !


рофл) хотя вообще на него имхо мона забить в 99% случаев... ну это уже другая история...

Цитата:
мне повезло по Зодиаку я Овен т.е. упёртый =)

мне неповезло=/

Цитата:
создания локального триггера и добавления к нему условия и действия !

дык кондишины хешируюццо, ну понятно ты писал это много лет назад) сам же мне потом обьяснял как оно робить)
[+] замечание от NETRAT: оффтопег

Отредактировано NETRAT, 10.09.2008 в 13:33.
Старый 10.09.2008, 11:14
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
лично я кешом не для integer,real,string,boolean данных от ныне пользоватьса НЕ БУДУ !
надеюсь это писал не я О_о

Цитата:
мне неповезло=/
угу... Т_Т

кстати в этом есть лол... с 2у летний длительностью xD т.е. я 2 года пыталса пофиксить баг с камерой и всё таки нашол способ пофиксить его ! xD

Цитата:
создания локального триггера и добавления к нему условия и действия !
ну раньше так делалось =) я чё говорю что я всё правильно писал/пишу ? xD

в этом кстат ключевой момент почему я нелюблю и нехочю писать статьи они пишутьса на определёном уровне знаний и в определёный "момент" устаривают и стают неактуальными... =) ну впринцыпе от этого некуда не детьса...

Toadcop добавил:
ах блин самое важное... в игровых услових это баг случаетьса КУДА ЧАЩЕ и без триггер слип екшена =) вроде сам факт удаления триггера корёжит там что то (возможно и не тока триггера).

это тоже практически доказано. но симулировать в искуственых условиях удалось тока эту фигню с вейтом.
[+] замечание от NETRAT: оффтопег
Старый 10.09.2008, 13:32
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
здесь баг был вроде в удалении триггера после вэйта
я хз кто не знает про то, что надо кэш очищать и т.д.
Старый 10.09.2008, 14:05
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
ключевой момент почему я нелюблю и нехочю писать статьи они пишутьса на определёном уровне знаний и в определёный "момент" устаривают и стают неактуальными


ну с одной стороны да с другой все рано или поздно устаревает и т.д. ты понял короче

Цитата:
КУДА ЧАЩЕ и без триггер слип екшена


тока при дестройТригере? хм...

Цитата:
я чё говорю что я всё правильно писал/пишу


хз)

Цитата:
что надо кэш очищать и т.д.


в смысле?

Старый 10.09.2008, 16:06
Toadcop

offline
Опыт: 54,313
Активность:
причём кеш ?
я сейчас напишу "ядро идеи" которые же написано и в самом первом топеге =)
грубо говоря есть 2 пути. хотя с своими большими условиями.
  1. МОЖНО организовать код так что каждый созланый объект пройдёт через триггер и будет помещн в локальную переменую и НЕ "обнулён" тем самым хендл (id) этого объекта НЕКОГДА не попадёт в стек свободных хендлов что привёдёт к тому ЧТО БУДЕТ НЕВОЗМОЖНО ВОСПРОИЗВЕСТИ ЭТОТ БАГ =) ибо на объект есть ссылка. НО при этом мы теряем постояно и часто много индексов что есть не всегда хорошо =) особено фаннатов идеи "в карте не должно быть больше 8190 хендлов" ...
  2. при том когда у нас нетту ссылк (локальной или глобальной на объект / ака занесён в переменую) тем самым ЭТОТ объект МОЖЕТ быть помещён в стек свобдных хендлов! это и есть почва для этого бага ) т.е. фичя в том что.
"Вар не коректно проверяет или текущих хендл/индекс был уже помещён в этот стек" тем самым "особым способом" можно его туда поместить. и мы получим баг о котором идёт здесь речь.
всё остальное фигня и личная интерпритация других людей. напр Сергей вообще об фигне начал потом писать которая логически очевидная и вовсем не являетьса проблемой как таковое =)
про сам баг...
он случалса (вплоть до не давно) в Доте и в других картах как напр AotZ (Advent of the Zenith) и многих других.
т.. уберать с объектов ссылки незная точно что ты пишеш и как твои алгоритмы работают могут привести к подобным косякам. но конечно вам может и повезти и подобной проблемы у вас не появитьса. кеш здесь был упомянут лиш из за того что он не даёт ссылки на объект как это делаетьса напр глобальный или локальный массив / переменная.
вот и почти всё =)
"это баг системы выделения хендлов объектам" это очень приметивный баг который ОЧЕНЬ просто правитьса лиш проверкой на существование такого хендла в этом стеке... (что организовываетьса напр пометкой в спец хеш таблице на индекс этого хендла.) ну короче я подобные алгоритмы писал кучю раз и да если сделать не правильный алгоритм "уничтожения хендла" то может быть вот такая вот фигня.
а во кстати вспомнил... я даже придумал логическое объеснение (почти) этому в случие близз.
там действие было таковым...
удалялса объект
уничтожалса тригг
вызывалось Х раз действиет TriggerSleepAction(0)
фичя в том что слип екшен являетьса своего рода концом потока. и вар в конце тикущего выполнимого потока (напр) помещает все освободивщиешся хендлы в стек. (это доказываетьса тем что если уничтожить объект и сразу создать новый то ты получих не хендл уничтоженого а иной а если это же делать но тока в интервале 0.001 сек (непр) то будет всегда одинаковый хендл ну или использовать триггер слип екшен =))
дык вот фичя в том что каждый раз когда ты ставиш слип екшен то этот хендл помещаетьса в стек.
я вполне уверен что есть иные способы достичь этого же не используюя слип екшен.
Старый 11.09.2008, 12:56
adic3x

offline
Опыт: 108,439
Активность:
2, точнее 3) для этого и (ну может это фонарем вышло) короче структы в вЖасс ака паралельные массивы решают это

Цитата:
фичя в том что слип екшен являетьса своего рода концом потока. и вар в конце тикущего выполнимого потока (напр) помещает все освободивщиешся хендлы в стек


кста ти да, надо глянуть как освобождаются хендлы в одном потоке (создать, позрить хендл, удалить, обнулить, и создать в том же потоке) ды ппц, ты об этом же и написал

Цитата:
я вполне уверен что есть иные способы достичь этого же не используюя слип екшен.


ну хз, по идее надо вынудить движок "поместить свобод хендлы в стек"

ADOLF добавил:
я скажу более, если нам надо аттачить что то на хендл обьекта, удаление которого мы не контралируем - к примеру юнита нам достаточно пусть даже через кешь аттачить на него ид структуры, а членом этой структуры сделать самого юнита, это гарантирует то, что хендл не будет удален и потом через юнитТип мы сможем даже найти структуру и ремувнуть ее
Старый 11.09.2008, 13:52
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
при том когда у нас нетту ссылк (локальной или глобальной на объект / ака занесён в переменую) тем самым ЭТОТ объект МОЖЕТ быть помещён в стек свобдных хендлов!

Насколько я смог перевести это на русский, ты имеешь в виду, что хэндл может быть освобождён только при обязательном условии отсутствия на него ссылок.
Думаю, другим обязательным условием освобождения хэндла является удаление объекта (принудительное или движком).
Вы согласны, или считаете, возможен путь освобождения хэндла без удаления объекта?
Старый 11.09.2008, 18:15
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Вы согласны, или считаете, возможен путь освобождения хэндла без удаления объекта?
скорей всего нет... но я не могу гарантировать ибо я вар не писал =)
Старый 11.09.2008, 20:19
Закрытая тема

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

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

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

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



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