В прошлом вопросе внезапно выяснилось, что function PlaySound takes string soundName returns nothing утечна
Мне не сложно создать локалку и обнулять только записанный в нее звук. но меня смутило вот что :
Ведь звук проигрывается в карте из заранее созданных звуковых переменных,которые только в карте? Так работают все звуки. Ну это сделано как я понял для того, чтобы не приходилось перебирать все звуки варика.
Только зачем тогда создание отдельно локалки или глобалки звука если мы их берем из звуковой переменной? Или виноват хэндл у бж звука?
Короче делаю :
function Trig_____________________________________001_Actions takes nothing returns nothing
local sound u
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
set u = bj_lastPlayedSound
call : destroy u
set u = null
endfunction
===========================================================================
function InitTrig_____________________________________001 takes nothing returns nothing
set gg_trg_____________________________________001 = CreateTrigger( )
call TriggerAddAction( gg_trg_____________________________________001, function Trig_____________________________________001_Actions )
endfunction
Так что ли?😕

Принятый ответ

Создание звука на ходу утечно и с этим ничего не сделать. Избежать утечки можно только если создать один звук, через редактор звука или в коде, и использовать всегда его.
Разумеется есть минус, в один момент времени звук можно играть только один раз. Если необходимо проигрывать один и тот же звук несколько раз одновременно, то придется костылить, например создавать 3-4 экземпляра одного звука и играть поочередно.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
3 года назад
0
Кстати выдает ошибку почему то....
2
21
3 года назад
Отредактирован biridius
2
Кстати выдает ошибку почему то....
call : destroy u
функция убийства звука вроде KillSoundWhenDone
0
27
3 года назад
Отредактирован rsfghd
0
SсRealm, смешно наверное самому придумывать названия нативных функций?)
Посмотри Function List используя ключевые слова, например Sound

К тому же
local sound u
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
set u = bj_lastPlayedSound
call : destroy u
Зачем создавать локалку, если можно сразу уничтожать bj_lastPlayedSound. В таких действиях нет смысла

А, и в ошибке вроде указывается проблема, там минимальные знания английского, например, что такой функции не существует
0
19
3 года назад
0
В чем был вопрос то? А нафига делать переменную звукам, если все переменные проигрываются из внутренней переменных звуков?!

rsfghd:
SсRealm, смешно наверное самому придумывать названия нативных функций?)
Посмотри Function List используя ключевые слова, например Sound

К тому же
local sound u
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
set u = bj_lastPlayedSound
call : destroy u
Зачем создавать локалку, если можно сразу уничтожать bj_lastPlayedSound. В таких действиях нет смысла

А, и в ошибке вроде указывается проблема, там минимальные знания английского, например, что такой функции не существует
Потому что я не доверяю понятиям варика, когда что то там проигралось. Проиграться может все что угодно. Мне нужна конкретная локалка, чтобы точно знать что удалиться в данный момент!
Загруженные файлы
2
28
3 года назад
2
Вы что тут несёте...
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
Это неверный код.
SсRealm, нафиг тебе вообще PlaySoundBJ?
0
27
3 года назад
0
Проиграться может все что угодно.
Проиграется только то, что ты и указал, это раз, во вторых, локалка бы тебе ничем не помогла проиграть звук, потому что всё что ты делаешь с ней, это пытаешься уничтожить
0
19
3 года назад
0
PT153:
Вы что тут несёте...
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
Это неверный код.
SсRealm, нафиг тебе вообще PlaySoundBJ?
Я тут пытаюсь утечку звука обнулить. Пока не особенно понятно

rsfghd:
Проиграться может все что угодно.
Проиграется только то, что ты и указал, это раз, во вторых, локалка бы тебе ничем не помогла проиграть звук, потому что всё что ты делаешь с ней, это пытаешься уничтожить
Поставлю вейт и через пару сек удалю. Там все равно проигрываются разные звуки выстрела
0
28
3 года назад
0
Я тут пытаюсь утечку звука обнулить.
А откуда они берутся?
2
27
3 года назад
Отредактирован rsfghd
2
Я посмотрел, у меня тоже утекает это, что бы я не делал, хотя утекает до определённого момента, но наверное это уже баг счётчика
Попробуй этот вариант

