IOS Xamarin — линии рисования графика в реальном времени

Я работаю над проектом перекрестного тестирования для отображения графика ЭКГ в реальном времени. он отлично работает на Windows и Android с использованием Xamarin, НО в IOS у меня медленная и медленная производительность.

Я думаю, что проблема связана с отсутствием у меня опыта в ios.

Я сделал два теста, оба провалились, у кого-то есть решения для ускорения?

ТЕСТ А

Я вызываю Plot, а затем назначаю UIImage wBitmap как MyView Backgroud каждые ‹ 10 мс.

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

ТЕСТ Б

Я вызываю Plot, а затем назначаю UIImage wBitmap как MyView Backgroud каждые ‹ 10 мс.

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

person Andrea Falappi - Polipo    schedule 17.02.2014    source источник
comment
Почему вы должны вызывать это каждые 10 мс? Кажется, перебор.   -  person bbarnhart    schedule 17.02.2014
comment
Да, программа ЭКГ в реальном времени отправляет образец каждые 2 мс (координаты x, y). Я могу отбросить 5 образцов для прореживания, процесс рисования создает новую точку каждые 10 мс. На Galaxy Tab 3 Android и Windows Samsung ATIV работает отлично.   -  person Andrea Falappi - Polipo    schedule 17.02.2014


Ответы (1)


Вам не нужно сначала рисовать в растровое изображение, а затем использовать это растровое изображение в представлении. Правильный подход к этому состоит в том, чтобы создать подкласс 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 или TeeChart доступен в магазине компонентов Xamarin. TeeChart будет даже кроссплатформенным, так что вам не придется беспокоиться о Android и iOS.

person Krumelur    schedule 17.02.2014