Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.11.2008, 20:09
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Хорошо Графика... много точек

Возьмем пример: приложение в котором канва формы заполняется черным цветом этим циклом :
Код:
For x := 0 to Form.Width do
For y := 0 to FormHeight do 
Form.Canvas.Pixels[x, y] := clBlack;
И этой процедурой:
Код:
Form.Canvas.Rectangle(0,0,Form.Width, Form.Height)
Почему виндовс первое делает быстрее второго?
Как он делает это быстрее?
Как (можно такое вобще?) добиться того, что б первое делалось хотя б приблизительно как второе?
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #2  
Старый 07.11.2008, 21:51
Burka Burka вне форума
Начинающий
 
Регистрация: 10.06.2007
Сообщения: 163
Репутация: 10
По умолчанию

не знаю как ты проверял но второй вариант у меня быстрее намного выполняется.
Ответить с цитированием
  #3  
Старый 07.11.2008, 22:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Второе быстрее, т.к. нет постоянного "разрешения" точек. Еще быстрее должен быть FillRect, но, боюсь, эту разницу отследить будет тяжело.

На второй вопрос ответ простой - ScanLine. Эта процка как раз дает тебе возможность работать с памятью напрямую. При ее использовании скорость станет сравнима, а не в разы медленнее.
Ответить с цитированием
  #4  
Старый 08.11.2008, 12:35
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Стрелка

А можно поподробнее про ScanLine... Это WinApi? Как она работает? И как ее использовать?
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #5  
Старый 11.12.2008, 13:00
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Восклицание Help! Help! Help!

Народ помогите!!!!!
Я немноо не понимаю этот сканлайн... Так что поставлю вопрос подругому...
Выложите сюда плиз процедуру рисования точки в одну строку....
тоесть :
Код:
ScanLine[87,67] := Rgb(56,96,250);
Ну или так...
Код:
procedure StavTochka(x,y : Integer; r, g, b : byte);
begin
scanline... // тут собственно  скан лайн
end;
...
{use}
For i := 9 to 54 do
StavTochka...
Киньте кому не трудно...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #6  
Старый 11.12.2008, 13:00
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Восклицание Help! Help! Help!

И большая просьба не кидайте тему... Я знаю что здесь есть люди которые могут сделать то, что я прошу... А ведь оно не токо мне одному надо!
__________________
Я ни в чем никогда не уверен... И в этом тоже...

Последний раз редактировалось Interface, 11.12.2008 в 13:02.
Ответить с цитированием
  #7  
Старый 27.12.2008, 11:36
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Радость Э... может так...

Я тут про СканЛайн почитал и кажется понял суть его работы...
По видимому он дает изображение как массив пикселей...
Так может быть можно так:
1. Один раз "отсканировать" изображение Pixels'om (что должно быть долго =() ;
2. Получить массив пикселей... его же хранить вместо TImage;
3. А из полученного массива строить БитМап как это в Faq'e написано(http://www.delphisources.ru/pages/fa..._to_bmp.html);
4. Его и выводить.
Вопрос :
Будет ли приведенный мной метод работать как скан лайн?
И имеет ли это смысл?
__________________
Я ни в чем никогда не уверен... И в этом тоже...

Последний раз редактировалось Interface, 27.12.2008 в 11:38.
Ответить с цитированием
  #8  
Старый 27.12.2008, 11:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

ScanLine по сути своей есть указатель (PByteArray) на ту область памяти где храниться изображение. Один пискел изображения может быть представлен как одним (256 цветов) так и несколькими байтами этой области. Для того чтобы понять сколько байт кодируют один пиксел изображение нужно прочитать свойство PixelFormat.
Ну и далее просто пишем код
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #9  
Старый 27.12.2008, 12:06
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
Радость а все таки...

По идеи скан лайн все таки сканирует битмап и дает пользователю массив с цветами...
А то что я пишу будет в основном рисовать (ну тоесть ему и не надо знать что на рисунке нарисованно) и поэтому вобщем то скан лайн мне здесь получается не нужен...
Зато черезвычайно важно знать как быстрее всего вывести точку на экран!
И вообще что сложнее(дольше будет выполняться)?
Код:
I := sqrt(sqr(a)+sqr(b))*div 3// то есть вообще без вывода графики
или
Код:
Form1.Canvas.Pixels[5,8] := Rgb(45,45,45);
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #10  
Старый 27.12.2008, 12:54
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

есть замечательные функции SetBitmapBits() и GetBitmapBits()
_____________
долго ломал голову что это за формула: I := sqrt(sqr(a)+sqr(b))*div 3
Вообще доступ к любой ячейке массива это ширина_массива*номер_строки*размер_ячейки + номер столбца*размер_ячейки
__________________
...сказал, и загрустил от бесспорной своей правоты

Последний раз редактировалось 0nni, 27.12.2008 в 13:05.
Ответить с цитированием
  #11  
Старый 29.12.2008, 12:21
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Цитата:
долго ломал голову что это за формула: I := sqrt(sqr(a)+sqr(b))*div 3
Сорри за это чудо юдо... =)
На самом деле я просто привел два случайных действия и хочу узнать что комп будет быстрее делать считать или выводить на экран точку?
А дайте пример с SetBitmapBits() и GetBitmapBits() тобишь исходник проги (Работующей проги!)которая будет рисовать квадрат с помощью этих функций...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter