【问题标题】:Multithreaded Engine Windowed random slowdown多线程引擎窗口随机减速
【发布时间】:2009-09-11 16:57:40
【问题描述】:

我们设置了一个基于任务的多线程引擎,其中调度程序将任务传递给线程无锁队列。该引擎使用 C++ 和 DirectX 进行渲染,我们使用 boost::thread 创建线程。在窗口模式下,它会随机减速一秒钟左右,然后再加速。这似乎是 Vista 造成的,但我们无法弄清楚如何正确解决它。

我们尝试过的一个似乎有助于解决随机减速的方法是在处理每个任务后让线程休眠一毫秒,但这会导致其他问题,并不是一个很好的解决方案。

【问题讨论】:

  • 无锁队列?逃跑!!!!

标签: c++ multithreading windows-vista task windowed


【解决方案1】:

我建议做的第一件事是通过分析了解导致速度变慢的原因。

随机休眠很少是一个好主意(从这里的经验来看,是的,我已经这样做了,是的,我稍后修复了这个问题),也不是推测性能问题的根源,尤其是在多线程环境中。

Visual Studio 2010 beta1 有一个很棒的分析器,如果它在您的应用程序中,它非常适合了解导致速度变慢的原因,Hazim Shafi's blog 将介绍如何使用它。

您还可以查看windows performance toolkit 中提供的 xperf 工具(您必须使用平台 sdk 安装程序,但您需要安装该节点,因此它实际上非常快) .

【讨论】:

  • 我不喜欢在那里睡觉,我正在寻找一种方法来摆脱它们并正确解决问题。我将研究 VS 2010,我一直在寻找一个很好的线程分析器,但我只能找到成本太高的英特尔分析器。我推测它与 Vista 有关的原因是,即使只有一个渲染任务并且第二个核心处于空闲状态,也会发生减速。在渲染任务中,事情被设置为只是将数据传递给 DirectX,没有分配,或阻塞或任何可能导致减速的事情。
  • vs 2010 目前处于测试阶段,因此它实际上是免费的。 Windows 性能工具包 (xperf) 也是免费的,两者都应该显示减速的根源,但我认为在 vs 2010 分析器中会更容易找到。我认为 AMD 也有一个免费的线程分析器。
【解决方案2】:

您是否尝试过在 XP 和 Windows 7 下运行相同的代码?

我有一些渲染到屏幕外兼容位图的多线程代码。每个线程渲染到自己的兼容位图。然而,出于某种奇怪的原因,这幅画将 AGES 带到了远景上。我在 GDI 渲染上损失了超过 50% 的处理时间。在 Win 7 和 XP 下我没有这样的问题。有趣的是,我遇到了this article,这意味着在 Vista 下的多线程 GDI 渲染已经无可救药地被破坏了。在某个时候,我将尝试提出一种方法,在该方法中,所有渲染都由我的主线程而不是辅助线程完成,以测试 Vista 性能是否有所提高。虽然这将是一个巨大的噩梦,但我的主要市场使用的是 XP,所以我不是。此刻大惊小怪...

【讨论】:

  • 我还没有在 XP 下测试过它,但它在 Windows 7 下做同样的事情。由于减速是随机发生的,每一帧都发生同样的事情,我真的看不到为什么会发生放缓。实际上,它不像是减速,更像是某些东西阻塞了线程一段时间。渲染开始卡顿,帧率从大约 370 下降到 200,然后又恢复正常。
  • VTune 30 天演示可能是最好的选择,但您需要花 30 天的大部分时间来解释您返回的数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2013-05-08
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多