我正在尝试实现一个多线程 3D 应用程序,其中一个线程执行恒定速率的场景更新(120Hz),另一个执行渲染(可能具有非常短的帧时间,例如 400Hz),共享数据三重缓冲。根据MSDN关于计时的文章QueryPerformanceCounter
,多线程使用时表现不佳:
在多个线程上计算时序——例如,每个线程与特定处理器相关联——大大降低了多核系统的性能。
然而,更新线程需要高精度时序以确保更新以正确的间隔发生,并且渲染线程需要高精度的帧时间进行插值,那么解决这个问题的常用方法是什么?
更新:
我现在创建了一个小型测试程序来测试这种“大幅降低”的性能。它会调用QueryPerformanceCounter
100000000 次。它为一个线程执行此操作,然后在不同的内核上为两个并行线程运行它。根据文章的建议,每个线程都将其亲和性设置为不同的核心。如果您按照文章的内容进行,我的机器上的测试结果令人惊讶。
结果:
注意:这些结果包括递增循环计数器(64 位 int)和跳转到循环开头所花费的时间,因此实际执行时间更短。
1 Thread: Execution in 3255313449 ns Approximately 32.6 ns per call 2 Threads: Thread 1: Execution in 3278105881 ns Approximately 32.8 ns per call Thread 2: Execution in 3271422015 ns Approximately 32.7 ns per call
这表明使用两个线程调用QueryPerformanceCounter
. 这是异常行为,还是文章对大多数现代机器不正确?