2014-02-17 78 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。