你有什么想法Graphics对象如何使用资源?使用缩放的GraphicsPath非常慢
我画几千GraphicsPath中与经纬度坐标的对象在面板上。最初那些图形路径必须被缩放(实际上变换 - 4矩阵变换)。然后用户可以移动地图,缩放,每个动作都需要重新绘制图形路径。
问题是,当缩放级别在2000-10000左右时,整个事情仍然是响应,但是当它达到数十万(这是街道级别的缩放)时,绘制并导致整个应用程序无响应。检查空闲的内存,仍然很多。 CPU使用率仍然可以。
怎么会吸取同一数千图形路径,同为4矩阵变换每个变得非常缓慢,当变焦系数分别提高? System.Graphics本身处理图形路径坐标时是否存在大数目的问题?你们有没有遇到同样的问题?
对不起好人,因为不包括代码:所以这里是“慢”代码块:basicaly _paint方法的迭代部分。它运行了30,000多条图形路径,大多数是从esri shp文件中提取的多段线。 x的坐标是+和y是 - 并且翻转倒置,因此需要在面板上绘制矩阵变换。问题在于低值变量zI,它比hi值变量zI快得多。 Hi-value 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++; }
帮助.... :)
你应该告诉我们你的代码,如果你想要,我们可以帮你 – 2013-04-04 12:48:24
需要任何绘画代码渲染数十万条路径将会变得缓慢。没有魔法修复,你需要重新考虑你的设计。从谷歌地图等提示,并注意如何在缩小时开始放弃细节。 – 2013-04-04 13:46:34