我在 Java 中遇到了一个非常奇怪的行为/问题。我所做的归结为在画布上绘制简单的形状。一切都很顺利,直到我决定添加另一个可以访问我的画布的线程。
所以有两个线程,每个都绘制相似的形状,并且每个都依赖相同的函数(在另一个非线程对象中)来进行绘制。这些函数已同步化,以防止底层绘制命令被乱序调用。
一切都很好,除非我将线程#2 的绘图函数调用的颜色设置为包含 alpha 通道。当我这样做时,我得到以下异常:
Exception in thread "Thread-3" java.awt.geom.IllegalPathStateException: missing initial moveto in path definition
at java.awt.geom.Path2D$Float.needRoom(Unknown Source)
at java.awt.geom.Path2D.closePath(Unknown Source)
at sun.java2d.pipe.PixelToShapeConverter.makePoly(Unknown Source)
at sun.java2d.pipe.PixelToShapeConverter.fillPolygon(Unknown Source)
at sun.java2d.pipe.ValidatePipe.fillPolygon(Unknown Source)
at sun.java2d.SunGraphics2D.fillPolygon(Unknown Source)
at java.awt.Graphics.fillPolygon(Unknown Source)
at com.deadbird.zndo.Tile.drawPolygon(Tile.java:177)
at com.deadbird.zndo.TiledImage.drawPolygon(TiledImage.java:158)
at com.deadbird.zndo.TileSet.drawPolygon(TileSet.java:46)
at com.deadbird.zndo.Map.drawPolygonAtCoords(Map.java:90)
at com.deadbird.zndo.CutterThread.drawArea(CutterThread.java:146)
at com.deadbird.zndo.CutterThread.flushTmpAreaList(CutterThread.java:107)
at com.deadbird.zndo.CutterThread.cut(CutterThread.java:68)
at com.deadbird.zndo.CutterThread.run(CutterThread.java:50)
at java.lang.Thread.run(Unknown Source)
让我丧命的是,这个错误似乎表明我提供给它的几何图形有问题,我知道这不是真的,当我运行相同的代码、相同的几何图形、只是使用不包含的颜色对象时alpha 值程序运行得很好,轻松地处理大量数据,并且绘图函数根本没有显示两个线程有问题的迹象。
还值得注意的是,线程#1 在颜色对象中使用 alpha 值调用相同的绘制函数没有问题,这些结果绘制得很好。
所以我的问题是,什么可能导致这种差异?相同的功能,两个线程,一个可以很好地绘制 alpha 和非 alpha 颜色,另一个似乎只适用于非 alpha。
这是有问题的功能:
public synchronized void drawPolygon(double[] x, double[] y, Color color) {
// Create polygon
int[] intX = new int[x.length];
int[] intY = new int[y.length];
// Convert the double array to an int array
for (int i=0; i < intX.length; i++) {
intX[i] = (int) x[i];
intY[i] = (int) y[i];
}
Polygon poly = new Polygon(intX, intY, intX.length);
// Now draw that poly
g.setColor(color);
g.fillPolygon(poly);
}
更具体地说明导致问题的原因,这有效:
drawPolygon(x, y, new Color(13, 191, 0) );
这不...
drawPolygon(x, y, new Color(13, 191, 0, 30) );
这很有趣,因为我没有给它一个形状对象,而是给它一组静态的 X 和 Y 值,然后让 Java 将它们组装成一个多边形对象。无论路径形成是什么,它都应该由多边形的对象正确处理(并且在我引入新线程之前它工作得很好,我不认为这是这里的问题)。
这真的看起来像是一个内部问题,有什么想法吗?
-科迪