Sulphide
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Я понимаю, что занимаюсь фигней, но в данном случае мне интересны возможности Skia =)))) Вот тут рисуется один и тот же текст в одно и то же место, только сначала обводка в толщину 3 пикселя, а потом и сам текст. Красный текст с черной обводкой. Да не по середине, но это уже другая проблема. MeasureText у Skia есть, так что на самом деле не проблема. Работает быстро, 3мс у меня для 4k. И 4-5мс на андроиде, причем это полностью, а не только копирование бмпшки. Вернее без принудительного копирования бмпшки оно работает прекрасно. Вернее тут и не надо даже копировать бмпшку, работает сразу с бмпшкой внутри image1. Главное не забыть прописать: GlobalUseSkia := True; GlobalUseSkiaRasterWhenAvailable := false; А почему рендер в битмап вообще?)) Почему не прям на канву формы? Хотя тут в принципе понятно, ибо обновлять надо независимо от отрисовки формы... Хотя опять же можно в потоке только вызывать метод Paint формы и сам метод перехватить, ну ок хозяин - барин)) И на самом деле я бы отказался от анонимных потоков, ибо перед закрытием приложения, все же лучше завершить поток и подождать завершения потока... в случае с анонимными такое нереально. Код: procedure testpaint; var fStopWatch: TStopwatch; WorkTime: Int64; bmp: TBitmap; clientScreenScale: Double; clientScreenSize: TSize; clientScreenService: IFMXScreenService; LFont1: ISkFont; LPaint1: ISkPaint; LPaint2: ISkPaint; LTypeface: ISkTypeface; begin if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(clientScreenService)) then begin clientScreenScale := clientScreenService.GetScreenScale; end else clientScreenScale := 1; clientScreenSize.CX := Round(clientScreenService.GetScreenSize.X * clientScreenScale); clientScreenSize.CY := Round(clientScreenService.GetScreenSize.Y * clientScreenScale); bmp := TBitmap.Create; bmp.SetSize(clientScreenSize); bmp.Canvas.Fill.Color := TAlphaColorRec.Cyan; testForm.Image1.Bitmap.Assign(bmp); // LTypeface := TSkTypeface.MakeFromName('Monospace', TSkFontStyle.Normal); LTypeface := TSkTypeface.MakeDefault; LFont1 := TSkFont.Create(LTypeface, 100, 1); LFont1.Edging := TSkFontEdging.AntiAlias; LPaint1 := TSkPaint.Create(TSkPaintStyle.Fill); LPaint1.AntiAlias := True; LPaint1.SetARGB($FF, $FF, $00, $00); LPaint2 := TSkPaint.Create(TSkPaintStyle.Stroke); LPaint2.AntiAlias := True; LPaint2.SetARGB($FF, $00, $00, $00); LPaint2.StrokeWidth := 3; while True do begin // засекаем время fStopWatch := TStopwatch.StartNew; TThread.Synchronize(nil, procedure begin testForm.Image1.Bitmap.SkiaDraw( procedure(const ACanvas: ISkCanvas) begin ACanvas.Clear(TAlphaColor($FF00FFFF)); //Cyan ACanvas.DrawSimpleText(TimeToStr(time) + ' ms: ' + IntToStr(WorkTime), 0, 300, LFont1, LPaint1); ACanvas.DrawSimpleText(TimeToStr(time) + ' ms: ' + IntToStr(WorkTime), 0, 300, LFont1, LPaint2); end); end); fStopWatch.Stop; WorkTime := fStopWatch.ElapsedMilliseconds; sleep(1); // чтобы не грузить одно ядро на 100% end; bmp.Free; end; |
| Всего записей: 277 | Зарегистр. 20-03-2008 | Отправлено: 04:45 21-04-2023 | Исправлено: Sulphide, 07:19 21-04-2023 |
|