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

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

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

offline
Опыт: 54,313
Активность:
[INFO] Закон Пустоты
Закон "Пустоты"
любой handle type объект который находитьса в не потока или переменной не своего типа (например. РБ + запись в integer variable)
не гарантируют то что текущий адрес (handle) не будет использован (выделен под ново созданый объект handle type'a) еще раз во время того как текущий объект существует !
вывод хранения переменых handle типов, в integer переменных являетьса не надёжным !
т.е. что это означает ? то что если записать в кеш юнита с помощю РБ преврать его в интегер (получить его handle) то через некоторое время при повторной "рутиной" записи он может
перезаписатса и в конечном случаи потерятьса ! что может превратить всё в один неостановный ХАОС ! есть конечно одно условие ! это всё актуально на идеально чисто написаных алгоритмов
с правильным и полным обнулением локальных (глобальных) пременных ! т.е. для 98% всех скриптов это всё не актуально ! из за чего объяснять не буду ! вот почему это было не заметно !
и я Toadcop впервые (как мне известно хотя и были... но не известно к какому выводу они пришли...) заметил это в моей Системе Toadcop's Projectile Creator при удалении юнитов через таймер + кеш !
там результаты были просто шокирующие ! через несколько десятков запущеных снарядов начиналась нестабильность в работе и чем дальше тем всё хуже ! т.е. ситуация не контролируемая. после того когда я
убрал триггер с таймером и кешом и заменил его на очень старый способ т.е. триггер который срабатывает при смерти юнита потом происходит Wait (TriggerSleepAction()) там где то 10-30 сек. (по усмотрению...)
этот юнит удалялса. ну вот после заменый TPC работал в 99.99% случаи БЕЗОТКАЗНО ! т.е. что подперает мою теорию (закон) !
впринципе писать можно еще много разных примеров и т.д. но я не стану ! и пусть каждый сделает свой вывод ! лично я кешом не для integer,real,string,boolean данных от ныне пользоватьса НЕ БУДУ ! и любыми
не нужными РБ преобразованиями что кстати даёт еще + производительности ;) и еще как уже писал многим об этом беспокоитьса не надо ! т.к. срипты не на таком уровне... многие сейчас могу обилитьса и сказать
что я ламер и т.п. и т.д. но это в принципе факты =) ! ну короче меньше с тем это просто моя подсказка вам мапперы... да и еще чуть не забыл что бы не создавать лишней темы strins (строки) при сохранени и загрузки карты
имеют всегда разные адреса ! НО если преобразовать бывший адрес строки то он вернёт нужную строку т.е. после загрузки карты иммеетьса несколько копий одной и тойже строки ! и это каждый раз после сохранения и загрузки !
т.е. если у вас есть какие либо обращения типа получения адреса строки и потом от туда читать данные то не получитьса а в худшем случаии будет вылет при загрузке карты ! вот почему знаминитая MyDota вылетает при загрузке !
великий Cacodemon допустил такую ошибку ! хотя и я до недавного срока это делал но как говоритца из ошибок учатьса ! и чем больше у тебя их тем больше ты научишься ! конечно если будеш упорно пытатьса их исправить ;)
мне повезло по Зодиаку я Овен т.е. упёртый =) не люблю быстро здаватьса (конечно в вещях которые мне интересны =) ). т.е. вот впринципе я даволен может кто то подчерпнёт из этого "расказа" для себя важную информацию !
кстати сейчас сразу скажу в MyDota есть тоже "утечки" напр. создания локального триггера и добавления к нему условия и действия ! если условие и действие не "фиксировать" в переменной (или чё нибудь еще) то в принципе уже
происходит утечка 2-ух хандлов (адресов) вот почему люди не сталкиваютьса с такой проблемой которую я описал !
ЗЫ слушай больше Rammstein, Tiesto, Tomcraft и ты тоже всё поймешь ;) ! если нет то плохо слушаешь ;) !

AUS !
Старый 25.07.2006, 13:53
DioD

offline
Опыт: 45,134
Активность:
То что ты тут описал ищет вексориан...
http://www.wc3campaigns.net/showthread.php?t=85640
Вот эта тема, рекомендую отписаться...

Еще можно добавить то что разные объекты в один и то-же момент могут иметь одинаковый хэндл, что будет не очень хорошо работать внутри тригеров.
Старый 25.07.2006, 14:03
felix_ff

