• 0
AlexG

Скорость обновления окна программы

Вопросы

Возник следующий вопрос:

Допустим есть "сложная" форма, внешний вид которой должен быть нестандартным и на которой расположено N-ное количество компонент (исходим из того, что их много, некоторые из них - динамические, например - вывод видео с камеры).
"Нестандартный вид" подразумевает: наличие тени у формы, измененный внешний вид, отличный от вида по умолчанию в любой ОС.

Непосредственно вопрос звучит так.
Какая из двух следующих реализаций будет работать быстрее (отрисовка/обновление этой формы при обновлении компонент: текста, списков, вывод видео и т.д.):

Оба вида форм предопределяются в стиле.

ВАРИАНТ 1.
- Тень формы реализована в виде компонента TImage с подгруженным PNG изображением.
- Контур формы реализован компонентом TRectangle с "окантовкой" и заливкой прямоугольника заданным цветом (все без градиентов)
- Шапка формы реализована вторым прямоугольником TRectangle без "окантовки", но с заливкой другим цветом (без градиента)

ВАРИАНТ 2. Вся форма задана одним объектом TStyleObject в котором в качестве свойств установлены:
- SourceLookup - ссылка на PNG-изображение в данном стиле
- SourceLink - создан TBitmapLink, у которого заданы свойства CapInsets и SourceRect

Внешний вид у них будет практически одинаковый (хотя во втором случае он будет более корректным на любой ОС и при использовании любой видео-карты, чего не скажешь о первом варианте).
Однако, интересует именно СКОРОСТЬ отрисовки в обеих случаях!
Интересует именно теория, с точки зрения реализации самой FMX.

З.Ы. Предполагаю, что вопрос больше к разработчикам FMX, но возможно у кого-то уже есть опыт работы с подобными задачами...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

  • 0

Во первых все зависит от размеров формы

Во вторых тень сделанная с помощью PNG работает быстрей, чем тень отрисованная эффектами FMX

В третьих чисто теоретически работа со стилями, тем более 9.png, будет кушать больше ресурсов чем залить область через FillRect 

Я бы реализовывал первым вариантом (более гибкий и простой в реализации)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Tumaso
      Столкнулся со следующей проблемой - TImage игнорирует установленные значения XRadius и YRadius у TRectangle (10.1 Berlin with update 2)
       
      Суть - мне необходимо, чтобы у TRectangle углы были немного скругленные, для этого я устанавливаю XRadius и YRadius. Внутри TRectangle расположен TImage (левый верхний угол 0,0, ширина и высота совпадают с размерами TRectangle). Когда я загружаю картинку в TImage (что в дизайнере, что программно), получается что TImage отображается с прямыми углами, игнорируя XRadius и YRadius своего родителя. Свойство ClipChildren у TRectangle установлен.
      Как сделать так, чтобы TImage скруглялся по углам? Что интересно, TCircle в этом плане работает, обрезая TImage.
    • От Роман Фил
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
    • От Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • От denprox
      Доброго времени суток! Подскажите, как узнать оригинальный размер картинки, загруженной в TImage ?
    • От Genesis
      Здравствуйте , скажите пожалуйста , можно ли  на ПК преобразовать  страницу или фрагмент в формате doc в изображение в формате png, желательно без использования платных компонентов. Спасибо
    • От Satellite
      Возможно ли вывести 9-patch в Timage? Если нет, то куда можно импортировать изображение такого формата? 
    • От umkes
      Добрый день, возникла проблема при работе с TImage;
      У меня компонент TImage - imgRing и есть в TImageList. 
      Я динамически формирую Bitmap из копий картинки из TImageList и асайню его в TImage. На Windows все работает прекрасно, а на андроиде картинка все время пустая... Может кто-то подскажет, где я не прав
      //============================================================================== procedure TMainForm.DrawRing; //------------------------------------------------------------------------------ var bmp1, bmp2 : TBitmap; i : integer; str : TMemoryStream; begin bmp2 := TBitmap.Create; bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Items[0].Bitmap); bmp1 := TBitmap.Create; bmp1.Assign(bmp2); bmp1.Width := ClientWidth + bmp2.Width * 10; i := 0; bmp1.Canvas.BeginScene(); while (i * bmp2.Width) < bmp1.Width do begin bmp1.Canvas.DrawBitmap(bmp2, RectF(0, 0, bmp2.Width, bmp2.Height), RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height), 1 ); inc(i); end{ while }; bmp1.Canvas.EndScene; str := TMemoryStream.Create; bmp1.SaveToStream(str); str.Position := 0; imgRing.BeginUpdate; imgRing.Bitmap.CreateFromStream(str); imgRing.EndUpdate; end{ procedure TMainForm.DrawRings }; Делаю такое потому-что TImage.WrapMode.Tile не подходит для моей задачи.
    • От Евгений Корепов
      На незначительном количестве устройств, менее 0,1%, получаю ошибку "Bitmap size too big" при AImage.Bitmap.LoadFromStream(AMemoryStream). Подозреваю что ошибка происходит на слабых устройствах. Картинка 250х250 png. Код выполняется в основном потоке (в интернетах были упоминания что глючит эта операция в отдельном потоке на каких то версиях Delphi).
      Как предотвратить подобное? Можно как то определить максимальный размер картинки для текущего устройства? Или может дело не в свободной памяти, а в чем то еще?
    • От kuldiegor
      Всем доброго времени суток! Обнаружил проблему, связанную с загрузкой изображения в TImage.
      Если загружать изображения с хард диска очень быстро, то как будто TImage не поспевает и вываливает access violation. Delphi xe7 Fire Monkey 64 bit Windows.
      val:=round(360*value/max); //узнаём какова часть байт в градусах improgressbar.Bitmap.LoadFromFile(ExtractFilePath(paramstr(0))+'Pictures\ProgressBar\'+inttostr(val)+'.png');  labprogressbar.Text:=strtool.intbytetostr(value,1)+'Б'+#$D#$A+'/'+#$D#$A+strtool.intbytetostr(max,1)+'Б'; Application.ProcessMessages; 
    • От ivadimos
      Кто-нибудь делал картинку, которая преобразуется в круглую?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу