简而言之:
在单核上运行多线程应用程序在什么情况下会破坏性能?
将多线程应用程序的亲和性设置为仅使用一个内核怎么样?
长篇:
我正在尝试在其自己的线程上运行 2D 引擎的物理特性。它工作正常,起初性能似乎正常,但我决定让游戏尝试以 10K FPS 和 120FPS 的物理速度运行,进入任务管理器并将亲和力设置为程序只能使用一个内核的位置。
在将亲和力设置为一个核心之前,FPS 大约为 1700,之后它达到了大约 70FPS。我没想到会出现这种下降。我告诉游戏尝试以 300 FPS 和 60 FPS 运行物理。
同样的事情发生了。
我没有多想,所以我只是继续修改引擎。后来我在更改了一些绘图代码后再次对其进行了测试,300 FPS,60FPS 用于物理。在允许所有内核的情况下,它可以很好地管理 300FPS,与单核 FPS 的亲和力下降到 4。现在我知道在单核上运行多线程应用程序不可能那么糟糕,或者我不知道发生了什么您将亲和力设置为单个核心。
这是关于渲染/物理如何运行的......
循环开始
收集输入直到 (1.0 / FPS) 通过。
来电更新。
锁定物理线程互斥体,因为游戏中的事物将使用物理数据,并且我不希望引擎更新任何内容,直到此更新调用中的所有内容完成。
更新游戏中可能发送 Draw 函数对象(保存要绘制的内容、绘制的位置、如何绘制)到渲染队列的所有内容。
解锁互斥锁。
渲染器在每个函数对象上调用 operator() 并将它们从队列中删除。
更新画面。
重复循环。
物理线程循环:
ALLEGRO_TIMER* timer(al_create_timer(1.0f / 60.0f));
double prevCount(0);
al_start_timer(timer);
while(true)
{
auto_mutex lock(m_mutex);
if(m_shutdown)
break;
if (!m_allowedToStep)
continue;
// Don't run too fast. This isn't final, just simple test code.
if (!(al_get_timer_count(timer) > prevCount))
continue;
prevCount = al_get_timer_count(timer);
m_world->Step(1.0f / 60.0f, 10, 10);
m_world->ClearForces();
}
// 注意:自动互斥锁只是我创建的一个非常简单的对象,用于在构造函数中锁定互斥锁并在析构函数中解锁它。我正在使用 Allegro 5 的线程功能。