• 0
Tumaso

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

Вопросы

Всем привет.

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

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

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


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

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

  • 0

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

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


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

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


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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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