使用双缓冲中断 Graphics.PageScale
Using double buffering breaks Graphics.PageScale
我 UserControl
设置了以下样式:
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
我有 OnPaint
事件处理程序,它设置 Graphics.PageScale
和 Graphics.TranslateTransform()
来设置我的地图位置和比例:
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
if (Splines == null) return;
var pens = new[] {
new Pen(TrackColor),
new Pen(TrackColor),
new Pen(RoadColor),
new Pen(RiverColor),
new Pen(CrossColor)
};
var b = Splines.Bounds;
Graphics g = e.Graphics;
g.PageScale = _CurrentScale;
g.TranslateTransform(-b.Left, -b.Top);
foreach (var s in Splines) {
if (s.L) g.DrawLine(pens[s.T], s.A, s.D);
else g.DrawBezier(pens[s.T], s.A, s.B, s.C, s.D);
}
foreach (var p in pens) p.Dispose();
}
如果没有双缓冲,它可以按预期工作,但速度很慢。使用双缓冲它根本不起作用,我只得到背景。
当我禁用 Graphics.TranslateTransform()
- 我绘制了未缩放的地图。像 Graphics.PageScale
被忽略了。
我错过了什么?双缓冲不允许使用这些方法吗?所以我该怎么做?通过缩放和平移每个数据点来手动缩放和平移我的地图?它可以抵消双缓冲带来的大部分速度增益。
Scale and translate my map manually, by scaling and translating each data point? It could defeat most speed gain from double buffering.
您可以在绘制处理程序之外缩放地图(每次重新计算视图时);这不会对性能造成太大影响,尤其是当您使用整数而不是浮点数时。
整数乘法非常快。
我 UserControl
设置了以下样式:
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
我有 OnPaint
事件处理程序,它设置 Graphics.PageScale
和 Graphics.TranslateTransform()
来设置我的地图位置和比例:
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
if (Splines == null) return;
var pens = new[] {
new Pen(TrackColor),
new Pen(TrackColor),
new Pen(RoadColor),
new Pen(RiverColor),
new Pen(CrossColor)
};
var b = Splines.Bounds;
Graphics g = e.Graphics;
g.PageScale = _CurrentScale;
g.TranslateTransform(-b.Left, -b.Top);
foreach (var s in Splines) {
if (s.L) g.DrawLine(pens[s.T], s.A, s.D);
else g.DrawBezier(pens[s.T], s.A, s.B, s.C, s.D);
}
foreach (var p in pens) p.Dispose();
}
如果没有双缓冲,它可以按预期工作,但速度很慢。使用双缓冲它根本不起作用,我只得到背景。
当我禁用 Graphics.TranslateTransform()
- 我绘制了未缩放的地图。像 Graphics.PageScale
被忽略了。
我错过了什么?双缓冲不允许使用这些方法吗?所以我该怎么做?通过缩放和平移每个数据点来手动缩放和平移我的地图?它可以抵消双缓冲带来的大部分速度增益。
Scale and translate my map manually, by scaling and translating each data point? It could defeat most speed gain from double buffering.
您可以在绘制处理程序之外缩放地图(每次重新计算视图时);这不会对性能造成太大影响,尤其是当您使用整数而不是浮点数时。
整数乘法非常快。