Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Как определить "графическое быстрдействия" компьютера   Найти похожие ветки 

 
Mefodiy   (2005-07-21 09:11) [0]

В программе производится плавное преобразование одной картинки в другую. Скорость преобразования зависит от задаваемого числа итераций. Проблема в том, что при одном и том же числе итераций на разных компьютерах скорость преобразования разная и весь эффект порой пропадает.
   Как можно на этапе загрузки программы вычислить некий "коэффициент графического быстродействия" и на его основе соответствующее число итераций для каждого конкретного случая.
  Спасибо.


 
Alx2 ©   (2005-07-21 09:15) [1]

Mefodiy   (21.07.05 9:11)
Привязываться ко времени. В момент t должна быть картинка с номером  ~  t/T * N , где T - общее время эффекта, N - количество "кадров" эффекта.


 
Mefodiy   (2005-07-21 15:42) [2]

Куда и как это всунуть? Привожу код программы (она взята из интернета).
procedure TForm1.StartButtonClick(Sender: TObject);
 const count = 200;
 var i: integer;
     x, y: integer;
     bm, bm1, bm2: TBitMap;
     p1, p2, p: PByteArray;
begin
 bm  := TBitMap.Create;
 bm1 := TBitMap.Create;
 bm2 := TBitMap.Create;
 bm1.LoadFromFile("MyPic1.bmp");
 bm2.LoadFromFile("MyPic2.bmp");
 if bm1.Height < bm2.Height then
   begin
     bm.Height := bm1.Height;
     bm2.Height := bm1.Height;
   end
 else
   begin
     bm.Height := bm2.Height;
     bm1.Height := bm2.Height;
   end;
 if bm1.Width < bm2.Width then
   begin
     bm.Width := bm1.Width;
     bm2.Width := bm1.Width;
   end
 else
   begin
     bm.Width := bm2.Width;
     bm1.Width := bm2.Width;
   end;
 bm.PixelFormat  := pf24bit;
 bm1.PixelFormat := pf24bit;
 bm2.PixelFormat := pf24bit;

 Form1.Canvas.Draw(0, 0, bm1);
 for i := 1 to count - 1 do begin
   for y := 0 to bm.Height - 1 do
   begin
     p  := bm.ScanLine[y];
     p1 := bm1.ScanLine[y];
     p2 := bm2.ScanLine[y];
     for x := 0 to bm.Width * 3 - 1 do
       p^[x] := Round((p1^[x] * (count - i) + p2^[x] * i) / count);
   end;
   Form1.Canvas.Draw(0, 0, bm);
   Form1.Caption := IntToStr(Round(i / count * 100)) + "%";
   Application.ProcessMessages;
   if Application.Terminated then
     Break;
 end;
 Form1.Canvas.Draw(0, 0, bm2);
 Form1.Caption := "Done";
 bm1.Destroy;
 bm2.Destroy;
 bm.Destroy;
end;


 
evvcom ©   (2005-07-21 16:16) [3]


> Скорость преобразования зависит от задаваемого числа итераций.

Убрать итерации и вставить Sleep(...).


 
Alx2 ©   (2005-07-22 09:28) [4]

>Mefodiy   (21.07.05 15:42)

>Куда и как это всунуть? Привожу код программы (она взята из
>интернета).

Всунул.


Procedure TForm1.StartButton10Click(Sender: TObject);
Const
 count = 2000;
 TransformTime_ms = 5000;   // Время в мс на преобразование
Var
 i: integer;
 x, y: integer;
 bm, bm1, bm2: TBitMap;
 p1, p2, p: PByteArray;
 StartTime: Cardinal;
