Сейчас 13:21:57 Суббота, 20 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Поиск утечки в звуках
Поиск утечки в звуках
sumertДата: Воскресенье, 14 Декабря 2014, 11:51:32 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Данный триггер у меня вызывает утечку. Любопытно почему?

Код

function SoundPlay takes String Str returns nothing
     local sound s=CreateSound(Str, false, false, false, 10, 10, null)
     call StartSound(s)
     call KillSoundWhenDone(s)
     set s=null
endfunction
 

Q1wAseДата: Воскресенье, 14 Декабря 2014, 14:13:03 | Сообщение # 2
Группа: Проверенные
Сообщений: 1235
Награды: 0
Репутация: 286
Блокировки:
Может я мало имею опыта в работе с Jass.
Но просмотрев код не обнаружил ничего утечкного.
А ты уверен, что в этом проблема ?


 

sumertДата: Воскресенье, 14 Декабря 2014, 14:23:00 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Q1wAse, когда эта функция в отключке, все норм. Когда запускаю с периодичностью 0,25 сек, звуки проигрываются, и возникают утечки. Наличие утечек проверяю этим кодом
Код

function HandleCounter_Update takes nothing returns nothing
    local integer i = 0
    local integer id
    local location array P
    local real result=0
    loop
       exitwhen i >= 50
       set i = i + 1
       set P[i] = Location(0,0)
       set id = GetHandleId(P[i])
       set result = result + (id-0x100000)
    endloop
    set result = result/i-i/2
    loop
       call RemoveLocation(P[i])
       set P[i] = null
       exitwhen i <= 1
       set i = i - 1
    endloop
    call LeaderboardSetItemValue(udg_HandleBoard,0,R2I(result))
endfunction

function HandleCounter_Actions takes nothing returns nothing
    set udg_HandleBoard = CreateLeaderboard()
    call LeaderboardSetLabel(udg_HandleBoard, "Handle Counter")
    call PlayerSetLeaderboard(GetLocalPlayer(),udg_HandleBoard)
    call LeaderboardDisplay(udg_HandleBoard,true)
    call LeaderboardAddItem(udg_HandleBoard,"Handles",0,Player(0))
    call LeaderboardSetSizeByItemCount(udg_HandleBoard,1)
    call HandleCounter_Update()
    call TimerStart(GetExpiredTimer(),0.05,true,function HandleCounter_Update)
endfunction

function InitTrig_HandleCounter takes nothing returns nothing
    call TimerStart(CreateTimer(),0,false,function HandleCounter_Actions)
endfunction

Конечно, надо при инициализации карты добавить
Код

call InitTrig_HandleCounter()

и создать одну глобалку типа таблицы рекордов.
 

Q1wAseДата: Воскресенье, 14 Декабря 2014, 20:30:45 | Сообщение # 4
Группа: Проверенные
Сообщений: 1235
Награды: 0
Репутация: 286
Блокировки:
Даже не знаю брат.

 

НаклзДата: Понедельник, 15 Декабря 2014, 16:44:36 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1431
Награды: 0
Репутация: 760
Блокировки:
Ну например попробовать изучить сами функции StartSound(s) и KillSoundWhenDone(s) , возможно близзард допустили утечку в них.
 

FEARKILLERДата: Среда, 17 Декабря 2014, 00:16:09 | Сообщение # 6
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
Цитата Наклз ()
Ну например попробовать изучить сами функции StartSound(s) и KillSoundWhenDone(s) , возможно близзард допустили утечку в них.

А что там изучать то? Это ведь не БЖ функции, а нативки.
StartSound() - воспроизводит звук (если тот уже не воспроизводится в данный момент).
KillSoundWhenDone() - должна удалять звук (после того как тот проиграется полностью), но она это делает криво, возможно из-за этого якобы ожидания.
Поэтому если создаёшь звук, то лучше один раз и на всю игру. Забиваешь его в переменную или хэш-таблицу (на юнита) и юзаешь всю игру, когда потребуется.


Делаю из воды вино, хожу по воде...
 

sumertДата: Среда, 17 Декабря 2014, 04:01:33 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Цитата FEARKILLER ()
оэтому если создаёшь звук, то лучше один раз и на всю игру. Забиваешь его в переменную или хэш-таблицу (на юнита) и юзаешь всю игру, когда потребуется.

Я не просто так создаю локальную переменную для звука. Изначально я хотел, что звук, длинной в 2 сек проигрывался каждую сек. Если использовать глобалку, то звук будет проигрываться только после того, как он же закончился. Потому для того, что мне надо, необходимо две переменных. А если надо,чтобы звук воспроизводился чаще? Вот поэтому лучше создавать локальную переменную звука и уничтожать.
Хм. Будем размышлять, что делать с этим...
 

ExtrematorДата: Среда, 17 Декабря 2014, 07:55:31 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 3199
Награды: 0
Репутация: 1018
Блокировки:
Цитата FEARKILLER ()
KillSoundWhenDone() - должна удалять звук (после того как тот проиграется полностью),
sumert, ну а если бы небыло действия удаления звука по истечению его звучания? как бы ты делал?

