Что быстрее FillRect?
Какой размер поля?
Какой размер квадратиков?
Какие цвета на поле, только черный и белый?
Слышал также краем уха, что операции с объектами TCanvas не отличаются особой торопливостью, и что есть методы написать гораздо более быстрые вещи. Может, кто-нибудь подскажет, как это можно сделать?
TCanvas (и вообще любая высокоуровневая объектно-ориентированная библиотека) в любом случае медленнее, чем непосредственно API.
Попробуй сделать CreateBitmap() и рисовать на нём, а потом уже этот Bitmap выводить на экран.
как доберусь домой - попробую...
Попробуешь -- обязательно поделись результатом!
TCanvas (и вообще любая высокоуровневая объектно-ориентированная библиотека) в любом случае медленнее, чем непосредственно API.
Попробуй сделать CreateBitmap() и рисовать на нём, а потом уже этот Bitmap выводить на экран.
Врядле на этом много сэкономишь...
Короче делать было вечером, делать было нечего, наваял код... :P
Для повторения эксперимента нужна голая формочка и на ней кнопочка, и на эту кнопочку вешаем все что ниже накалякано ;)
{
//Инитиализ
Bmp = new Graphics::TBitmap;
//задаем формат
Bmp->PixelFormat = pf1bit; //только черный и белый
/*
Картинка размеров 200*200 займет в памяти блок
25*25 байт (200/8=25), каждый байт будет управлять
сразу 8-ю пикселями. Дабы не иметь секса со стыками
байтов, я бы рекомендовал размер
квадратика сделать 8 пикселей - тогда "зачернив" один
байт, зачернишь один квадратик. Так и сделаю.
А далее через стреч нарисуем поле таким размером, как
нам надо.
Как я понял из условия поле 40*40 квадратов...
*/
//задаем размер
Bmp->Height = 320; //40*8
Bmp->Width = 320;
//Вспомогательный массив указателей на сканы строк
char **Line = new char*[320];
int i;
for(i = 0; i<320; i++)
Line = (char*)Bmp->ScanLine;
//Инициализационная часть закончилась.
//Работаем с изображением
//И засечем время
int t = GetTickCount();
//Для наглядности закрашиваем черным клетку (x,y)=(2,5)
// 0 = черный квадрат
// 255 = белый
int x=2;
int y=5;
for(i = y*8;i<(y+1)*8;i++)
Line[x] = 0;
//И сечас нарисуем шахматы
for(x=0;x<40;x+=2)
for(y=0;y<40;y+=2)
for(i = y*8;i<(y+1)*8;i++)
Line[x] = 0;
for(x=1;x<40;x+=2)
for(y=1;y<40;y+=2)
for(i = y*8;i<(y+1)*8;i++)
Line[x] = 0;
//И теперь еще белую клетку сделаем
x=15;
y=5;
for(i = y*8;i<(y+1)*8;i++)
Line[x] = 255;
/*
Рисование закончили, засекаем время, и
отображаем в окошке наш шедевр ;)
*/
Caption = "Время (мс)~"+IntToStr(GetTickCount()-t);
Canvas->StretchDraw(Rect(50,50,250,250),Bmp);
//удаляем
delete Bmp;
/*
Собственно каждый раз создавать и удалять не следует.
Инициализационную часть можно повесить на запуск проги,
а убивать при закрытии. И не забываем перерисовывать, т.е.
делать Canvas->StretchDraw(Rect(50,50,250,250),Bmp);
на OnPaint'е формы.
*/
}
Врядле на этом много сэкономишь...
Короче делать было вечером, делать было нечего, наваял код... :P
Что бы сэкономить - надо пользоваться АПИ, а не стандартными классами билдера.
Что бы сэкономить - надо пользоваться АПИ, а не стандартными классами билдера.
Наиболее быстрый способ через Апи использовать Dib Section,например создав ее с помоью CreateDibSection или GetDIBits. Получаеш 2х мерный массив картинки и пишеш туда попиксельно. За остальным в MSDN. Или посмотри по форумам где упоминается данная функция.
Врядле на этом много сэкономишь...
Короче делать было вечером, делать было нечего, наваял код... :P
Когда нечего делать будет попробуй поработать со свойством TCanvas::CopyMode.
Что бы сэкономить - надо пользоваться АПИ, а не стандартными классами билдера.
Однако классы билдера в данном случае - чисто надстройка над функциями ГДИ АПИ. И TBitmap в независимом от устройства режиме - это тотже DIB (по скорости разницы не заметил) (DIB - device independet bitmap - Тупо двумерный массив, лежащий в памяти видюхи, как и Canvas)
И между прочим (для тех, кто код ваще смотрел), я через клас ничего и не рисую.
Кстати, засечь по нормальному время ни кто не пробовал? У меня тиккоунт там все время 0 рисует :)
Когда нечего делать будет попробуй поработать со свойством TCanvas::CopyMode.
А поточней... Работать-то - работал...
Кстати, засечь по нормальному время ни кто не пробовал? У меня тиккоунт там все время 0 рисует :)
Короче сам засек :)
По PerformanceCounter'у время работы с изображением (непосредственно с Bmp'шкой, без учета выливания на окно) на моем 2.8 Гц проце ~ 0.00005 сек.
ЗЫ: "Вы не любите кошек? Вы просто не умеете их готовить!" :D :D :D