OpenGL多线程比使用单线程慢

时间:2012-08-10 13:02:35

标签: c multithreading opengl

我正在使用Windows 7并使用VC ++ 2010,这是一个32位应用程序

我试图让我的渲染器工作多线程,但事实证明我比没有使用多个线程的速度慢。

我希望它让主线程将渲染命令添加到列表中,以及一个工作线程来执行这些命令的渲染。

这一切都确实发生了,它可以很好地吸引屏幕,但是这样做时fps会更少...

我使用Fraps中的基准工具来获取这些数据:

时间是基准测试的时间,在这种情况下为30秒。

最小值,最大值,平均值均为FPS值。

使用多线程:

    Frames, Time (ms), Min, Max, Avg
     28100,     30000, 861,1025, 936.667

没有多线程:

Frames, Time (ms), Min, Max, Avg
 21483,     30000, 565, 755, 716.100

这是一些伪代码(带有相关的事件函数调用):

Main Thread:
    Add render comands to queue
    ResetEvent (renderCompletedEvent);
    SetEvent (renderCommandsEvent);
    WaitForSingleObject (renderCompletedEvent, INFINITE);

Render Thread:
    WaitForSingleObject (renderCommandsEvent, INFINITE);
    Process commands
    SetEvent (renderCompletedEvent);
    ResetEvent (renderCommandsEvent);

2 个答案:

答案 0 :(得分:3)

为什么你希望这会更快?

只有一个线程正在执行任何操作,您在一个线程中创建命令,并在另一个线程中发出信号并等待它完成,这只需要在第一个线程中执行它,只需要更多的开销。< / p>

要利用多线程,您需要确保两个线程同时执行某些操作。

答案 1 :(得分:0)

我不是opengl专家,但一般来说,重要的是要意识到线程实际上并不用于加速,它们是为了保证某些子系统以整体速度为代价响应 。这可能会保留一个gui线程和一个网络线程,以确保gui和网络响应。这实际上是在主线程的性能成本下完成的。 CPU将把1/3的时间用于主线程,将1/3的时间用于网络线程,将1/3的时间用于gui线程,即使没有gui事件可以处理也没有进出网络。因此,无论主线程在做什么,只能获得非多线程情况下CPU时间的1/3。好处是,如果大量数据开始通过网络到达,则始终保留处理它的CPU时间(如果没有可以填充网络缓冲区,那么可能会很糟糕,然后其他数据开始被丢弃或覆盖)。可能的例外是,如果多个线程在不同的核心上运行。但是,即使这样小心,核心也可以共享相同的缓存,因此如果两个核心使每个其他缓存无效,性能可能会急剧下降,而不会提高。如果内核共享一些资源来向GPU移动数据或者从GPU移出数据,或者有其他共享限制资源,那么这又可能导致性能损失,而不是增益。

简而言之,单个CPU系统上的线程始终与子系统的响应性有关,而不是性能。当不同的线程在多个核心上运行时,可能会有性能提升(默认情况下,这些窗口通常不会执行,但可以强制执行)。然而,当这些核心共享一些可能会伤害而不是帮助性能的资源时,存在潜在的问题。共享缓存空间或您上下文中的一些共享GPU相关资源。