我正在从事一个实时显示心电图的交叉测试项目。它在使用 Xamarin 的 Windows 和 Android 上运行良好,但在 IOS 中我的性能越来越慢。
我认为问题是由于我在 ios 方面缺乏专业知识..
我做过两次测试都失败了,有人有加速的解决方案吗?
测试一个
我调用 Plot,然后每隔 < 10 毫秒将 UIImage wBitmap 分配为 MyView Backgroud
public void Plot(PointF pPrec, PointF pNext)
{
SizeF bitmapSize = new SizeF(wBitmap.Size);
using (CGBitmapContext context2 = new CGBitmapContext(IntPtr.Zero, (int)bitmapSize.Width, (int)bitmapSize.Height, 8, (int)(4 * bitmapSize.Width), CGColorSpace.CreateDeviceRGB(), CGImageAlphaInfo.PremultipliedFirst))
{
context2.DrawImage(new RectangleF(0, 0, wBitmap.Size.Width, wBitmap.Size.Height), wBitmap.CGImage);
context2.SetLineWidth(1);
context2.AddLineToPoint(pNext.X, pNext.Y);
context2.DrawPath(CGPathDrawingMode.Stroke);
// output the drawing to the view
wBitmap = UIImage.FromImage(context2.ToImage());
}
}
测试 B
我调用 Plot,然后每隔 < 10 毫秒将 UIImage wBitmap 分配为 MyView Backgroud
public void Plot2(PointF pPrec, PointF pNext) { UIGraphics.BeginImageContext(wBitmap.Size); context = UIGraphics.GetCurrentContext();
using (context)
{
if (wBitmap != null)
{
context.TranslateCTM(0f, wBitmap.Size.Height);
context.ScaleCTM(1.0f, -1.0f);
context.DrawImage(new RectangleF(0f, 0f, wBitmap.Size.Width, wBitmap.Size.Height), wBitmap.CGImage);
context.ScaleCTM(1.0f, -1.0f);
context.TranslateCTM(0f, -wBitmap.Size.Height);
}
context.SetLineWidth(1);
context.MoveTo(pPrec.X, pPrec.Y);
context.AddLineToPoint(pNext.X, pNext.Y);
context.DrawPath(CGPathDrawingMode.Stroke);
wBitmap = UIGraphics.GetImageFromCurrentImageContext();
}//end using cont
UIGraphics.EndImageContext();
}
最佳答案
您不需要先绘制到位图中,然后再在 View 中使用该位图。正确的做法是子类化 UIView
,然后覆盖 Draw()
方法并在其中绘制您的东西。
然后您可以在 View 上调用 SetNeedsDisplay()
来安排重绘。
下面的例子画了一个箭头形状的背景:
class YourView: UIView
{
public override void Draw(RectangleF rect)
{
const float inset = 15f;
UIColor.Blue.SetFill();
var path = new UIBezierPath();
path.MoveTo(new PointF(0, 0));
path.AddLineTo(new PointF(rect.Width - inset, 0));
path.AddLineTo(new PointF(rect.Width, rect.Height * 0.5f));
path.AddLineTo(new PointF(rect.Width - inset, rect.Bottom));
path.AddLineTo(new PointF(0, rect.Bottom));
path.AddLineTo(new PointF(0, 0));
path.Fill();
}
}
}
或者,您可能想查看现有组件,例如 CorePlot或 TeeChart在 Xamarin 组件商店中可用。 TeeChart 甚至可以跨平台,因此您不必担心 Android 还是 iOS。
关于IOS Xamarin - 实时绘图画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21830197/