Перейти к содержанию
Fire Monkey от А до Я
  • 0

Медленно перемещаются контролы на Android


zloid

Вопрос

Здравствуйте.

 

Пишу приложение на Delphi XE8. Суть его в том, чтобы показывать на экране некие данные, присылаемые по сети. Данные очень простые: короткие тексты разных цветов в разных частях экрана. При этом эти тексты должны иногда перемещаться туда-сюда. Этакий информер.

 

Я использовал компонент TText для вывода. Больше на форме ничего нет, только с десяток этих TText'ов, которые в основном ничего не делают, но по команде перемещаются.

 

Приложение простое и прекрасно работает. Нет, не прекрасно: если в windows всё плавно, на android-телефоне плавно, то на Android-планшете заметны неприятные подтормаживания: элементы двгаются с заметными рывками, иногда случается общий лаг на долю секунды.

 

Пробовал вместо TText'ов кинуть на форму TPaintBox и выводить на Canvas тексты вручную. Не заметил прироста скорости.

 

Помогите. ) Подскажите метод, которым на Android можно быстро выводить простую графику. Желательно пример исходного кода, чтобы я сразу его запустил и сказал "ага, действительно плавно", а там уж я адаптирую свой проект.

 

Просто обидно: всё работает - база, сервер, логика на клиенте, но вот показать пользователю симпатично не выходит, сразу бросается в глаза, что приложение "тормозит".

 

Спасибо.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Может поможет настройка рендеринга приложения, при использовании у меня скорость анимацию увеличивается, а качество изображения незаметно, где то на форуме было:

procedure RenderingSetupCallback(const Sender, Context: TObject; var ColorBits, DepthBits: Integer; var Stencil: Boolean; var Multisamples: Integer); 
begin
  ColorBits := 16; // default is 24
  DepthBits := 0; // default is 24
  Stencil := false; // default is True
  Multisamples := 0; // default depends on TForm.Quality or TForm3D.Multisample
end;

И прописать в событии FormCreate

procedure TForm_main.FormCreate(Sender: TObject); var SetupService: IFMXRenderingSetupService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXRenderingSetupService, IInterface(SetupService))
    then SetupService.Subscribe(RenderingSetupCallback);
end;
Ссылка на комментарий
  • 0

Хоть код покажите - как реализовано перемещение.

На форме таймер лежит с Interval=60 (пробовал разные значения), который делает так:

Self.BeginUpdate;
Тут я перебираю все TText'ы, которые хранятся в TList и изменяю плавно их координаты
Self.EndUpdate;

Пробовал вместо таймера приделывать к ним компонент TFloatAnimation - не быстрее.

 

 

Ну и про Canvas тоже рассказывал. В таймере говорил

PaintBox.Repaint; 

А в методе Draw() у ПаинтБокса делал так:

Canvas.BeginScene;
Отрисовываю в цикле все тексты при помощи FillText
Canvas.EndScene;

...

Спасибо. Не знал о таком. Нашёл то же самое в справке:

http://docwiki.embarcadero.com/RADStudio/XE6/en/Overriding_OpenGL_Rendering_Parameters

Но не помогло. TText'ы ведут себя всё так же - иногда подлагивают.

 

В Вашем случае добавление RenderingSetupCallback само по себе лекарство, или Вы как-то по-другому выводите графику на экран? Тоже пользуетесь FMX-компонентами или "рендерите" графику на канву?

Ссылка на комментарий
  • 0

Чтобы было понятнее о каких лагах речь, создал мини-приложение, на форме которого всего четыре TText, они движутся по кругу (квадрату, конечно). Код привожу в конце под спойлером.

 

https://www.youtube.com/watch?v=UQSS-BeXSAA

 

На этом видео я последовательно снимаю работу приложения в Windows, в симуляторе IOS и на Android-планшете. В первых двух случаях элементы движутся плавно, а на планшете заметны регулярные рывки. На Android-телефоне, кстати, всё работает плавно (снять не могу, но поверьте на слово).

 



const
SPEED = 10;
MARGIN = 20;

procedure RenderingSetupCallback(const Sender, Context: TObject;
var ColorBits, DepthBits: Integer; var Stencil: Boolean;
var Multisamples: Integer);
begin
// Override OpenGL rendering setup to use custom values.
ColorBits := 16; // default is 24
DepthBits := 0; // default is 24
Stencil := False; // default is True
Multisamples := 0; // default depends on TForm.Quality or TForm3D.Multisample
end;

procedure RegisterRenderingSetup;
var
SetupService: IFMXRenderingSetupService;
begin
if TPlatformServices.Current.SupportsPlatformService
(IFMXRenderingSetupService, IInterface(SetupService)) then
SetupService.Subscribe(RenderingSetupCallback);
// There is also SetupService.Unsubscribe, which removes the hook.
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
I: Integer;
T: TText;
begin
for I := 1 to 4 do
begin
T := TText(Self.FindComponent('Text' + inttostr(I)));

