Перейти к содержанию
  • Регистрация
  • 0
Rokweb

Тормозит выполнение таймера

Вопрос

Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации TFloatAnimation в Tokyo. У всех так или только у меня?

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

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


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

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

  • 0

Токио сам по себе довольно глючный, особенно до обновления 10.2.3 там и без таймера баги с анимацией, эффектам и низким FPS на ровном месте, в этом случае лучше Берлин использовать (что я и делаю под Android и iOS (Xcode 9 btw) ).

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

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


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

Выше правильно написали о глюках в Tokyo под Android. 

Также учтите, что событие таймера, также как и анимации, обрабатываются в главном потоке. При этом вы задали достаточно маленький интервал для таймера. Поэтому, лучше перенести действия над визуальными компонентами за пределы таймера (если они там есть), а сам таймер сделать на основе потоков.

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


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

трудно придумать что-то, что может успеть выполниться менее чем за 1 мсек на десктопе, а на мобильном и подавно

так что вы немного остудите жар-то ))

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 4 апреля 2018 г. в 20:06, ENERGY сказал:

Токио сам по себе довольно глючный, особенно до обновления 10.2.3

Есть смысл переходить с 10.2.2 на 10.2.3? Народ тут писал, что студия вылетать стала на ровном месте. А судя по чейнж логу ни одного серьёзного бага поправлено не было.

В 4 апреля 2018 г. в 19:18, Rokweb сказал:

Таймер с интервалом 1мс заметно подтормаживает во время выполнения анимации

Во-первых интервал в 1мс для таймера не достижим без специальной настройки ОС. Реально события будут приходить 10-23мс. И это при условии, что программа больше ничего не делает. Это не зависит от дельфи, а зависит от винды.

Во-вторых "накладные расходы" таймера при таком обновлении - это основная статья расходов процессора. И вообще так писать - это просто жесть. Любая анимация - это 1000/60мс т.е. частота обновления среднестатистического монитора. И то лучше 1000/30 или 1000/25. Меньше плавности на чуть, зато будет реально работать. Если нужна не анимация, а рассчёт чего-то - это надо выносить в отдельный поток.

Если речь идёт про андроид/яось, то кроме нескольких деталей в целом ситуация не меняется. Писать так нельзя.
 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Akad сказал:

Есть смысл переходить с 10.2.2 на 10.2.3? Народ тут писал, что студия вылетать стала на ровном месте. А судя по чейнж логу ни одного серьёзного бага поправлено не было.

Во-первых интервал в 1мс для таймера не достижим без специальной настройки ОС. Реально события будут приходить 10-23мс. И это при условии, что программа больше ничего не делает. Это не зависит от дельфи, а зависит от винды.

Во-вторых "накладные расходы" таймера при таком обновлении - это основная статья расходов процессора. И вообще так писать - это просто жесть. Любая анимация - это 1000/60мс т.е. частота обновления среднестатистического монитора. И то лучше 1000/30 или 1000/25. Меньше плавности на чуть, зато будет реально работать. Если нужна не анимация, а рассчёт чего-то - это надо выносить в отдельный поток.

Если речь идёт про андроид/яось, то кроме нескольких деталей в целом ситуация не меняется. Писать так нельзя.
 

Можно бесконечно много рассуждать, тем не менее, констатирую факт - вернулся на Berlin - все стало работать идеально (включаю анимацию без тормозов таймера). Вам стоило убедиться, о чем вы пишите и куда, в теме указано, что речь идёт про Android. Не говоря уже про бред со "специальной настройкой ОС". Стандартный (!) таймер студии НИКОГДА не будет работать с ДЕЙСТВИТЕЛЬНЫМ интервалом в 1 МС. Это всем и так понятно. Не говоря уже про фантастические "10-23 мс". Почему именно 23, а не 24? Почему 10, а не 9? Интервал я указывал для общего понимания необходимой скорости работы.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
24 минуты назад, Rokweb сказал:

Вам стоило убедиться, о чем вы пишите и куда, в теме указано, что речь идёт про Android.

Ни где это не указано. Не надо. Тема в общем форуме, ни в названии, ни в теле поста этого нет. Не умеешь задавать вопросы, не надо тра-ля-ля разводить.

24 минуты назад, Rokweb сказал:

Почему именно 23, а не 24? Почему 10, а не 9?

Не ко мне вопрос, а к разработчикам ОС.

24 минуты назад, Rokweb сказал:

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

Если у тебя не правильно организована работа твоей поделки, то ни кто кроме тебя в этом не виноват. Не хочешь помощи - что ты вообще на форуме забыл? Иди на какую-нибудь помойку типа хабра, описывай там как надо софт писать.



 

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Akad сказал:

