这是一个绘图模块开发,我使用了SkiaSharp绘图库代替GDI+。
具体的场景是加载文件,解析出点线弧圆的数据,然后绘制出来,并且之后这图片存在一些交互操作,例如拖拽移动,鼠标滚轮放大缩小等。
在绘图处理中,为了大文件(数据量较大)加载后绘图的交互效率,做了一些优化措施,其中有这么一项优化处理,在进行鼠标拖拽移动时,将数据绘制的内容临时缓存起来(Bitmap),在拖拽期间,只要将临时缓存的位图结合鼠标移动距离画在画布上即可,无需每次重绘都要遍历数据绘制图像,可以节省重绘时间,使得交互更加丝滑。
用伪代码表示如下:
//绘图方法, 在每次重绘事件中调用
private void Drawing(SKCanvas canvas)
{
if (IsNeedRedraw && IsMouseDrag)
{
using var tempCanvas = new SKCanvas(cacheBitmap);
//tempCanvas进行系列绘制处理...
//绘制缓存位图
var offset = new SKPoint(mouseOffset.X, mouseOffset.Y);
canvas.DrawBitmap(cacheBitmap, offset); // 此处会出现异常!
}
//canvas进行系列绘制处理...
}
在上述代码中,调用SKCanvas.DrawBitmap偶尔会出现异常:
异常定位信息:
VS2022查看反编译代码,定位到如下位置:
比较让人奇怪的是,这个异常不是一直出现的,我尝试用try catch语句将异常部分包裹, 只是偶尔出现,可以看到底层API传入的是位图的句柄,我也查了传入的句柄,正常和不正常时的句柄都是不变的。
现在测试下来的情况表现如下:
想请教一下,关于"外部组件发生异常"的异常该如何排查和解决?
有什么经验和思路可以提供下?
经过排查,是依赖项中引用了别的包影响的,移除掉就不会再报这个异常了。