1

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

2 回答 2

3

为什么你会期望这会更快?

只有一个线程在做任何事情,您在一个线程中创建命令并在另一个线程中创建信号并等待它完成,这将与在第一个线程中执行它一样长,只是开销更大。

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

于 2012-08-10T13:41:32.167 回答
0

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

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

于 2013-09-12T22:48:23.797 回答