|
|
|
|
Поиск утечки в звуках
| |
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 ( ) Ладно, изначальная моя задача, сделать систему выстрелов при клике. И при каждом клике звук выстрела. А если играют несколько игроков? Надеюсь, понятно, что звуки я буду использовать часто? И звуки весьма разношерстные, для каждого оружия свое. Спасибо, будем пробовать.
|
|
|
|
|
|
|
|
|
|
|