繁体   English   中英

OpenGL多线程比使用单线程慢

[英]OpenGL Multithreading slower than using a single thread

我正在使用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);

你为什么期望这会更快?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM