Текущий архив: 2005.09.25;
Скачать: CL | DM;
Вниз
создание TBitmap из нескольких Найти похожие ветки
← →
RzCoDer © (2005-09-03 15:03) [0]Есть код:
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 мс, что не есть гуд, т.к. делать это надо часто и быстро. Вопрос: как можно оптимизировать код?
← →
злобная танька (2005-09-03 15:18) [1]используй апишные функции.. BitBlt. Вроде побыстрее работает.
← →
Antonn © (2005-09-03 15:41) [2]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));
← →
RzCoDer © (2005-09-03 16:25) [3]злобная танька, дело в том что я полный чайник в API, то бишь - дай фунцию кодом, плиз.
Antonn, от CopyRect эффект точно такой же :(
← →
Eraser © (2005-09-03 16:28) [4]RzCoDer © (03.09.05 16:25) [3]
Проверь чтобы PixelFormat был там и там одинаковый, если одинаковый, то врядли что-нибудь поможет.
← →
Antonn © (2005-09-03 16:34) [5]RzCoDer © (03.09.05 16:25) [3]
tiles[n]);
не может быть, значит что-то еще.
tiles[n] - это что? что из себя предствляет?
← →
TUser © (2005-09-03 16:48) [6]Твой код работает в среднем за 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;
← →
RzCoDer © (2005-09-03 18:38) [7]Блин, блин, блин! Я всё понял, битмапы тут не причём :( Это всё загрузка текстур в OpGL :((( хотя посредством одного трюка удалось малость замаскировать тормоза, но как это будет выглядеть на более слабых машинах, даже не знаю...
Страницы: 1 вся ветка
Текущий архив: 2005.09.25;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.03 c