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

Определение слабого телефона


Tumaso

Вопрос

Всем привет.

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

Суть в том, что в своем приложении я использую TGlowEffect и TInnerGlowEffect. Смотрится хорошо, но на слабых телефонах тормозит, а на мощных все работает как надо. Как бы извернуться, чтобы динамически при старте определить, слаб ли телефон для эффектов и при необходимости их просто отключить? Прописывать конкретные модели некошерно, их минимум 5 тысяч, хотелось бы программное решение.

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

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

  • 0

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

В общем я решил измерять производительность при старте, как раз висит splash-форма как заставка (она создает главное окно и после создания переключает на него и делает его главным), пользователю придется чуть дольше подождать запуска. Думаю это не проблема.

Суть идеи - у меня приложение построено на фреймах, которые динамически создаю/уничтожаю. И как раз стартовый фрейм является небольшой демкой возможностей, там используется много эффектов и разных компонентов. Поэтому я создаю этот фрейм, делаю предзагрузку стилей всем компонентам фрейма (этот способ взял на этом же форуме, автор Ярослав). После этого создания фиксирую время, за которое создается скриншот этого фрейма (т.е. использую MyFrame.MakeScreenshot). И уже на основании потраченного времени оцениваю производительность железа при работе с графикой.

type
  /// <summary>
  ///   Производительность оборудования
  /// </summary>
  THardwarePerformance = (
    /// <summary>
    ///   Высокая производительность
    /// </summary>
    performanceHigh,
    /// <summary>
    ///   Средняя производительность
    /// </summary>
    performanceMedium,
    /// <summary>
    ///   Низкая производительность
    /// </summary>
    performanceLow
    );

function DetectPerformance(AImage: TImage): THardwarePerformance;
var
  LTemp: TBitmap;
begin
  // измеряем производительность оборудования
  CreateFrame(modeWelcome);  // существующий в другом коде метод, создающий нужный фрейм
  LTime := Now;
  LTemp := Frames[modeWelcome].MakeScreenshot;
  try
    AImage.Bitmap.SetSize(LTemp.Width, LTemp.Height);
    AImage.Bitmap.CopyFromBitmap(LTemp);
  finally
    LTemp.DisposeOf;
  end;
  LTime := Now - LTime;
  // оцениваем производительность
  if LTime < EncodeTime(0, 0, 0, 300) then
    Result := performanceHigh
  else if LTime < EncodeTime(0, 0, 2, 0) then 
    Result := performanceMedium
  else
    Result := performanceLow;
end;

Протестировал на доступных телефонах, пока определяет верно

Ссылка на комментарий
  • 0
21 час назад, x11 сказал:

Хм... А причем тут Abdroid_id? Как вы по хэшу собрались скорость определить? К тому же он может быть null..

Не знаю конечно, сам не определял, но вот гугл говорит это https://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

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

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

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

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

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

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

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

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

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

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

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