我正在使用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);
答案 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相关资源。