Ни где это не указано. Не надо. Тема в общем форуме, ни в названии, ни в теле поста этого нет. Не умеешь задавать вопросы, не надо тра-ля-ля разводить.

Прикрепил скриншот.

 

4 часа назад, Akad сказал:

Не ко мне вопрос, а к разработчикам ОС.

Можно увидеть пруф?

 

4 часа назад, Akad сказал:

Если у тебя не правильно организована работа твоей поделки, то ни кто кроме тебя в этом не виноват. Не хочешь помощи - что ты вообще на форуме забыл? Иди на какую-нибудь помойку типа хабра, описывай там как надо софт писать.

Не ты, а вы. Не видя проекта делать подобные выводы... Вы родственник Мессинга? Выпейте валерьянки и не разводите срач на форуме.

 

3 часа назад, POV сказал:

1 мс == 1000 Гц

Автор реально жаждет 1000 fps? )))))

Да дело то не в FPS. Я даже уточнил вопросом - "такое только у меня или у всех". Повторюсь - в Tokyo (лично у меня) - во время выполнения анимации (OnProcess) TFloatAnimation - TTimer приостанавливает свою работу, повторный (и все дальнейшие вызовы) OnTimer вызываются после OnFinish у TFloatAnimation.

Безымянный.jpg

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


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

услышьте plz. в токио перешли на "правильную" работу в едином потоке с Java. Вообще это хорошо. Но вся FMX писалась в расчете на старую модель. А теперь те фишки не работают )))

когда поменяют - ХЗ

поэтому универсальный ответ - смотрите как это сделано в исходниках, например у TAnimation там все понятно. ProcessMessages точно не будет работать больше. Наконец-то г"внокод умрет. Аллилуйя.

Чтобы ответить на вопрос, как часто может быть вызван таймер, надо не срач на форуме устраивать а просто попробовать. И станет ясно, что 1000 fps не получить. И 100. Возможно, при попутном ветре, 10.

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


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

На винде много примеров реализации таймеров, выдающих дискретность 1 мс. Навскидку - у либы с glscene.org есть подобный таймер, банально сделан через отдельный поток, так что можно обойтись без тюнинга ОС

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 04.04.2018 в 19:18, Rokweb сказал:

Таймер с интервалом 1мс заметно подтормаживает

Ни одна операционная система (за исключением систем реального времени) не обеспечит вам такую точность. Среда разработки здесь ни при чем. Совсем.

К примеру, на Windows минимально возможный интервал таймера, емнип, 55мс.

При этом нужно понимать, что событие таймера сработает только тогда, когда главный поток не будет ничем занят. А это, поверьте, случается достаточно редко. Грубо говоря - событие отработает "по остаточному принципу".  Т.е. в реальности даже 55мс на Windows будет обеспечено далеко не всегда. Что уж говорить про мобильные платформы.

Вам нужно пересмотреть алгоритм работы.

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Tumaso сказал:

Навскидку - у либы с glscene.org есть подобный таймер, банально сделан через отдельный поток

Графические движки не пользуются таймерами, это чревато гигантскими лагами.
QueryPerfomanceCounter и т.п.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 минут назад, kami сказал:

55мс.

16-18

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, krapotkin сказал:

16-18

Не, оказывается я ошибся еще больше. Чтобы окончательно выяснить - залез на https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms644906(v=vs.85).aspx

USER_TIMER_MINIMUM (0x0000000A), -  минимально возможный интервал = 10мс. Но это недостижимый идеал :)))

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


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

я практик. ))) если запустить GetTickCount то он стабильно дает сначала 0, потом 16 мсек )))

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


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