offline
Опыт: 757
Активность:
очень сумбурно.. но вообщем мысль я уловил. :)
тоже сталкивался с такой проблеммой. у мну засторенный в интеджер юнит терялся чем самым приводил к багам.

исправить такое я пыталсо долго но вроде возникает это не всегда... что очень странно. видимо всетаки какие то факторы влияли

Toadcop ты здесь упомянул какой то давний способ который позволял избежать данной утечки. прошу встудию кодик буду премного благодарен . потому как сталкивался с такой проблеммой и в своей карте :?
Старый 25.07.2006, 14:12
Toadcop

offline
Опыт: 54,313
Активность:
felix_ff я же написал юзать ИМЕННО тип перемменой который нужен а не кодировать и потом в инт помещать ;) ! в принципе кеш для долгих динамичных вещей не годитьса ! только для мгновенных передачь или константных данных которые не зависят от хендла он рулит !

Вексу может потом напишу или на англ. это переведу или пусть лутче они Русский учат =) а то распустились я ж с Танкограда... !

Toadcop добавил:
Цитата:
Еще можно добавить то что разные объекты в один и то-же момент могут иметь одинаковый хэндл, что будет не очень хорошо работать внутри тригеров.
я это впринципе написал но чуть по иному ищи =)
Старый 25.07.2006, 14:21
DioD

offline
Опыт: 45,134
Активность:
Можно хорошо оформить(выделить болтом главное) и будет просто отлично, только примера не хватает, действительно самый элементарный пример дополнит статью очень и очень неплохо...
Старый 25.07.2006, 14:40
felix_ff

offline
Опыт: 757
Активность:
я ж говорю сумбурно.. я очень напряжно читал но вроде вчиталсо... блин у мну половина моей карты щяс на кеше. и иногда такие ошибки возникают. хотя даже код оптимален....

кстати Toadcop насколько я знаю у тебя же TRC написанна тоже в основном на кеше ты ее будешь переписывать на массивы или что? :trud:
Старый 25.07.2006, 15:27
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Toadcop, буду благодарен, если предоставишь мини-сценарий, в котором сработает описанная тобою ошибка.
Старый 25.07.2006, 15:56
Toadcop

offline
Опыт: 54,313
Активность:
Sergey но проблем ;) ! закачай мой ТРС с ХГМэа т.е. здесь и там есть триггер выключеный ! называетьса Cleaner GOVNO =) вот его включи а простой слеанер выключи и будет тебе счастье =)
по ходу теста ТРС увидишь в чём дело потом посмотри сново эту тему и триггер просто cleaner и ты всё поймешь ;) !
DioD felix_ff да можно офформить но вот я в тегах вообще не разбераюсь ! а вот пример может можно хотя как я уже говорил это не 100% глюк т.е. как Вар сплужит ! и выделит на его нандле еще один объект ! короче это такая маленькая западло которое по портезански действует ;)

Toadcop добавил:
Цитата:
у тебя же TRC написанна тоже в основном на кеше
-так момент ТРС или TRS =) это две разные вещи но мои =) какая имеено ? TRS пока многим не известна =) вроде Сергей может помнит =)
Старый 25.07.2006, 16:24
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Цитата:
но проблем ! закачай мой ТРС с ХГМэа т.е. здесь и там есть триггер выключеный ! называетьса Cleaner GOVNO =) вот его включи а простой слеанер выключи и будет тебе счастье =)
по ходу теста ТРС увидишь в чём дело потом посмотри сново эту тему и триггер просто cleaner и ты всё поймешь !

Слишком сложно. :) Нет, я не против, но все же прошу тебя проделать все это. Причем желательно отсеч все триггеры, которые не имеют отношения к данному глюку. Еще лучше воспроизвести этот эффект без ТРС.

Мне нужно понять суть. Когда возникает глюк? Когда мы создаем и удаляем много новых объектов? Большая часть АОСов использует РС+кеш - почему там не наблюдаюстя ошибки?
Старый 25.07.2006, 16:26
Toadcop

offline
Опыт: 54,313
Активность:
Sergeyи еще почему ты думаешь в ТЕХ АОНЕ не всегда коректно срабатывает Ядерная Бомба ? вот из за этого ! ну и еще ты сам мне писал что есть глюки но не понятно от куда ! вот от сюда =)

