2014-02-17 122 views
2

我正在交互测试项目中实时显示ecg图表。它使用Xamarin在windows和android上工作正常,但在IOS中我有慢和慢的性能。IOS Xamarin - 实时剧情画线

我认为这个问题是由于我缺乏的ios专业..

我做了两次试验都失败了,有人有一个解决方案,以加快?

试验A

我打电话剧情然后分配的UIImage wBitmap作为MyView的研究背景每< 10ms的

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

我打电话剧情然后分配的UIImage wBitmap作为MyView的研究背景每< 10ms

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(); 
} 
+0

为什么每10ms需要调用一次?似乎过度杀伤。 – bbarnhart

+0

是的心电图程序实时发送每2ms一个样本(x,y坐标)我可以丢弃5个样本进行抽取,绘图过程每隔10ms创建一个新点。在Galaxy Tab 3 Android和Windows上,Samsung ATIV完美地工作。 –

回答

2

您不需要首先绘制位图,然后在视图中使用该位图。正确的做法是继承UIView,然后重写Draw()方法并在那里绘制你的东西。

然后,您可以在视图上调用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或Xamarin组件商店TeeChart可用。 TeeChart甚至可以跨平台,所以你不必担心Android与iOS。