Если очень хочется. то на Андроид можно использовать posix таймеры. Там среди все вариантов, есть довольно точные. Но в любом случае, как вам уже сказали, вы не получите большую точность от них.

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


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

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

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

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

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

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

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

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

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


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

    • От Yarpda
      В серьезных приложениях (Сбербанк-онлайн или Ютюб и т.п.) когда выходят обновления с новыми функциими, они запускают своеобразный интерактивный ролик. Когда экран затемняется и остается не затемненным только новый элемент экрана например, а на затемненном фоне описывается что делает этот новый элемент.Потом все это плавно переходит к другому элементу и т.д. Выглядит все довольно красиво.
      Задался вопросом, как сделать что-то подобное под FMX. Для себя не нахожу никаких очевидных решений.
      Подскажите если кто знает, направления решения этой задачи?
      Заранее спасибо.
    • От RADStudioDeveloper
      Привет всем!
      Есть необходимость в проекте для Android Delphi FMX (RAD Studio 10.2.3 Tokyo / RAD Studio 10.3.1 Rio ) сохранять изображения с фотокамеры смартфона Android через WiFi соединение в удалённую базу данных Microsoft SQL сервера в поле BLOB.
       
      Подскажите, пожалуйста,  возможные решения, примеры Delphi кода и требуемые компоненты для работы с камерой и SQL сервером через WiFi на Android устройствах.
    • От Евгений Корепов
      Простое приложение для андроид - форма, на ней TWebBrowser. В WebBrowser открываем что то требующее разрешение на геолокацию. У примеру https://www.openstreetmap.org 
      В обычном браузере, при тыке на "Показать мое местоположение" появится popup окно с запросом разрешения на "Доступ к данным о вашем местоположении".
      Но в Delphi приложении описанном выше никакого запроса не приходит. ?
      Нашел решение для java https://forums.fusetools.com/t/geolocation-not-enabled-in-webview-on-android/1374 
      В функцию создания WebView 
      public static Object CreateWebView321(final boolean zoomEnabled,final boolean scrollEnabled) { ScrollableWebView wv = new ScrollableWebView(com.fuse.Activity.getRootActivity()); wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setUseWideViewPort(true); //enabled viewport meta tag wv.getSettings().setLoadWithOverviewMode(true); //mimic iOS Safari and Android Chrome wv.getSettings().setSupportZoom(zoomEnabled); wv.getSettings().setBuiltInZoomControls(zoomEnabled); wv.getSettings().setDomStorageEnabled(true); wv.setAllowScroll(scrollEnabled); return wv; } рекомендуется добавить следующий код
      wv.getSettings().setGeolocationEnabled(true); wv.setWebChromeClient(new WebChromeClient(){ @Override public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) { callback.invoke(origin, true, false); } }); В модуле FMX.WebBrowser.Android.pas это выглядит так
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end; Вот суть вопроса - добавить delphi код. Пробую что то вот такое, но закончить ума не хватает
      constructor TAndroidWebBrowserService.Create; var LayoutParams: JRelativeLayout_LayoutParams; begin FWebView := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FWebView.getSettings.setJavaScriptEnabled(True); FListener := TWebBrowserListener.Create(Self); FWebView.SetWebViewListener(FListener); FFocusChangeListener := TFocusChangeListener.Create(Self); FWebView.setOnFocusChangeListener(FFocusChangeListener); FWebView.getSettings.setGeolocationEnabled(True); FWebView.setWebChromeClient( TJWebChromeClient.Create.onGeolocationPermissionsShowPrompt( origin: JString; callback: JGeolocationPermissions_Callback);..... FWebView.getSettings.setAppCacheEnabled(True); FWebView.getSettings.setDatabaseEnabled(True); FWebView.getSettings.setDomStorageEnabled(True); FWebView.getSettings.setBuiltInZoomControls(True); FWebView.getSettings.setDisplayZoomControls(False); FWebViewContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); FChildrenContainer := TJRelativeLayout.JavaClass.init(TAndroidHelper.Context); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FWebView, LayoutParams); LayoutParams := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT); FWebViewContainer.addView(FChildrenContainer, LayoutParams); SetEnableCaching(True); end;  
    • От brunnengi
      Здравствуйте.
      Как отключить клавиатуру, что бы она не вылетала при получении фокуса в полях ввода?
    • От Mohamed BEN AMMAR
      hello 
      i'm using delphi fmx for building android App
      i have this code for Activating The WI-FI icon from android device:
      This could be found here .
      =========== code ==================
      uses
        Androidapi.Helpers,
        Androidapi.JNI.JavaTypes,
        Androidapi.JNI.GraphicsContentViewText,
        Androidapi.JNIBridge,
        Androidapi.JNI.WifiManager;
        procedure SetWifiEnabled (AEnable: Boolean); var   Obj: JObject;   WifiManager: JWifiManager; begin   Obj: = SharedActivityContext.getSystemService (TJContext.JavaClass.WIFI_SERVICE);   if Obj = nil then     Exit;     WifiManager: = TJWifiManager.Wrap ((Obj as ILocalObject) .GetObjectID);   WifiManager.setWifiEnabled (AEnable); end; 
       
       My question is About Activating Android location:
        Is it possible to activate the service location icon from android device
       programatically without using the Location or TLocationSensor component ....?
      however I know exactly that google has been Deactivate this API since android "4" just for security reasons .....
      but i have seen many apps in playstore can activate the service without using 
      this code here ask the user for activate the location manually .... procedure TForm1.GPSSettings; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end; in other versions like lolipopup can show just the Allow Permission system dialog timer ....( Asking the user for Allowing this App to Activate the service location ......) 
      I have an android device with lolipopup version and i try to execute the location EMBARCADERO sample but 
      this one can not activate the service location ICON even  my device show me the Allow permission dialog where i choose yes allow
      with never ASK....
      Finally ,  I like the WI-FI code above .....
      and i'm wondering if someone here can do this task for me (i need a unit as the WI-FI code above which can offer me
      the option to activate the Service Location ICON )
      I'm ready to paid for that task .....
       
      Sincerelly: Brave.
    • От GMX
      Android 6 MIUI
       ни стандартные примеры не работают, ни попытки что-то свое создать... 
      LastDiscoveredDevices - всегда 0, хотя из настроек устройства находятся. 
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Bluetooth, System.Bluetooth.Components, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Bluetooth1: TBluetooth; Label1: TLabel; AniIndicator1: TAniIndicator; procedure Button1Click(Sender: TObject); procedure Bluetooth1DiscoverableEnd(const Sender: TObject); procedure Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Bluetooth1DiscoverableEnd(const Sender: TObject); begin Label1.Text := IntToStr(Bluetooth1.LastDiscoveredDevices.Count); end; procedure TForm1.Bluetooth1DiscoveryEnd(const Sender: TObject; const ADeviceList: TBluetoothDeviceList); begin Label1.Text := IntToStr(ADeviceList.Count); AniIndicator1.Enabled :=False; end; procedure TForm1.Button1Click(Sender: TObject); begin Bluetooth1.DiscoverDevices(10000); AniIndicator1.Enabled :=True; end; procedure TForm1.FormCreate(Sender: TObject); begin while not Bluetooth1.Enabled do Bluetooth1.Enabled := True; end; end. В разрешениях bluetooth, bluetooth admin, coarse location, fine location включены... 
    • От Barbanel
      Всем привет!
      Поясните мне плиз, такую вещь как TTouchAnimation, на примере Android.
      Как я это понимаю:
      Есть к примеру некая кнопка, которая имеет несколько состояний, из которых важны: не нажатая и нажатая.
      В момент нажатия, TTouchAnimation пускает расходящийся круг, причем четко из центра нажатия.
      Ок, пусть на самом деле не круг, а картинку, указанную в... собсно, где???
      Как задать эту область, которая должна отображаться как реакция на нажатие?В редакторе среды, у объектов TButtonStyleObject есть свойство TouchAnimation: (TTouchAnimationAdapter), у которого в свою очередь есть свойство Link: (TBitmapLinks), которое как я считал и отвечает за эту область.
      Однако, при клике на это поле ничего не происходит.
      Баг среды, или моя удача???
      Как вы с этим боретесь?
      Других полей, где могли бы быть эти координаты я не нахожу.
      Заранее спасибо!

    • От Yarpda
      Подскажите пожалуйста есть ли какая-то информация по работе с Google календарем из FMX?
      Может быть у кого-то есть практика работы с ним? На форуме информации по этому поводу никакой не нашел.
      Интересует вопрос чтения и создания событий в календаре.
      Заранее благодарю.
    • От Tarik Live
      Здравствуйте! Уже почти неделю пытаюсь завести библиотеку org.eclipse.paho.client.mqttv3-1.2.0 в своём приложении. Я знаю о существовании компонента от TMS, но он не умеет работать в фоновом сервисе.
      Вот код который я использую для тестов:
       
      Стандартная библиотека org.eclipse.paho.client.mqttv3-1.2.0 выпадает в ошибку initializer error сразу на строчке 
      mqtt:=TJMqttClient.JavaClass.init(StringToJString('tcp://m23.cloudmqtt.com:11021'), StringToJString('java')); по логам с телефона стало понятно, что проблема в логах ? а конкретно когда библиотека пытается создать логгер выпадает ошибка что не найден файл локализации ru_RU для logcat (сами файлы там вроде как есть). Ладно. Скачал исходники почистил код библиотеки от упоминаний логгера, собрал ииии и ничего. Продвинулся до строчки 
      mqtt.connect(); также пробивал 
      mqtt.connect(mqttconopt); ничего не помагает, получаю ошибку сегментации класса 
      Пока не понятно куда копать дальше? Возможно что не все библиотеки можно использовать в delphi приложениях? 

      P.S Старая версия 1.1.1 тоже не завелась :(
      service test2.rar
    • От Юрий Гусач
      Доброго дня!
      Проясните пожалуйста ситуацию: при запуске программы  под Андроидом на различных устройствах я получаю размеры формы, которые вроде всегда в разы меньше чем максимальное разрешение экрана конкретного устройства. Я пробовал планшеты и разные смартфоны. Написал тестовую прогу, которая выводит СlientScreen и  ClientWidth формы, на которой ничего больше нет. Например для крайне бюджетного смартфона Fly FS-549 получилось 497 х 320, а по паспорту 854x480. Разрешение и так хреновое, а Delphi его еще сильнее уменьшает. -       Почему это происходит и можно ли как то это обойти?
       
       
  • Последние посетители   0 пользователей онлайн

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

×
×
  • Создать...