在我的应用程序中,有2个窗口,都包含一个PictureBox。第一个(pb1)允许交互,并且可以通过click- and mousemove -事件更改图像。这些事件调用pb1.Invalidate();
我希望第二个PictureBox (pb2)也重新绘制,所以我从pb1的paint-event调用pb2. invalidate()。[只是为了上下文,第二个PictureBox显示几乎相同的图像,但在更大的规模和绘图的某些部分将在未来被遗漏,所以我在两个油漆事件中使用相同的方法来决定画什么和不画什么]
它工作,但它是"滞后"我想让它像第一个图片盒上的油漆一样光滑。为了便于测试,我将paint事件简化为一个网格。
- 两个窗口都是双缓冲的
- 我试着用SKGLControls从skasharp(应该有更好的性能)替换图片框。示例代码仍然使用SkiaEvents,所以如果两个控件都出现问题,不要感到困惑。
- 我尝试使用。update()或。refresh()代替。invalidate(),但我猜它要处理的太多了,应用程序只是崩溃了…
这是OnPaint事件
调用的方法public void Update(SKPaintGLSurfaceEventArgs e, bool bigscreen)
{
SKCanvas canvas = e.Surface.Canvas;
canvas.Clear(SKColors.Beige);
//Zoom to specified area
SKMatrix matrix = SKMatrix.Identity;
if (!bigscreen)
{
matrix = matrix.PostConcat(SKMatrix.CreateScale(canvasSize / (float)zoomArea.Width, canvasSize / (float)zoomArea.Height));
}
else
{
matrix = matrix.PostConcat(SKMatrix.CreateScale(bigCanvasSize / (float)zoomArea.Width, bigCanvasSize / (float)zoomArea.Height));
}
matrix = matrix.PreConcat(SKMatrix.CreateTranslation(-zoomArea.X, -zoomArea.Y));
canvas.SetMatrix(matrix);
DrawGrid(canvas);
}
和网格绘制方法
private void DrawGrid(SKCanvas canvas)
{
using (SKPaint paint = new SKPaint() { IsAntialias = true,Color=SKColors.LightGray,StrokeWidth = 1})
{
canvas.DrawLine(0, 0, 0, gridCanvas.Height, paint); //Size gridCanvas is always the same at the moment and defines the space where the grid is drawn
canvas.DrawLine(0, 0, gridCanvas.Width, 0, paint);
for (int i = 0; i <= (gridCanvas.Width - gridoffsetX) / pxPerSquare; i++)
{
canvas.DrawLine(i * pxPerSquare + gridoffsetX, 0, i * pxPerSquare + gridoffsetX, gridCanvas.Height, paint);
}
for (int i = 0; i <= (gridCanvas.Height - gridoffsetY) / pxPerSquare; i++)
{
canvas.DrawLine(0, i * pxPerSquare + gridoffsetY, gridCanvas.Width, i * pxPerSquare + gridoffsetY, paint);
}
}
}
最后是原始的Paint Event
private void Pb1_PaintSurface(object sender, SKPaintGLSurfaceEventArgs e)
{
win2.UpdateDrawing(); //Just calls .Invalidate() on pb2
painter.Update(e, false);
}
examplePicture
所以我的问题是:有没有一种方法,使两个控件绘制几乎同时没有延迟,虽然我不明白为什么第一个PictureBox绘制实时和第二个不…谢谢!
在搜索了一天之后,我在发帖后找到了这个页面,这对我有帮助:Onpaint事件(无效)在一段时间后更改执行顺序正常操作(运行时)