• 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 

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

AlexG понравилось это

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


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

Спасибо за развернутый ответ!

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: 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
      Кто-нибудь делал картинку, которая преобразуется в круглую?
    • Автор: Dozent
      Добрый день. Столкнулся с проблемой правильного отображения. есть картинка.
      Которая должна вращаться по принципу часовой стрелки, но при изменении свойства RotationAnge происходит смещение  стрелки от своего центра вокруг которого она должна вращаться. Как правильно поворачивать стрелку?


    • Автор: gdm_it
      Здравствуйте, решил написать клиента для своего сайта, делпхи не открывал 15 лет без шуток, перешел в веб разработку,  а сейчас все возвращается на свои места как говориться
       
      так вот меня интересует теоретический набросок  использования элементов форм
       
       
      схема типичная:   слева скрытый список  MultiView1, справа рабочая область
       
      вот о рабочей области и вопрос
       
      я выбираю в меню MultiView1 СТАТЬИ(1 пункт), слева должен появиться список свежих статей, внизу панель (добавить), жмем на добавить и открывается форма добавления статьи.
       
      как это лучше реализовать?
       
      например: 
      1. накидать на каждый пункт меню панель и в них разместить свои элементы форм
      2. нагромоздить несколько форм и их подключать как то
      3. ваш вариант
       
      задача то плевая опыта пока нет 
    • Автор: sulion
      Подскажите пожалуйста, как выровнять рисунок - хотелось бы, чтобы прямоугольный спрайт увеличивался в размерах, оставаясь по центру.
       
      Попробовал всё что очевидно, и снова пришёл за советом.
      4.7z
    • Автор: sulion
      Здравствуйте!
       
      Очень нравится FireMonkey, спасибо за отличный продукт.
       
      Помогите пожалуйста вот с каким моментом: как программно поменять размер изображения TImage ?
       
      ...
      Character.Bitmap.LoadFromFile( i.m[ be, bi ].g ); {спрайтик}
      Character.Position.X := ( Hall.Width - Character.Width ) / 2; {стоим посредине}
      Character.Position.Y := ( Hall.Height - Character.Height); {стоим на полу}
      Character.Width := PC.Width * PC.Scale;
      Character.Height := PC.Height * PC.Scale;
      ...
       
      Проблема: вместо того чтобы отведав пирожка расти стоя на полу, персонаж не меняется в размере.
       
      Это - кусочек кода, который по таймеру 10 раз в секунду отрисовывает персонажа. Топорно, без всяких оптимизаций (моя первая проба после TAnimationXXX). Вообще, скорость FireMonkey впечатляет - спрайт ростом с 3/4 экрана с лёгкостью меняется без морганий на очень слабом компьютере, и тики с относительно "тяжёлой" математикой не "наползают" друг на друга по времени.
       
      Объект PC - это персонаж, там хранятся вещмешок, умения, способности и пара полей для графики (масштаб PC.Scale и размеры в метрах PC.Height, PC.Width ).
      Форма запускается в полноэкранном режиме, на ней лежит TScaledLayout растянутый Align=Client на весь экран, внутри него - фоновый рисунок Hall, персонаж Character и класс-библиотека спрайтов, имена файлов рисунков доступны как i.m[].g
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу