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

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

Ответ
 
insane88
hail xgm
offline
Опыт: 2,228
Активность:
Утечка при покупке предмета типа "Книга"
Сабж. При покупке предмета типа "Книга" (+n к ловкости, силе, etc) число объектов на карте увеличивается на 1, RemoveItem ( GetSoldItem () ) не помогает. Как это исправляется?
Старый 07.02.2012, 15:10
alpha

offline
Опыт: 7,437
Активность:
Делай через простой предмет(например, когти 'ratc') и создай систему на примере скрещивания предметов, в действия вместо добавления предмета поставь добавление к характеристике.
Старый 07.02.2012, 16:06
alexprey
познающий Unity
offline
Опыт: 66,701
Активность:
insane88, событие использовал предмет. Условие, тип использованного предмета равен усиливающий. Действие, удалить этот использованный предмет. Ну вот как то так
alpha, вообще не то
Старый 07.02.2012, 16:16
alpha

offline
Опыт: 7,437
Активность:
alexprey:
insane88, событие использовал предмет. Условие, тип использованного предмета равен усиливающий. Действие, удалить этот использованный предмет. Ну вот как то так
Не сработает удаление
alpha добавил:
Вот высер-код теста:
» code
library ItemD initializer Init
  define UnitID = 'Hblm'
  define ItemID = 'tint'
  timer Timer = null
  boolean TimerIsPaused = false
  unit Unit = null
  integer Count = 0
  
  private function AddBook takes nothing returns nothing
    UnitAddItem(Unit, CreateItem( ItemID, 0., 0.))
    Count ++
  endfunction
  
  private function Check takes nothing returns nothing
    BJDebugMsg("Count = " + I2S(Count))
    SetHeroInt(Unit, 4, true)
    if (TimerIsPaused) then
      TimerStart(Timer, .02, true, function AddBook)
      BJDebugMsg("Resume")
    else
      PauseTimer(Timer)
      BJDebugMsg("Pause")
    endif
    TimerIsPaused = !TimerIsPaused
  endfunction
  
  private function Init takes nothing returns nothing
    trigger t = CreateTrigger()
    TriggerRegisterPlayerEvent(t, Player(0), EVENT_PLAYER_CHAT)
    TriggerAddAction(t, function Check)
    Unit = CreateUnit(Player(0), UnitID, 0., 0., 0.)
    Timer = CreateTimer()
    TimerStart(Timer, .02, true, function AddBook)
    DoNotSaveReplay()
  endfunction
  
endlibrary

//Trig (convert)
function Trig_sa_Actions takes nothing returns nothing
    call RemoveItem( GetManipulatedItem() )
endfunction

//===========================================================================
function InitTrig_I takes nothing returns nothing
    set gg_trg_I = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_I, EVENT_PLAYER_UNIT_USE_ITEM )
    call TriggerAddAction( gg_trg_I, function Trig_sa_Actions )
endfunction
Специально для тебя писал в идийском стиле vJass + cJass =)
Каждые 2 секунды +400 кб к занимаемой оперативной памяти
Старый 07.02.2012, 16:29
Nordi

offline
Опыт: 893
Активность:
Вот так можно...
Код:
function Trig_book_Conditions takes nothing returns boolean
    if ( not ( GetItemType(GetSoldItem()) == ITEM_TYPE_POWERUP ) ) then
        return false
    endif
    return true
endfunction

function Trig_book_Actions takes nothing returns nothing
local item i = GetSoldItem()
call TriggerSleepAction( 0.1 )
call RemoveItem( i )
set i = null
endfunction
Старый 07.02.2012, 17:08
alpha

offline
Опыт: 7,437
Активность:
Используется сразу, как вы это не понимаете =)
Старый 07.02.2012, 17:15
Nordi

offline
Опыт: 893
Активность:
alpha, и что с того?
Старый 07.02.2012, 17:29
alpha

offline
Опыт: 7,437
Активность:
Nordi:
alpha, и что с того?
alpha:
Не сработает удаление
Несколькими постами ранее
Старый 07.02.2012, 19:17
alexprey
познающий Unity
offline
Опыт: 66,701
Активность:
alpha, точно не помню какое событие должны быть, толи поднял толи, заюзал, но все таки поднял
Старый 07.02.2012, 19:23
Nordi

