Я використовую OpenAL для відтворення звуків. Я намагаюся реалізувати функцію відтворення вогню і забути, яка бере ідентифікатор буфера і призначає його джерелу з пулу, який я раніше виділив, і відтворює його. Однак існує проблема з життям об'єкта.
У OpenGL функції видалення або автоматично від’єднує речі (наприклад, текстури), або автоматично видаляє річ, коли вона в кінцевому підсумку не пов'язана (наприклад, шейдери), і таким чином, як правило, легко управляти видаленням. Однак alDeleteBuffers
натомість просто не вдається, AL_INVALID_OPERATION
якщо буфер все ще пов'язаний з джерелом.
Чи є ідіоматичний спосіб "видалити" буфери OpenAL, що дозволяє їм закінчити гру, а потім автоматично від'єднати і справді їх? Чи потрібно мені більш глибоко прив’язувати управління буфером до пулу джерел (наприклад, для видалення буфера потрібно також перевірити всі виділені джерела)?
Аналогічно, чи існує ідіоматичний спосіб від’єднати (але не видалити) буфери, коли вони закінчують програвати? Було б непогано, якби я шукав вільне джерело, мені потрібно було лише перевірити, чи буфер взагалі приєднаний і чи не турбує перевірку стану джерела.
(Я використовую C ++, хоча підходи для C також чудові. Підходи, що передбачають мову GCd та використання фіналізаторів, ймовірно, не застосовуються.)