Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Непонятки с влиянием 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 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
2-1181800400
Ral'f
2007-06-14 09:53
2007.07.08
Query


15-1181200151
cosinus
2007-06-07 11:09
2007.07.08
Помогите с ошибкой в 2003...


2-1181734221
antid
2007-06-13 15:30
2007.07.08
использование mousedown


15-1181288812
Desdechado
2007-06-08 11:46
2007.07.08
Подцепить к ярлыку дополнительный престартовый батник


3-1175946319
boristt
2007-04-07 15:45
2007.07.08
Перехват ошибки от MSSQL Express 2005 (dbExpress)