PT153, из-за local sound
раскрыть
function PlaySound takes string soundName returns nothing
    local sound soundHandle = CreateSound(soundName, false, false, true, 12700, 12700, "")
    call StartSound(soundHandle)
    call KillSoundWhenDone(soundHandle)
endfunction

private void AddSound(string s, real x, real y, real z, int vol, real cutoff){
        sound snd = CreateSound(s, false, true, true, 10, 10, "SpellsEAX")
        SetSoundChannel(snd, 5)
        SetSoundVolume(snd, vol)
        SetSoundPitch(snd, 1)
        SetSoundDistances(snd, 600., 10000.)
        SetSoundDistanceCutoff(snd, cutoff)
        SetSoundConeAngles(snd, 0.0, 0.0, 127)
        SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
        SetSoundPosition(snd, x, y, z)
        SetSoundPlayPosition(snd, 1000)
        StartSound(snd)
        KillSoundWhenDone(snd)
        snd = null
    }
0
19
3 года назад
0
У меня звук проигрывается на каждом выстреле и когда меняется оружие изменяется звук выстрела. Приехали!. И че делать? Если я каждый звук проигрываю тригерно?
2
27
3 года назад
2
Если звук у тебя позиционный, то можно юзать какую-то там абилку со звуком через даммикаст, оно вроде не утечно

0
19
3 года назад
0
rsfghd:
Если звук у тебя позиционный, то можно юзать какую-то там абилку со звуком через даммикаст, оно вроде не утечно

Не могу. Абилка сфера будет подавлять другие навешенные на него сферы, даже если она пустая. Если только повыщающую попробовать
2
26
3 года назад
2
Создание звука на ходу утечно и с этим ничего не сделать. Избежать утечки можно только если создать один звук, через редактор звука или в коде, и использовать всегда его.
Разумеется есть минус, в один момент времени звук можно играть только один раз. Если необходимо проигрывать один и тот же звук несколько раз одновременно, то придется костылить, например создавать 3-4 экземпляра одного звука и играть поочередно.
Принятый ответ
0
27
3 года назад
0
Hanabishi, что тогда делает функция KillSoundWhenDone на самом деле?
0
9
3 года назад
0
Разумеется есть минус, в один момент времени звук можно играть только один раз. Если необходимо проигрывать один и тот же звук несколько раз одновременно, то придется костылить, например создавать 3-4 экземпляра одного звука и играть поочередно.
А создать массив звуков на десяток-другой-сотню экземпляров и выделять при необходимости не прокатит?
2
26
3 года назад
2
rsfghd, не, она удаляет звук. Иначе бы утечка была еще больше. Там утекают какие-то остатки.
map_maiker, прокатит в принципе. Суть именно в количестве экземпляров.
0
28
3 года назад
Отредактирован PT153
0
Там утекают какие-то остатки.
Утекают не остатки, а локальная переменная.
И че делать?
function PlaySoundX takes string soundName returns nothing
    local sound soundHandle = CreateSound(soundName, false, false, true, 12700, 12700, "")
    call StartSound(soundHandle)
    call KillSoundWhenDone(soundHandle)
    set soundHandle = null
endfunction
И передавать сюда нужно не переменную звука, а путь к звуковому файлу. Переменные из редактора звуков тут не нужны.
0
27
3 года назад
0
PT153, если верить счётчику, это не поможет)
2
26
3 года назад
Отредактирован Hanabishi
2
PT153, не, там именно утекает если даже все правильно сделать. Создание звуков течет само по себе.
По крайней мере текло в классике. По рефу хз.
0
28
3 года назад
0
Интересно, я обязательно проверю это, но позже.
0
3
3 года назад
0
PT153:
Интересно, я обязательно проверю это, но позже.
Ну как, проверил?
0
28
3 года назад
0
Нет пока времени.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.