【发布时间】:2012-04-09 21:31:29
【问题描述】:
我正在开发一个 iOS 音乐应用程序(用 C++ 编写),我的模型看起来或多或少是这样的:
--Song
----Track
----Track
------Pattern
------Pattern
--------Note
--------Note
--------Note
所以基本上一个Song 有多个Tracks,一个Track 可以有多个Patterns 和一个Pattern 有多个Notes. 这些东西中的每一个都由一个类表示,除了歌曲对象,它们都存储在向量中。
每个Note 都有一个"frame" 参数,以便我可以计算何时应该播放一个音符。例如,如果我每秒有 44100 个样本,并且特定音符的帧是 132300,我知道我需要在第三秒开始时使用该音符。
我的问题是我应该如何表示这些音符以获得最佳性能?现在我正在考虑将注释存储在每个模式的矢量数据成员中,然后循环 Song 的所有 Tracks,而不是查看 Patterns,然后循环 Notes 以查看哪个有大于 132300 且小于 176400(第 4 秒开始)的帧数据成员。
如您所知,循环次数很多,而一首歌曲可能长达 10 分钟。所以我想知道这是否足够快来计算所有帧并按时将它们发送到缓冲区。
【问题讨论】:
-
“我的问题是我应该如何表示这些笔记以获得最佳性能?”这取决于您要如何处理数据。
-
好的,请勾选:
[.] "I'm reinventing MOD files"或[.] "I'm reinventing MIDI files"。注意MOD players already exist for smart phones -
这是一个学校项目,我怀疑他们会对这个答案感到满意。老实说,我不明白为什么这很重要..
-
你只是假设我正在制作已经存在的东西的精确副本,而我知道情况并非如此。如今,任何事物都很难做到 100% 原创,但这并不是制作好产品的必要条件。
-
@SigTerm Sled 询问如何使用标准 C++ 容器将数据存储在内存中。 MIDI 和 MOD 是用于在磁盘上存储相同数据的二进制格式,它们与优化性能和实际播放存储在其中的音乐没有任何关系。
标签: c++ performance loops vector