• 0
zloid

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

Вопрос

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

 

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

 

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

 

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

 

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

 

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

 

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

 

Спасибо.

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


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

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

  • 0

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;
Brovin Yaroslav и zloid понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

дома проверю на планшете

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


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

 

вот видео

вот текст









 

 

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

 

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

 

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

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

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

 

 

 

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

bCrijgLYHPM.jpg

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

 

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

Изменено пользователем zloid

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


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

нужно отметить, что показанное разрешение - виртуальное

экран там 5.5" 1280*720

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


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

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

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


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

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

Нет, ONDA Vi40

ARM Cortex-A8, Allwinner A10 1GHz

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

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


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

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

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


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

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

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

 

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

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


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

запустил на Ritmix RMD-1040 2*1600 1Gb (985*690)

ни малейшего торможения

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


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

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

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

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

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


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

Войти

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


Войти сейчас

  • Сейчас на странице   0 пользователей

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