![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создание 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. Вроде побыстрее работает.