offline
Опыт: 893
Активность:
alpha, а ты пробовал? Чтобы утверждать что не сработает.
Старый 07.02.2012, 19:28
alpha

offline
Опыт: 7,437
Активность:
всё, в чем я уверен - я проверял или слышал от людей, которым доверяю.
всё, в чем я не уверен - я помечаю соответствующей фразой.
Просто так на энтузиазме я ничего не рекомендую
alpha добавил:
Выше код теста, который я проделал, читай тему
Старый 07.02.2012, 19:43
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Nordi:
а ты пробовал? Чтобы утверждать что не сработает.
А ты пробовал что-бы утверждать что это работает?
Старый 07.02.2012, 19:51
MpW

offline
Опыт: 50,203
Активность:
insane88, ты про руну? она исчезает, но не удаляется, в игре почему то остается, наверное из-за способностей, которые юзаются при подборе. Когда ее получаем надо удалять, такая же фигня наверное с зарядными итемами

Код:
по классу
юнит получает/использует/теряет предмет \\ (с какими событиями работает переменная "манипулирующий предмет", в твоем случае получает/использует)
класс манипулирующего предмета == усиливающий
удалить (манипулирующий предмет)

по типу
юнит получает/использует/теряет предмет
тип манипулирующего предмета ==  **твой тип**
удалить (манипулирующий предмет)


Steal nerves добавил:
я так сделал в своей карте для пустышек, а с длительными способностями надо попробовать
Старый 08.02.2012, 01:04
alpha

offline
Опыт: 7,437
Активность:
Steal_nerves
Утечка все равно происходит.
Я не ловлю логику почему автор создал тему =)
20000 буков дают 30мб к занимаемой оперативной, судя по тестам.
Ну не знаю какая должна быть карта чтобы так все складывалось, что из-за спеллбуков беда
Такие темы "оптимизации" создавать стоит когда нередко возникают критические ситуации из-за памяти.
Выложу тест-карту, качайте кому интересно.
В карте удалены эффекты, только пополнение int
Прикрепленные файлы
Тип файла: w3x booktest.w3x (12.3 Кбайт, 12 просмотров )
Старый 08.02.2012, 01:45
insane88
hail xgm
offline
Опыт: 2,228
Активность:
alpha, спасибо.

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

кстати, RemoveItem стал корректно удалять предмет после изменения условий тригга, но почему-то через раз.
Старый 08.02.2012, 10:49
alpha

offline
Опыт: 7,437
Активность:
insane88:
кстати, RemoveItem стал корректно удалять предмет после изменения условий тригга, но почему-то через раз.
делай как сказано в моем первом посте в этой теме.
Вариант может и не очень перспективный, но самый простой.
Старый 08.02.2012, 11:24
insane88
hail xgm
offline
Опыт: 2,228
Активность:
alpha, я использую такие "книги" для того, чтобы давать квесты. если юнит с полным инвентарем подойдет к вендору, возьмет "когти", то предмет окажется на земле.

я туплю скорее всего, можешь рассказать немного подробней?
Старый 08.02.2012, 11:32
alpha

offline
Опыт: 7,437
Активность:
insane88:
alpha, я использую такие "книги" для того, чтобы давать квесты. если юнит с полным инвентарем подойдет к вендору, возьмет "когти", то предмет окажется на земле.
Окажется на земле, да, но можно выкидывать предмет из последнего слота на момент добавления книги, способ изощренный, правда
я туплю скорее всего, можешь рассказать немного подробней?
Посмотри метод скрещивания предметов в старой доте, хороша для изучения [GUI]
Ее можешь переделать так, как я сказал в моем первом посте этой темы
Прикрепленные файлы
Тип файла: w3x DotA Allstars v5.62b2.w3x (1.67 Мбайт, 15 просмотров )
Старый 08.02.2012, 12:16
insane88
hail xgm
offline
Опыт: 2,228
Активность:
alpha, давно искал _ту_ доту) спасибо)
Старый 08.02.2012, 22:11
Nordi

offline
Опыт: 893
Активность:
чтоб не создавать еще одну тему, напишу ещё раз тут...

call UnitAddItemByIdSwapped( 'I000', gg_unit_hgtw_0042 )

если триггерно дать таким способом, то утечек вроде как нет. циклом давал герою 300к разных книг на статы. лагов не было.
Старый 22.02.2012, 20:43
Ответ

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

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

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

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



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