这是我的问题How To Handle Image as Background to CAD Application
的后续内容我应用了调整大小/重新采样代码,但没有任何区别。我相信我对GDI +等不太了解所以请原谅我,如果我看起来很混乱。
我正在使用第三方图形库(Piccolo)。除了它甚至包装GDI +之外,我不知道它是否足以确定它在引擎盖下做了什么。
我的测试是以不同的缩放级别旋转显示器 - 这是导致性能最差的过程。我知道我在旋转相机视图。在最高1.0的缩放级别下,没有性能下降,使用鼠标滚轮可以平滑旋转。必须将图像缩放到每像素1米的CAD单位,缩放级别为1.0。我已调整大小/重新采样图像以匹配该图像。我根据上一个问题给出的代码尝试了不同的方法来加快速度:
public static Bitmap ResampleImage(Image img, Size size) {
using (logger.VerboseCall()) {
var bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb);
using (var gr = Graphics.FromImage(bmp)) {
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
gr.DrawImage(img, new Rectangle(Point.Empty, size));
}
return bmp;
}
}
我想这可以加快重新采样,但据我所知,在尝试以高变焦级别旋转显示时,对性能没有影响。用户性能分析器(ANTS)我能够找到导致性能损失的代码:
protected override void Paint(PPaintContext paintContext) {
using (PUtil.logger.DebugCall()) {
try {
if (Image != null) {
RectangleF b = Bounds;
Graphics g = paintContext.Graphics;
g.DrawImage(image, b);
}
}
catch (Exception ex) {
PUtil.logger.Error(string.Format("{0}\r\n{1}", ex.Message, ex.StackTrace));
//----catch GDI OOM exceptions
}
}
}
性能命中完全在g.DrawImage(image,b);
当然,界限是形象的界限。 catch块用于捕获GDI + OOM异常,这些异常在高缩放级别下也会变得更糟。
调用它的次数似乎随着缩放级别的增加而增加....
在相机视图的代码中还有另一个命中,但我还没有足够的信息来解释它,除了这似乎绘制了连接到相机的所有层 - 以及它们上面的所有对象 - 当时相机视图矩阵和剪辑应用于paintContext(无论这意味着什么)。
还有一些其他调用g.DrawImage(image,b);我可以用吗?还是我受图形引擎的支配?不幸的是,它是如此嵌入,以至于我很难为我改变
再次感谢
答案 0 :(得分:1)
我认为你使用,如果我没有错, PImageNode 对象形式Piccolo。对该方法的调用量可能会增加,因为Piccolo引擎会根据缩放级别(剔除的类型)跟踪用户屏幕上的“真实”绘图区域,并仅绘制可见的节点。如果场景中有很多 PImageNode 对象,并且 ZoomOut ,则会增加需要绘制的 PImageNode 对象的数量,因此调用该方法。
表现如何:
1)尝试使用SetStyle(ControlStyles.DoubleBuffer,true); PCanvas(如果还没有设置)
2)看这里CodeProject
问候。