【发布时间】:2013-12-11 23:09:56
【问题描述】:
我正在开发一个比较 SFML 和 SDL 的基准应用程序。我的基准测试之一是播放声音的速度。我在一个循环中多次播放声音并计算它所花费的时间。我需要在播放声音之间有一个延迟,因为我首先需要完成播放声音才能重新开始。我用 SFML sleep 解决了这个问题,但是我不确定我是否做得对。可能不是因为在第一次播放后,应用程序冻结了,就像它处于无限循环中一样。如果音乐仍在播放,我需要它延迟 1 毫秒。你能帮帮我吗?
我的功能:
void playSound()
{
sound.setBuffer(buffer);
sound.play();
}
void soundBenchmark(int numOfCycles)
{
sf::Time delayTime = sf::milliseconds(0.01);
sf::Clock clock;
for(int i = 0; i < numOfCycles; i++)
{
playSound();
while(sound.Playing) sf::sleep(delayTime);
}
sf::Time time = clock.getElapsedTime();
cout << "Time required for " << numOfCycles << " cycles playing sound: " << time.asMilliseconds() << " milliseconds.\n";
}
在main中调用函数:
while(running)
{
while(window.pollEvent(event))
{
if(event.type == sf::Event::Closed)
{
window.close();
running = false;
}
}
soundBenchmark(20);
break;
}
return 0;
【问题讨论】:
-
“播放声音的速度”是什么意思?我发现“基准”非常奇怪,不确定它是否会为您提供任何有用的信息......另外请记住,不处理事件会导致操作系统认为您的应用程序已冻结。
-
好吧,库需要几毫秒来处理播放声音和实际播放的信息。我想在两个库上多次播放声音,然后找出哪个库的时间较短。
-
这没有意义吗?播放声音绝对不是在使用多媒体库时会产生重要(甚至是明智的)开销的操作。关于
sf::Music,它不是读取一次而是从磁盘流式传输的,所以也没有意义。 -
可以讨论是否有意义,但仅仅通过播放来检查并不能真正代表,因为播放声音及其响应时间可能取决于许多变量,从音频驱动程序、内存和主板布局。当前代码遇到的主要问题是睡眠调用,因为您的应用程序将“过度睡眠”,从而导致数字不准确,不要忘记睡眠功能不够精确。您可能只想忙着等待。
-
好的。我会跳过这部分基准测试。谢谢