Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

создание TBitmap из нескольких


RzCoDer ©   (2005-09-03 15:03:00) 

Есть код:
for i := 0 to 15 do
begin
for f := 0 to 15 do begin

Bitmap.Canvas.Draw(f*20,i*20,tiles[n]);

end;
end;


где Bitmap соответсвенно тбитмап; tiles - массив TBitmap; n - некий индекс.
В принципе подход работает, но уж как то слишком тормозно то есть на моём отнюдь не слабом компе при вызове функции происходит загрузка до 89% и думает примерно 100 мс, что не есть гуд, т.к. делать это надо часто и быстро. Вопрос: как можно оптимизировать код?


RzCoDer   (2005-09-03 18:38:00) [1]

Блин, блин, блин! Я всё понял, битмапы тут не причём :( Это всё загрузка текстур в OpGL :((( хотя посредством одного трюка удалось малость замаскировать тормоза, но как это будет выглядеть на более слабых машинах, даже не знаю...


TUser   (2005-09-03 16:48:00) [2]

Твой код работает в среднем за 5.5-6Ms на Celeron733, 512RAM, XP prof. Компьютер образца года примерно 2001-2002-го, причем один из дешевых.

procedure TForm1.Button1Click(Sender: TObject);
var i, f: integer;
   B: TBitMap;
begin
 B:=TBitMap.Create;
 B.Width:=20;
 B.Height:=20;
 B.Canvas.Brush.Color:=clBlack;
 B.Canvas.FillRect(B.Canvas.ClipRect);

 Image1.Picture.BitMap.Width:=20*16;
 Image1.Picture.BitMap.Height:=20*16;

for i := 0 to 15 do
begin
for f := 0 to 15 do begin

 Image1.Picture.BitMap.Canvas.Draw(f*20,i*20,B);

end;
end;


 B.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
const Count = 1000;
var t: TDateTime;
   i: integer;
begin
 t:=now;
 for i:=1 to Count do
   Button1Click(nil);
 ShowMessage ('Done at '+inttostr(MillisecondsBetween(t,now))+' msec')
end;


Antonn   (2005-09-03 16:34:00) [3]

RzCoDer ©   (03.09.05 16:25) [3]
tiles[n]);

не может быть, значит что-то еще.
tiles[n] - это что? что из себя предствляет?


Eraser   (2005-09-03 16:28:00) [4]

RzCoDer ©   (03.09.05 16:25) [3]

Проверь чтобы PixelFormat был там и там одинаковый, если одинаковый, то врядли что-нибудь поможет.


RzCoDer   (2005-09-03 16:25:00) [5]

злобная танька, дело в том что я полный чайник в API, то бишь - дай фунцию кодом, плиз.

Antonn, от CopyRect эффект точно такой же :(


Antonn   (2005-09-03 15:41:00) [6]

RzCoDer ©   (03.09.05 15:03)
Bitmap.Canvas. Draw(

бяка... смотри [1] или в крайнем случае замени на
Bitmap.Canvas.copyrect(classes.rect(f*20,i*20,(f+1)*20,(i+1)*20) ,тут нужен канвас битмапа из массива,classes.rect(0,0,20,20));


злобная танька   (2005-09-03 15:18:00) [7]

используй апишные функции.. BitBlt. Вроде побыстрее работает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо