Пользователь может изменить качество эффектов, но уж очень хочется облегчить всем жизнь. Пользователь должен запустить программу, а она по умолчанию не тормозит
В общем я решил измерять производительность при старте, как раз висит 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;
Протестировал на доступных телефонах, пока определяет верно