Тут можно создать глобальный массив из всех звуков, и времени из звучания
запуская один - считать его время
если запуская звук его время уже считается - начинать от счёт для этого звука заново (и проигрывать звук заново)
 

sumertДата: Среда, 17 Декабря 2014, 11:45:32 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Цитата Extremator ()
Тут можно создать глобальный массив из всех звуков, и времени из звучания
запуская один - считать его время

Ладно, изначальная моя задача, сделать систему выстрелов при клике. И при каждом клике звук выстрела. А если играют несколько игроков?
Я так и делал изначально, но по-моему это тупо и не рационально.
У меня еще была идея, заменить стандартный звук заклинания-пустышки (например, берсерк) и при выстреле создавать дамми-юнит, который его кастует. Это как-то получше глобального массива, хоть кол-во возможных звуков и ограничено.
Потом подумал, что можно же создавать локальную переменную звука, но выявил утечки. И вот думаю над другими вариантами.
Цитата Extremator ()
sumert, ну а если бы небыло действия удаления звука по истечению его звучания? как бы ты делал?

Есть еще DestroySound, но сам Николас рекомендовал в какой-то теме использовать KillSoundWhenDone.
 

FEARKILLERДата: Четверг, 18 Декабря 2014, 03:28:13 | Сообщение # 10
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
Цитата sumert ()
Есть еще DestroySound

Есть только KillSoundWhenDone(), нет никакого дестроя саунда. Там могла быть только какая-нибудь самопальная функция DestroySound.

Как вариант, могу предложить сделать так:
=========================================
Функция регистрации звука на какой-либо объект в игре (в нужном кол-ве):
Код
function NRegSound takes string s,integer h,integer k,integer i returns nothing
     loop
         call SaveSoundHandle(H,h,k+i,CreateSound(s,false,false,false,10,10,"DefaultEAXON"))
         exitwhen i<1
         set i=i-1
     endloop
     set s=null
endfunction

Пример использования:
Код
call NRegSound("Sounds\\Death.mp3",GetHandleId(u),150,8) //путь до звукового файла, хэндл юнита (или другого объекта игры), любой свободный ключ с коротого нужно начать сохрарение, кол-во дубликатов звука (от 0 до 8 = 9 звуков; 150 + 8 = 158 последний ключ)

=========================================
Функция проигрывания зареганых звуков:
Код
function NPlaySound takes integer h,integer k,integer i returns nothing
     local boolean b=false
     local sound s
     set k=k+i
     loop
         set s=LoadSoundHandle(H,h,k-i)
         set b=not GetSoundIsPlaying(s)
         if b and s!=null then
             call SetSoundVolume(s,127)
             call StartSound(s)
         endif
         exitwhen i<1 or b
         set i=i-1
     endloop
     set s=null
endfunction

Пример использования:
Код
call NPlaySound(GetHandleId(u),150,8) //хэндл юнита (или другого объекта игры), любой свободный ключ с коротого нужно начать сохрарение, кол-во дубликатов звука (от 0 до 8 = 9 звуков; 150 + 8 = 158 последний ключ)

=========================================

Кол-во дубликатов звука, зависит от его продолжительности. Чем короче, тем соответственно меньшее кол-во потребуется. Чё ты там вообще паришься поэтому поводу я хрен знает. Во всяком случае, так ты хотя бы заранее можешь расчитать кол-во звуков. Но опять же, смотря как часто ты собираешься использовать свой звук, если за всю игру раз 10-20, то смысла нет вообще заморачиваться с подобным, юзай как ты хотел и забей на утекание. Если часто или очень часто звук будет использоваться, то лучше заранее сделать дубликаты звука и проверять, проигрывается ли звук в данный момент, если да, то запускать следующую его копию (в примере выше показано).

Если тебя не устраивает хэш-таблица, то можешь переписать всё под глобальные массивные переменные.


Делаю из воды вино, хожу по воде...
 

sumertДата: Четверг, 18 Декабря 2014, 04:12:42 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 2330
Награды: 2
Репутация: 1094
Блокировки:
Цитата FEARKILLER ()
Но опять же, смотря как часто ты собираешься использовать свой звук, если за всю игру раз 10-20, то смысла нет вообще заморачиваться с подобным, юзай как ты хотел и забей на утекание. Если часто или очень часто звук будет использоваться, то лучше заранее сделать дубликаты звука и проверять, проигрывается ли звук в данный момент, если да, то запускать следующую его копию (в примере выше показано).

Цитата sumert ()
Ладно, изначальная моя задача, сделать систему выстрелов при клике. И при каждом клике звук выстрела. А если играют несколько игроков?

Надеюсь, понятно, что звуки я буду использовать часто? И звуки весьма разношерстные, для каждого оружия свое.
Спасибо, будем пробовать.
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Поиск утечки в звуках
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz