音效的设计选择
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 的实现)。
【讨论】:
以上是关于音效的设计选择的主要内容,如果未能解决你的问题,请参考以下文章