Toadcop добавил:
Sergey
Цитата:
Большая часть АОСов использует РС+кеш
- они отстойно написаны =)
2) Читай
Цитата:
и пусть каждый сделает свой вывод
- т.е. как хочешь я тебе моё мнение не НАВЯЛИВАЮ так как и остальным !

Toadcop добавил:
Sergey читай тему Векса у него нету моего ТРС !!! и кстати он вообще думает что это кеш глюконутый =)
Старый 25.07.2006, 16:34
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Ок. Но все такихорошо бы, чтобы глюк был воспроизводим в "лаюораторных" условиях. Кто знает, может быть ему удастся найти противодействие? К тому же надо исследовать условия, когда глюк возникает. Может быть они достаточно редки. Или требуют, к примеру, чтобы память была сильно загрязнена утечками?
И, наконец, надо думать над аналогами системы Rs+кеш. Похоже, остались только геморрные массивы.
Старый 25.07.2006, 16:40
Toadcop

offline
Опыт: 54,313
Активность:
Sergey
1) Они не гемморные !
2) Я уже сделал =)
3) РС+Кеш для ДИНАМИЧЕСКОЙ ЛЖИ НЕ КАТИТ ! т.е. хранения сравнительно статической информации происходит практически безпроблем только со строками иногда после сохранения и загрузки есть глюки... но это уже другая история =) в лаборантных может и не выйдет как я понял и заметил это очень сильно проявляетьса после преобразования мёртвого юнита в юнита из хендла ! т.е. удаления не нужных трупов как у вас ! это ГЛЮЧИТ ! и еще у и еффекты глючили не удалялись ! т.е. всё прикреплены и через ВРЕМЯ удалялись в этом промежутки могли создаватьса другие объекты !

если чесно мне кажетьса что главная лажа это юниты... кстати если хоть один триггер польностью не обнуляет переменную юнита то он в безопастности =)
Старый 25.07.2006, 16:51
remal
нечто
offline
Опыт: 2,087
Активность:
0)перед восклицательным знаком не ставится пробел:)
1)оформи нормально и прогони через ворд. читать невозможно.
оффтоп: каким бы ты не был гениальным проггером, любая компания потребует нормального оформления кода.
2)есть мысль, что этот глюк появляется только при больших загрузках.
Старый 26.07.2006, 00:31
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Собственно говоря, глюк не в кеше, а в самом RB. Стало быть зря я загнул про кеш - полезная веь все таки.
Если глюк происходит главным образом с юнитами и для его исправления необходимо, чтобы на юнит была ссылка - что ж, не так уж сложно дописать небольшое дополнение в SCV, чтобы с юнитами работа происходила через массивы (скажем, в кеш сохраняем индекс массива, куда записан юнит). И все.
Старый 26.07.2006, 09:10
DioD

offline
Опыт: 45,134
Активность:
Я протестировал вёсь СКВ, на данный момент могу предоставить доказательство того, что юниты и вещи очень криво работают при полном обнулении переменных...
Код:
function Trig_Untitled_Trigger_014_Actions takes nothing returns nothing
    local unit U = CreateUnit( Player(0), 'hfoo',0,0,0)
    local item I = CreateItem( 'texp',0,0)
    
    call DisplayTextToForce( GetPlayersAll(), H2S(U)+" Unit" )
    call DisplayTextToForce( GetPlayersAll(), H2S(I)+" Item" )
set U = null
call DisplayTextToForce( GetPlayersAll(), GetUnitName(H2U(GetHandle(Player(0),"Item")))+ " unit name of stored item" )
call SetItem(Player(0),"Item",I)
call RemoveItem(I)
set I = null
endfunction

Отредактировано DioD, 01.08.2006 в 21:11.
Старый 26.07.2006, 09:15
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Гм. Может это и SCV, но модификация мне незнакома...
H2S(U)
handle- > string ?
GetHandle(Player(0),"Item")
  • что за функция? При чем здесь Player(0)?
Что должно было произойти и что получилось в итоге?
Старый 26.07.2006, 11:57
DioD

offline
Опыт: 45,134
Активность:
Код:
//
function GameCache takes nothing returns gamecache                                               //
    if udg_GameCache[0] == null then                                                             //
        call FlushGameCache(InitGameCache("LastHope.Engine"))                                    //
        set udg_GameCache[0] = InitGameCache("LastHope.Engine")                                  /
    endif                                                                                        //
    return udg_GameCache[0]                                                                      //
