音效的设计选择

Posted

技术标签:

【中文标题】音效的设计选择【英文标题】:Design choice for sound effects 【发布时间】:2010-01-23 22:24:01 【问题描述】:

我正在尝试决定如何在我的程序中实现音效。我在两个选项之间进行了辩论。

1) 创建一个抽象接口SoundEffect 并从中派生出所有音效。每个音效都是它自己的类。在构建时,它会打开声音文件并播放,在销毁时它会关闭文件。我看到这种方法的主要缺点是我会有很多非常小的对象,这会大大增加文件的数量。我可以将多个音效放在一个标题中(相关的),但我不确定。

2) 由于播放任何音效都会调用相同的东西,唯一的区别是它打开的文件,我可以创建一个单一的 SoundEffect 类,它的构造函数是一个包含音效名称的枚举器。该类将使用开关来播放适当的声音。

显然,我正在就 OOP 方法与更“传统”的方法进行辩论,我想知道这里最好的设计选择是什么。我非常倾向于 OOP 方法,但我不确定我想如何构建文件。如果您有任何其他建议,我很乐意听到。

【问题讨论】:

【参考方案1】:

声音是数据,播放声音的过程使用大多数机器只有一个的系统资源(声卡)。与声音设备交谈通常有点复杂,但如果您使用 api,它可能看起来很简单。

因此,声音知道如何自己演奏没有多大意义。他们最终将争夺对声音设备这一单一资源的控制权。

如果您必须使用类。然后你应该有一个代表你想要播放的声音设备的类,以及代表可以播放的东西的单独的类。

就个人而言,会跳过用类包装音效,数据就是数据,实际上没有必要让每个数据都具有方法。可能会过度使用您知道的类。

不过,将声音设备封装在一个类中很有意义,它允许您从其余代码中抽象出您使用的声音 API 如何工作的细节,以及本地化允许您如果有多个声音设备,请选择要使用的声音设备。

【讨论】:

我正在使用一个库来处理你提到的大部分事情。我只需要以一种干净的方式组织播放声音文件。音响设备的争夺不是问题。 如果您想使用不同的声音 api。如果你不这样做,那么一开始就不需要使用类。 延伸@John所说的,为什么声音效果要有“播放”方法?声音不能自己播放。它可以由某些设备播放,但它不能只决定播放自己。您可能还可以单独对声音效果执行其他操作,例如以各种方式对其进行转换、更改音高或音量等。如果你需要这样的东西,为声音效果创建一个类可能是有意义的。但是播放声音的能力属于声音设备,而不是音效。 好的,但没有人解释过他们建议如何处理大量声音文件。【参考方案2】:

如果我理解正确,您正在为所有可能的声音硬编码音效?

这听起来不对,您为不同的行为创建不同的子类,而不是为不同的数据。 如果您有某些需要预处理数据的音效类型,则子类是有意义的 - 如果项目更大,您可能希望将效果处理代码和效果参数分开,这样您就可以在不重新构建应用程序的情况下更改效果(例如 FMOD 分开编码和声音设计)。

要播放不同的声音文件,只需让类的构造函数获取声音文件的路径或一些资源 id - 这里不需要switch

如果您要处理大量重复使用的声音文件,则基于池的方法对于避免每次播放文件时重新加载文件很有用。一个习惯用法是享元模式(参见例如Boost.Flyweight 的实现)。

【讨论】:

以上是关于音效的设计选择的主要内容,如果未能解决你的问题,请参考以下文章

我只想要一个冰墩墩音效怎么制作?

java课程设计--坦克大战

OPENGL相关 音效

APP消息推送功能

Android中的游戏音效

unity怎么按键盘持续有音效声音