您知道 Graphics 对象如何使用资源吗?
我在面板上绘制了数千个带有经纬度坐标的 GraphicsPath 对象。最初,那些 Graphicspaths 必须被缩放(转换 - 实际上是 4 个矩阵转换)。然后用户可以移动地图,缩放,每个动作都需要重新绘制图形路径。
问题是,当缩放级别在 2000-10000 左右时,整个东西仍然响应,但是当它达到数十万(这是街道级别缩放)时,绘制时间太长,导致整个应用程序无响应。检查可用内存,仍然很多。CPU使用率还可以。
当缩放因子增加时,如何绘制相同的数千个图形路径,每个具有相同的 4 个矩阵变换变得非常慢?处理大量图形路径坐标时 System.Graphics 本身存在问题吗?你们有没有遇到过同样的问题?
对不起,好人,不包括代码:所以这里是“慢”代码的一部分:基本上是 _paint 方法的迭代部分。它运行超过 30,000 个图形路径,大多数是从 esri shp 文件中提取的折线。x 的坐标是 + 并且 y 是 - 并且上下翻转,因此需要在面板上绘制所需的矩阵变换。问题在于低值变量 zI,它比高值变量 zI 快得多。高值 zi 意味着大部分图形路径在绘制区域之外。我尝试通过检查 isVisible 或通过与矩形边界相交来减少 zi 的数量。但这还不够快。有任何想法吗?
foreach (GraphicsPath vectorDraw in currentShape.vectorPath) { GraphicsPath paintPath = (GraphicsPath)vectorDraw.Clone(); OperationMatrix = new Matrix(); OperationMatrix.Translate(-DisplayPort.X, -DisplayPort.Y); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(); OperationMatrix.Scale(zI, zI); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(1, 0, 0, -1, 0, DisplaySize.Height); paintPath.Transform(OperationMatrix); OperationMatrix = new Matrix(); OperationMatrix.Translate(ClientGap.Width, -ClientGap.Height); paintPath.Transform(OperationMatrix); //if (WiredPort.IsVisible(paintPath.GetBounds())) //Futile attempt //{ Pen LandBoundariesPen = new Pen(Color.FromArgb(255, 225, 219, 127)); GraphContext.DrawPath(LandBoundariesPen, paintPath); // this is the slowest part. When commented it goes faster. pathCountX++; }
帮助 .... :)