Begin
 bm := TBitMap.Create;
 bm1 := TBitMap.Create;
 bm2 := TBitMap.Create;
 Try

   bm1.LoadFromFile("MyPic1.bmp");
   bm2.LoadFromFile("MyPic2.bmp");
   If bm1.Height < bm2.Height Then
     Begin
       bm.Height := bm1.Height;
       bm2.Height := bm1.Height;
     End
   Else
     Begin
       bm.Height := bm2.Height;
       bm1.Height := bm2.Height;
     End;
   If bm1.Width < bm2.Width Then
     Begin
       bm.Width := bm1.Width;
       bm2.Width := bm1.Width;
     End
   Else
     Begin
       bm.Width := bm2.Width;
       bm1.Width := bm2.Width;
     End;
   bm.PixelFormat := pf24bit;
   bm1.PixelFormat := pf24bit;
   bm2.PixelFormat := pf24bit;

   StartTime := GetTickCount; // Пускаем "секундомер"

   Canvas.Draw(0, 0, bm1);

   Repeat
     i := round(min((GetTickCount - StartTime) / TransformTime_ms, 1) * Count); // Вычисляем "номер кадра" для отрисовки.
     For y := 0 To bm.Height - 1 Do
       Begin
         p := bm.ScanLine[y];
         p1 := bm1.ScanLine[y];
         p2 := bm2.ScanLine[y];
         For x := 0 To bm.Width * 3 - 1 Do
            p^[x] := Round((p1^[x] * (count - i) + p2^[x] * i) / count); // Здесь особые тормоза. Делают несколько иначе.
       End;
     Canvas.Draw(0, 0, bm);
     Caption := IntToStr(Round(i / count * 100)) + "%";
   Until I >= Count;

   Canvas.Draw(0, 0, bm2); // Имхо, параноидально несколько
   Caption := "Done";
 Finally
   bm1.free;
   bm2.free;
   bm.free;
 End;
End;


PS
Код в плане скорострельности мне не нравится


 
Alx2 ©   (2005-07-22 10:02) [5]

>Mefodiy   (21.07.05 15:42)

Вот лениво разогнанный вариант:


Procedure TForm1.StartButton10Click(Sender: TObject);
Const
 Exp_Factor = 12; // Величина двоичного сдвига (позволит исключить деление и одно умножение)
 TransformTime_ms = 1000;   // Время в мс на преобразование
Var
 Count, i, x, y: integer;
 bm, bm1, bm2: TBitMap;
 p1, p2, p: PByteArray;
 StartTime: Cardinal;
Begin
 bm := TBitMap.Create;
 bm1 := TBitMap.Create;
 bm2 := TBitMap.Create;
 Try

   bm1.LoadFromFile("MyPic1.bmp");
   bm2.LoadFromFile("MyPic2.bmp");

   Count := round(power(2, Exp_Factor)); // Вычисляем количество кадров как степень двойки

   If bm1.Height < bm2.Height Then
     Begin
       bm.Height := bm1.Height;
       bm2.Height := bm1.Height;
     End
   Else
     Begin
       bm.Height := bm2.Height;
       bm1.Height := bm2.Height;
     End;
   If bm1.Width < bm2.Width Then
     Begin
       bm.Width := bm1.Width;
       bm2.Width := bm1.Width;
     End
   Else
     Begin
       bm.Width := bm2.Width;
       bm1.Width := bm2.Width;
     End;
   bm.PixelFormat := pf24bit;
   bm1.PixelFormat := pf24bit;
   bm2.PixelFormat := pf24bit;

   StartTime := GetTickCount;

   Canvas.Draw(0, 0, bm1);

   Repeat
     i := round(min((GetTickCount - StartTime) / TransformTime_ms, 1) * Count);
     For y := 0 To bm.Height - 1 Do
       Begin
         p := bm.ScanLine[y];
         p1 := bm1.ScanLine[y];
         p2 := bm2.ScanLine[y];
         For x := 0 To bm.Width * 3 - 1 Do
           p^[x] := (p1^[x] Shl Exp_Factor + (p2^[x] - p1^[x]) * i) Shr Exp_Factor;
           // Здесь раскрыли скобки и все, что имеет отношение к count заменили на сдвиги.
       End;
     Canvas.Draw(0, 0, bm);
     Caption := IntToStr(Round(i / count * 100)) + "%";
   Until I >= Count;

   Caption := "Done";
 Finally
   bm1.free;
   bm2.free;
   bm.free;
 End;
End;


 
Mefodiy   (2005-07-22 10:30) [6]

>Alx2 ©

Работает нормально. Спасибо за труды.



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1121700252
Piter
2005-07-18 19:24
2005.08.14
Загадка программерам от Питера :)


14-1121673736
Vlad Oshin
2005-07-18 12:02
2005.08.14
Ув. жители Пензы! Как лучше добраться


14-1122005636
X9
2005-07-22 08:13
2005.08.14
Сеть на битом коаксиле


1-1122449889
ChI
2005-07-27 11:38
2005.08.14
определение номера введёного символа


3-1120564635
alex_***
2005-07-05 15:57
2005.08.14
получить результат выполнения dynamic sql кроме кода ошибки