Проблемы производительности Xamarin.Mac PdfView - PullRequest
0 голосов
/ 16 октября 2019

Я создаю приложение для визуализации некоторых экспериментальных данных (x, y графики с несколькими сериями), где основная цель заключается в создании PDF-файла, который соответствует правилам научной публикации. Генерация PDF работает хорошо, и я также могу отобразить PDF в PdfKit PdfView. Однако, когда я пытаюсь показать большие файлы PDF в приложении (ряд данных с большим количеством точек (как в 20000)), некоторый фоновый поток потратит минуты (3-4) на генерацию какой-то кешированной версии, которую PdfView использует дляболее быстрое рендеринг с увеличением.

Я могу обойти эту проблему, установив PdfView.Document в виде пустого документа PDF, а затем добавив страницу. PdfView будет кешировать пустую страницу, но я не буду тратить минуты на 100% загрузку процессора, пытаясь сгенерировать кэшированную версию. Однако это породило еще одну проблему: если кэшированная версия отсутствует, операция масштабирования будет менее приятной, чем требуется.

Кроме того, у меня есть несколько ползунков, которые влияют на результат в формате PDF и требуют очень быстрых обновлений. из отображенного PDF.

Есть ли лучший способ отображения PDF-файлов (данных)? Было бы лучше, если бы метод позволял увеличивать масштаб документа.

Очень медленно для больших PDF-файлов:

PDFPlotView.Document = pdf;

Быстрая, но не кэшированная версия:

PDFPlotView.Document = new PdfDocument();

PDFPlotView.Document.InsertPage(pdf.GetPage(0), 0);

Я также попытался сгенерировать изображение с низким разрешением изpdf, а затем пытается использовать это изображение для генерации кэша, но, похоже, существует известная ошибка, из-за которой pdf становится пустым:

using (var context = new CGBitmapContext(null, (int)rect.Width, (int)rect.Height, 8, 0, CGColorSpace.CreateDeviceRGB(), CGBitmapFlags.NoneSkipLast)
{
    InterpolationQuality = CGInterpolationQuality.None
})
{
    context.SetFillColor(new CGColor(1, 1, 1, 1));
    context.FillRect(rect);
    context.ScaleCTM(1, 1);
    context.DrawPDFPage(pdf.Document.GetPage(0));
    img = context.ToImage();
}

PdfDocument lowrespdf = new PdfDocument();
NSImage cache = new NSImage(img, rect.Size);
PdfPage page = new PdfPage(cache);

lowrespdf.InsertPage(page, 0);

Example pdf file screenshot. The plot contains 25000 data points.

[ОБНОВЛЕНИЕ] Проблема производительности, по-видимому, связана не с количеством точек данных, а с длиной одного пути в файле PDF. Разделение проблемного ряда данных по новым строкам на каждую 1000 точек данных приводит к увеличению времени кеширования в несколько секунд (макс.) По сравнению с несколькими минутами для линии точек данных 25000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...