背景: 我希望我的问题不是太含糊。我会尽量解释,不能贴太多代码,因为受影响的方法非常复杂冗长。所以我的问题是我试图加快多线程的处理速度。该应用程序用于我的 2D 游戏引擎中的照明,我在我的场景顶部绘制不同透明度级别的黑色矩形(当前导致延迟)。
对我来说,第一步是将相同亮度的相邻矩形批处理在一起,以减少一些渲染工作。结果很好(也许可以做得更好,但现在不是重点),现在我还实现了一个粗略的线程系统,它将每批一起为屏幕的单独部分照明。
我的问题的关键:在分析上述特定批处理方法的时间时(对于不同数量的线程在单独的、不相交的数据集上工作),我注意到一些奇怪的峰值。以前,当使用一个线程时,该方法执行大约需要 12ms,奇数跳转到 15ms。我没想太多。然而,当使用 2 或 3 个线程进行处理时,我得到或多或少的 4~5 毫秒,跳跃到 10 毫秒,有时甚至高达 20 毫秒。
现在我意识到,如果不检查我的代码,任何人都无法说出原因可能是什么,所以我不希望这样。相反,我试图得出一些结论,并希望现在确认它们。如前所述,每个线程都在我的数据集的一部分上工作,彼此完全不相交(它们不重叠)。但是,数据数组的入口点是通过特定类的相同实例的相同方法。所以线程都通过相同的方法访问同一个数组(但它的不同部分 - 因此我也不使用任何锁)。这会导致意外减速吗?
或者线程以这种方式运行可能是正常行为(执行时间变化超过标准的两倍)?作为另一个说明,我在需要它们的那一刻创建所有线程,并让它们运行完成。
数据集的访问方法:
public short GetLightLevelAt(int x, int y)
{
if (inLightingBounds(x, y))
{
return lightData[x, y];
}
else
{
return GuessLightLevelAt(x,y); //This won't ever happen currently, guaranteed
}
}