if T.Tag = 1 then
begin
T.Position.X := T.Position.X + SPEED;
if T.Width + T.Position.X + MARGIN >= Self.Width then
begin
T.Tag := 2;
Continue;
end;
end;

if T.Tag = 2 then
begin
T.Position.Y := T.Position.Y + SPEED;
if T.Height + T.Position.Y + MARGIN >= Self.Height then
begin
T.Tag := 3;
Continue;
end;
end;

if T.Tag = 3 then
begin
T.Position.X := T.Position.X - SPEED;
if T.Position.X - MARGIN <= 0 then
begin
T.Tag := 4;
Continue;
end;
end;

if T.Tag = 4 then
begin
T.Position.Y := T.Position.Y - SPEED;
if T.Position.Y - MARGIN <= 0 then
begin
T.Tag := 1;
Continue;
end;
end;
end;

end;

initialization

RegisterRenderingSetup;

end.
Ссылка на комментарий
  • 0

вот видео

вот текст

var
  Form1: TForm1;


implementation


{$R *.fmx}
const
SPEED = 10;
MARGIN = 20;


procedure TForm1.FormResize(Sender: TObject);
begin
  lbl1.Text := Format('%d x %d',[width, height]);
end;


procedure TForm1.FormShow(Sender: TObject);
begin
  txt1.Position.Point := PointF(margin,MARGIN);
  txt2.Position.Point := pointf(width - margin - txt2.Width, MARGIN);
  txt3.Position.Point := pointf(width - margin - txt3.Width, height - margin - txt3.Height);
  txt4.Position.Point := pointf(margin, height - margin - txt4.Height);


  txt1.Tag := 1;
  txt2.Tag := 2;
  txt3.Tag := 3;
  txt4.Tag := 4;
end;


procedure TForm1.MoveText(t: TText);
begin
  case t.Tag of
    1:begin
      t.Position.X := t.Position.X + SPEED;
      if t.Width + t.Position.X + MARGIN >= Width then
        t.Tag := 2;
    end;
    2:begin
      t.Position.Y := t.Position.Y + SPEED;
      if t.Height + t.Position.Y + MARGIN >= Height then
        t.Tag := 3;
    end;
    3:begin
      t.Position.X := t.Position.X - SPEED;
      if t.Position.X - MARGIN <= 0 then
        t.Tag := 4;
    end;
    4:begin
      t.Position.Y := t.Position.Y - SPEED;
      if t.Position.Y - MARGIN <= 0 then
        t.Tag := 1;
    end;
  end;
//  t.Text := t.Name + ' ' + Format('%d x %d',[round(t.Position.x), Round(t.Position.y)]);
end;


procedure TForm1.tmr1Timer(Sender: TObject);
begin
  MoveText(txt1);
  MoveText(txt2);
  MoveText(txt3);
  MoveText(txt4);
end;


end.
Ссылка на комментарий
  • 0
  • Модераторы

протестировал на Huawei MediaPad 10, все прекрасно двигается никаких зависании

только я исправил Width -> ClientWidth и Height -> ClientHeight

Ссылка на комментарий
  • 0

 

вот видео

вот текст









 

 

Ваш код на моём планшете (ONDA, разрешение 1024x768) не дал прироста в скорости, элементы всё так же впадают в транс.

 

Хотел уж было подвести печальный итог, что FMX тормозит на разрешениях выше 360х615, как в Вашем видео, но

 

протестировал на Huawei MediaPad 10, все прекрасно двигается никаких зависании

только я исправил Width -> ClientWidth и Height -> ClientHeight

Обнадёжило, у MediaPad разрешение ещё выше. Может быть у меня просто слабый планшет.

 

 

 

Забыл сказать: я скидываю галочку

bCrijgLYHPM.jpg

Иначе планшет просто выдаёт огромное сообщение, что приложение не поддерживает данное устройство.

 

UPD: наше тестовое приложение с летающими TTExt работает и с галочкой, но скорость такая же. Но для любого другого приложения сложнее HelloWorld, галочку надо скидывать.

Изменено пользователем zloid
Ссылка на комментарий
  • 0

так у тебя тестовый планшет на интеле что ли? 

Нет, ONDA Vi40

ARM Cortex-A8, Allwinner A10 1GHz

Если Ваш ответ к моему примечанию о том, что я скидываю галку, то я обновил своё сообщение. С галочкой всё проседает точно так же.

Ссылка на комментарий
  • 0

слабоват планшет. я на таком проце покупал по моему года три назад. попробуй на другом планшете. сейчас идут как минимум двух ядерные. 

Хорошо, спишу всё на высокие требования Delphi+FMX и слабость планшета, хотя всякие игрушки на нём идут, а там не просто четыре квадратика выводятся.

 

Спасибо всем за ответы. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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