Multithreading 在向新线程中添加代码后,为什么图形会如此显著地中断?

Multithreading 在向新线程中添加代码后,为什么图形会如此显著地中断?,multithreading,performance,processing,frame-rate,conways-game-of-life,Multithreading,Performance,Processing,Frame Rate,Conways Game Of Life,我试图写康威的《生活的游戏》,但遇到了帧率和每一代的生成速度的问题。一位朋友建议我尝试使用线程来提高帧速率,但我遇到了一个问题。 我添加了一个线程来运行单元格的检查和更改,现在它有巨大的图形问题。 它应该是由这些灰色和白色细胞组成的50x50网格 线程是我之前添加的问题,这一切都很好,这是我第一次尝试线程,完全初学者 感谢您的帮助,Michael。您真的应该尝试发布一个链接,而不是一个指向整个代码库的链接。请注意,这应该而不是整个项目;这应该是一个小例子来说明这个问题。在您的例子中,一个使用两

我试图写康威的《生活的游戏》,但遇到了帧率和每一代的生成速度的问题。一位朋友建议我尝试使用线程来提高帧速率,但我遇到了一个问题。 我添加了一个线程来运行单元格的检查和更改,现在它有巨大的图形问题。 它应该是由这些灰色和白色细胞组成的50x50网格

线程是我之前添加的问题,这一切都很好,这是我第一次尝试线程,完全初学者


感谢您的帮助,Michael。

您真的应该尝试发布一个链接,而不是一个指向整个代码库的链接。请注意,这应该而不是整个项目;这应该是一个小例子来说明这个问题。在您的例子中,一个使用两个线程绘制圆的简单程序就足够了

但总的来说,我可以解释为什么多线程在渲染方面存在缺陷。处理使用单个线程来处理其所有图形(及其所有事件)。这是故意的,不是你想尝试的。原因如下:

考虑一个使用两个线程的示例程序:一个使用嵌套的
for
循环将每个像素填充为红色,另一个使用嵌套的
for
循环将每个像素填充为蓝色。第一个线程指向第一个像素,将其变成红色,指向第二个像素,将其变成红色,等等。但同时,另一个线程指向第一个像素,将其变成蓝色,指向第二个像素,将其变成蓝色,等等

下面是一些代码,它们正是这样做的:

size(1000, 1000);
noSmooth();
new Thread() {
  public void run() {
    for (int x = 0; x < width; x++) {
      for (int y = 0; y < height; y++) {
        stroke(255, 0, 0);
        point(x, y);
      }
    }
  }
}
.start();

for (int x = 0; x < width; x++) {
  for (int y = 0; y < height; y++) {
    stroke(0, 0, 255);
    point(x, y);
  }
}
大小(10001000);
noSmooth();
新线程(){
公开募捐{
对于(int x=0;x
最终结果应该是什么样的

没有任何单一的正确答案,这将取决于线程的执行顺序,而您无法控制线程的执行顺序。通常,当线程在屏幕上绘制什么内容时,您会得到非常随机的结果:

这使得多线程对于渲染非常无用


如果你真的想使用线程(我很怀疑它们对你会有多大帮助),那么你最好用另一个线程来计算下一代,同时绘制当前一代。您应该完全从第二个线程进行零绘图,并且所有绘图都应该从Processing用于调用
draw()
函数的默认线程进行。

而不仅仅是链接到您的代码并期望我们自己解决您的错误,您是否进行过调试?你能把它缩小到一段特定的代码吗?大多数情况下,您应该能够通过一次彻底的调试会话来回答自己的问题。如果没有任何迹象表明你的问题在哪里,或者可能是什么原因,我们只是在暗中捅刀子——因此,你目前的问题非常广泛,不清楚你到底在问什么。我忘了提到我看过的几件事,对不起。当我有机会的时候,我会更新问题和描述,谢谢你的建议。请不要在问题被回答后删除它们。首先,谢谢你的回复,非常有用。其次,我为缺乏MCVE道歉,我对StackOverflow非常缺乏经验。以后我会花更多的时间来回复。我会仔细看看已经说过的话,然后再进一步挖掘。谢谢你的帮助@MichaelStaig请看我编辑的答案,看一个具体的例子。我明白了,这很有道理。说明的顺序与你期望的不一样。这真的很有帮助,再次谢谢你