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.