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

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.

Другие вопросы по тегам