Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Быстрейшее ..


Автор: ShuVaS 24.1.2005, 21:13
Короче в моей проге есть фоновый рисунок мне нада чтобы этот рисунок выводился как можно скорее и тратил как можно мньше памяти и не тормозил систему.И еще я юзаю Xp манифест (Delphi 7) Проблемки - у меня то фон пропадает то еще че нить .... (нада мне єтот манифест таскать или просто на форму кинуть ?).И последнее - при изменении размеров формы у меня остаютьсянеприятные еффекты от старого рисунка -- как обновить форму ... smile

Автор: s-mike 24.1.2005, 22:25
Цитата(ShuVaS @ 24.1.2005, 21:13)
И последнее - при изменении размеров формы у меня остаютьсянеприятные еффекты от старого рисунка  -- как обновить форму ... smile

Код

procedure TForm1.FormResize(Sender: TObject);
begin
 Perform(WM_PAINT, Canvas.Handle, 0);
end;

Добавлено @ 22:27
Цитата(ShuVaS @ 24.1.2005, 21:13)
мне нада чтобы этот рисунок выводился как можно скорее и тратил как можно мньше памяти и не тормозил систему

Быстрее BitBlt при использовании GDI (стандартных виндовых окошек) еще не придумали.
Добавлено @ 22:29
Цитата(ShuVaS @ 24.1.2005, 21:13)
(нада мне єтот манифест таскать или просто на форму кинуть ?)

Без разницы. Только в Win9x-2000 размер файла будет больше на несколько Кб ненужного кода, если использовать компонент.

Автор: ShuVaS 25.1.2005, 00:20
А по подробней на счет вывода графики можно ?Стоит ли юзать Image ?Мне нада чтобі еще желательно можно біло изображение натянуть(если не использовать Image -говорят медленно)И Еще мож не по теме токо из-за этого создавать топик не охота - Application.ProcessMEssages - его один раз в процедуре надо ставить:

Код

procedure TfrMain.btnPlayClick(Sender: TObject);
begin
Application.ProcessMessages;
if Player.Tag=1 then
  begin Player.Pause;
        Player.Tag:=0;
  end
  else
   begin if OpenDialog1.Execute then
     begin
      Player.FileName := OpenDialog1.Filename;
      Label1.Caption  := ExtractFileName(OPendialog1.Filename);
      TrackBar1.SliderVisible :=true;
      btnPause.Enabled:= true;
   with Player do
         begin
          Open;
        TrackBar1.Max:=Player.TrackLength[0];
          Play;
        end;
  Timer1.Enabled  := true;
  IsOn:=true;
  InitWaveIn(true);
  end;
end;
end;


или после каждогособытия?Если один раз - то где (в самом конце или в начале)....

Автор: p0s0l 25.1.2005, 00:27
Цитата(s @ 24.1.2005, 22:25)
Быстрее BitBlt при использовании GDI (стандартных виндовых окошек) еще не придумали.
Это верно.

Но нужно заметить, что но не стоит бросать VCL и переходить на WinAPI/GDI, и не стоит замудрять голову смешиванием VCL и WinAPI, т.к. VCL всё равно в итоге работает через эти же функции. "Надстройка" сжирает очень-очень мало. Даже если в цикле тысячи раз вызвать BitBlt и сравнить с Canvas.Draw, то разница будет настолько малозначительной, что принимать во внимание её не имеет смысла.

Более важную роль при копировании изображения играет формат пикселя. Неправильный выбор формата может привести к замедлению в десятки раз (!).
Правильным же подходом является хранение изображения в памяти в формате, идентичном формату контекста, куда будет выводится картинка. Иначе при каждом копировании будет происходить преобразование исходного изображения к нужному формату, поэтому если нужно выводить картинку часто, то лучше сразу привести её к нужному виду... Это делается довольно легко. Например, если картинку выводишь на экран, то нужно делать так:
Код
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(<имя файла>);
Bitmap.HandleType := bmDDB; // вот она, главная строчка
(или вместо последней строчки: Bitmap.PixelFormat := pfDevice;)
Это как минимум ускорит вывод битмапа на экран раза в 2-3...

Автор: ShuVaS 25.1.2005, 15:04
а как мне напримар вывести ???через Canvas.Draw или через что ???? и на счет Application.ProcessMessages - я спрашую вообще как надо ставить -один раз или несколько в процедуре ?

Автор: p0s0l 25.1.2005, 18:30
Цитата(ShuVaS @ 25.1.2005, 15:04)
Application.ProcessMessages - я спрашую вообще как надо ставить -один раз или несколько в процедуре ?
А зачем тебе его вообще ставить ? Глядел-глядел, и так и не разглядел, зачем он тут нужен... Ни циклов, ни долгих операций вроде нет...



Автор: ShuVaS 25.1.2005, 19:26
г-н Посол вы не множко не поняли ...Я попросил обьснить как работает Application.ProcessMasseges - что бы он работал его нада ставить после ресурсоемкой строчки до нее или вообще один раз в начале (или в конце)...
Насчет рисунка - подскажите наибыстрейший и удобный формат *.bmp или *.jpg .. (учитывая что второй можно сжать легко до 30-40 kb)..И как наконец вывести ето изображение ....(желательно полный код - а то я не понимаю чуток (естественно что это было как можно быстрее и оптимизированнее)...
И как обновить окно формы ???(если я хочу просто нажать на кнопку...)


P.s - Вот вроде и все

Автор: ДЫМ 27.1.2005, 02:43
Цитата
Я попросил обьснить как работает Application.ProcessMasseges - что бы он работал его нада ставить после ресурсоемкой строчки до нее или вообще один раз в начале (или в конце)...


Насколько я понял, ты хочешь, чтобы во время загрузки большого файла контролы реагировали на твои действия. Так вот, ProcessMasseges не поможет, придется сидеть и смотреть на "песочные часы"

Цитата

Насчет рисунка - подскажите наибыстрейший и удобный формат *.bmp или *.jpg .. (учитывая что второй можно сжать легко до 30-40 kb)..


Если у тебя большой рисунок, то вывод *.jpg займет заметно больше времени (я проверял). Так, что если так важна скорость, то используй формат *.bmp

А так можно заполнить фон
Код


var
  BitmapBkg:TBitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin
BitmapBkg:=TBitmap.Create;
BitmapBkg.LoadFromFile('background.bmp');
Canvas.Brush.Bitmap:=BitmapBkg;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.FillRect(ClientRect);
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)