【问题标题】:SFML - sleep calculationSFML - 睡眠计算
【发布时间】: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,它不是读取一次而是从磁盘流式传输的,所以也没有意义。
  • 可以讨论是否有意义,但仅仅通过播放来检查并不能真正代表,因为播放声音及其响应时间可能取决于许多变量,从音频驱动程序、内存和主板布局。当前代码遇到的主要问题是睡眠调用,因为您的应用程序将“过度睡眠”,从而导致数字不准确,不要忘记睡眠功能不够精确。您可能只想忙着等待。
  • 好的。我会跳过这部分基准测试。谢谢

标签: c++ audio sleep sfml


【解决方案1】:

我知道这是一个老问题,但只是指出您的代码中的错误:sf::milliseconds() 函数的参数是毫秒的实际数量,作为十进制值。

所以,如果你想让它等待 1ms,你应该输入sf::milliseconds(1)

此行为在当前版本(截至今天的 2.3)中有效,但我不知道在以前的版本中是否有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多