Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1181320184
YurikGL
2007-06-08 20:29
2007.07.08
Культурное наследие в связи?


2-1181996528
nord489
2007-06-16 16:22
2007.07.08
ADOConnection


3-1176233234
sholomgf
2007-04-10 23:27
2007.07.08
Помогите с запросом MYSQL ...


1-1178465498
gosha73
2007-05-06 19:31
2007.07.08
Показать хинт контрола в позиции курсора


2-1180797638
Core Thousand
2007-06-02 19:20
2007.07.08
wm_geticon





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский