[英]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.