endfunction                                                                                          
function S2Ix takes string String returns integer
    return String
    return 0
endfunction
function H2I takes handle Handle returns integer                                                 //
    return Handle                                                                                //
    return 0                                                                                     //
endfunction                                                                                      //
function H2S takes handle Handle returns string                                                  //
     return I2S(H2I(Handle))                                                                     //
endfunction                                                                                      //
function H2U takes handle Handle returns unit                                                    //
    return Handle                                                                                //
endfunction                                                                                      //
function H2G takes handle Handle returns group                                                   //
    return Handle                                                                                //
endfunction                                                                                      //
function SetHandle  takes handle Target, string ID, handle Value returns nothing                 
    if Value == null then                                                                        //
        call FlushStoredInteger(GameCache(), H2S(Target), ID)                                    //
    else                                                                                         //
        call StoreInteger(GameCache(), H2S(Target), ID, H2I(Value))                              //
    endif                                                                                        //
endfunction                                                                                      /
function SetInteger takes handle Target, string ID, integer Value returns nothing                /
    if Value == 0 then                                                                           //
        call FlushStoredInteger(GameCache(),H2S(Target),ID)                                      //
    else                                                                                         //
        call StoreInteger(GameCache(),H2S(Target),ID,Value)                                      //
    endif                                                                                        //
endfunction
function SetReal    takes handle Target, string ID, real Value returns nothing
    if Value == 0 then
        call FlushStoredReal(GameCache(), H2S(Target), ID)
    else
        call StoreReal(GameCache(), H2S(Target), ID, Value)
    endif
endfunction
function FlushData takes handle Target returns nothing                                           //
    call FlushStoredMission(GameCache(), H2S(Target))                                            //
endfunction                                                                                      //
function GetHandle  takes handle Target, string ID returns handle                                //
    return GetStoredInteger (GameCache(), H2S(Target), ID)                                       //
    return null                                                                                  //
endfunction                                                                                      //
function GetReal    takes handle Target, string ID returns real                                  //
    return GetStoredReal    (GameCache(), H2S(Target), ID)                                       //
endfunction                                                                                      //
function GetInteger takes handle Target, string ID returns integer                               //
    return GetStoredInteger (GameCache(), H2S(Target), ID)                                       //
endfunction                                                                                      //

Всь апи что-бы было

Отредактировано DioD, 11.08.2006 в 01:37.
Старый 26.07.2006, 14:04
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Спасибо. Итак, я создал сценарий, в котором воспроизвел описанный баг.
Сценарий прилагаю, описание - см в триггерах.
В то же время, я не очень понимаю, чем этот баг вреден? Ведь согласно правилам, в SCV после удаления из игры старого объекта, необходимо сразу же удалить и запись из кеша. Т.е. даже если новй юнит запишется по адресу удаленного предмета, системе в целом это ничем не грозит, т.к. записи в кеше, укзывающей на этот адрес, уже нет.
Обращение к данным по удаленному объекту - это баг программного кода, а не игры.
Вам не кажется, что вы сами себе выдумываете проблемы?
Прикрепленные файлы
Тип файла: w3x 1.w3x (17.5 Кбайт, 32 просмотров )
Старый 26.07.2006, 14:44
DioD

offline
Опыт: 45,134
Активность:
Я занялся этим так как Вексориан ищет этот баг...
Старый 26.07.2006, 15:00
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Вообщем, я так понял, баг свелся к тому, что в SCV нельзя хранить пустоту, оставшуюся после удаления объекта (а оно вам надо?). Т.к. игра норовит в эту пустоту записать что-нибудь свое. В частности, это актуально, если обнулять ссылки на объекты (а если не обнулять - получаем утечки).

Я не совсем уверен, что это именно тот баг, про который написал Toadcap. Возможно у него какой-то другой баг. Я бы посоветовал ему создать минисценарий вроде того, который я выслал.

Кстати, я и сам знаю про один серьезный баг, который иногда происходит при использовании кеша. Игра не всегда очищает область памяти, где был кеш, использованный во время игры. В этом случае в кеше вдруг возникают записи, которых в нем быть не должно. Начинается хаос. Решается проблема достаточно просто. Сразу после создания, я обнуляю игровой кешь. Затем создаю снова.
Старый 26.07.2006, 15:15
Закрытая тема

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

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

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

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



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