Форум: "Media";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
ВнизНепонятки с влиянием Canvas.Pen.Width на скорость прорисовки Найти похожие ветки
← →
AlHAkim (2006-10-23 16:07) [0]суть такая надо нарисовать некую таблицу
Создаю некий эквивалент симмулятора LCD дисплейчика размерностью? к примеру 240х64
Входной массив данных управляет цветом (черный/белый) каждой точки. так вот мой обработчик
var Form1: TForm1;
X, Y, DX, DY: Integer;
RowCount, ColCount :Integer;
PMyList: PIntArray;
StrokeList: PIntArray;
TmpCol, TmpRow : Cardinal;
TmpArray : array of byte;
StartTime, EndTime: int64;
StartTimeP, EndTimeP: int64;
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
RowCount := 64;
ColCount := 240;
PMyList := AllocMem($ffff*sizeof(TPoint)*2);
StrokeList := AllocMem($ffff*sizeof(Integer));
SetLength(TmpArray,2000);
for i:= 0 to 2000 do TmpArray[i] := i and $00FF;
end;
procedure FixCellArr(FixLCD: array of byte);
const BitMaskArray : array[0..7] of byte = ($80,$40,$20,$10,$08,$04,$02,$01);
var YBit,XByte,XBit: Cardinal;
begin
TmpCol := 0; TmpRow := 0;
for YBit:=0 to RowCount -1 do begin
for XByte:=0 to (ColCount div 8)-1 do begin
for XBit:=0 to 7 do begin
//ShowMessage(format("FixLCD[%2.0d]=%2x"+ #13#10+"BitMaskArray[%2.0d]=0x%2x"+ #13#10+"result=%2x",
// [XByte, FixLCD[XByte], XBit, BitMaskArray[XBit], (FixLCD[XByte] and BitMaskArray[XBit])]));
if ((FixLCD[YBit*(ColCount div 8) + XByte] and BitMaskArray[XBit])>0) then begin
PMyList^[TmpCol] := (XByte*8 + XBit)*3; PMyList^[TmpCol+1] := YBit * 3+20;
PMyList^[TmpCol+2] := (XByte*8 + XBit+1)*3; PMyList^[TmpCol+3] := YBit * 3+20;
inc(TmpCol,4);
StrokeList^[TmpRow] := 2;
inc(TmpRow,1);
end;
end; // end of for XBit:=0
end; // end of for XByte:=0
end; // end of for YByte:=0
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form1.PaintBox1.Canvas.Brush.Color := clwhite;
Form1.PaintBox1.Canvas.Brush.Style := bsSolid;
Form1.PaintBox1.Canvas.FillRect(ClientRect);
Form1.PaintBox1.Canvas.Pen.Color := clBlack;
Form1.PaintBox1.Canvas.Pen.Width := 1;
QueryPerformanceCounter(StartTime);
FixCellArr(TmpArray);
QueryPerformanceCounter(EndTime);
QueryPerformanceCounter(StartTimeP);
PolyPolyLine(Form1.PaintBox1.Canvas.Handle, PMyList^, StrokeList^, TmpRow);
QueryPerformanceCounter(EndTimeP);
Form1.Caption:= IntToStr(EndTime-StartTime)+" "+ IntToStr(EndTimeP-StartTimeP);
end;
Так вот когда меняю толщину пера
Form1.PaintBox1.Canvas.Pen.Width := 2;
прорисовка происходит несколько минут :(, может быть как-то можно по бругому это реализовать, буду признателен за советы
Сам я не очень искущен в программировании
← →
Ketmar © (2006-10-23 16:11) [1]а зачем это делать столь странным образом? не проще ли рисовать напрямую пиксели? или через Canvas.Pixels[] (тоже шибко медленно), или обращаясь к ScanLine[] (и не забывая о PixelFormat, конечно).
← →
MBo © (2006-10-23 16:33) [2]Рисование толстым пером происходит не таким образом, как пером единичной толщины. Для второго случая достаточно наставить точек (по алгоритмам DDA или Брезенхема), а линия, нарисованная толстым пером - на самом деле некоторая закрашенная область, поэтому рассчитываться и рисоваться будет дольше.
← →
guav © (2006-10-23 20:54) [3]Думаю основная проблема в какой-либо ошибке.
на момент вызова PolyPolyLine последний параметр равен аж 7616 - зачем тебе столько полилиний ??
Советую рисовать по одной линии, чтобы не ошибится с заполнинием параметров - Canvas.MoveTo, Canvas.LineTo.
← →
AlHAkim (2006-10-23 22:04) [4]
> Думаю основная проблема в какой-либо ошибке.
> на момент вызова PolyPolyLine последний параметр равен аж
> 7616 - зачем тебе столько полилиний ??
> Советую рисовать по одной линии, чтобы не ошибится с заполнинием
> параметров - Canvas.MoveTo, Canvas.LineTo.
>
так то оно так чожет быть и проще но когд аодин раз определил массив линий то , н а мой вгляд кажется проще, при перересовке не надо заново расчитывать, к тому же, как я счита, что реализация функции PolyPolyLine/ оптимизированна по времк\ени выполненния. нежели отдельный вызов Canvas.MoveTo, Canvas.LineTo.
Ибо зачем ЭТО ВСЕ, ААА!!!. да действительно есть проблема в перерисовке такого массива, но ведь есть аналоги подобного
http://www.ramtex.dk/glcd/lcdwdemo.zip
полноценный скрвер LCD. Н уж то нет решений??
Я конечно для этих уелий адаптировал свой копонет на основе StringGrid? но при большой размерности прорисовк азанмает несколько секунд,конечно можно смириться. и не ставить самоцелью отсутсвие гифов, но ведь , блин. хочется лучшего , да и разобраться :(
← →
Ketmar © (2006-10-23 22:13) [5]>[4] AlHAkim 23-Oct-2006, 22:04
>аодин раз определил массив линий
а ещё проще -- один раз нарисовать и забыть. до следующего изменения, когда твой "массив линий" всё равно придётся строить заново.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c