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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.06.2010, 10:55
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию Быстрая графика

Год(может 2) назад у меня появилась задача: вывести большое количество точек на экран... Конечно сначала я наивно использовал:
Код:
Image1.Canvas.Pixels[x,y] := clWhite // Это для примера
Естественно, что оно жутко тормозило... Некоторые люди читающие это сообщение уже принялись рассказывать о чудесах ScanLine, о том что оно способно работать прямо с памятью... и естественно весьма скоро я сам нагуглил сканлайн и даже научился его правильно использовать. Прирост скорости был действительно больших и вобщем то этот способ достаточно неплох... Но позже я решил опробывать другой способ: Он был основан на создании DIB'a и последующией работе с ним по такой схеме
Код:
  for x := 0 to SX - 1 do for y := 0 to SY - 1 do
    TBig(Scr^)[x + y * SX] := RGB(Random(256),Random(256),Random(256));
(кому надо могу выложить исходник)
И вобщем то прирост скорости был тот же...
Проблема в том, что мне мало этого прироста... Паралельно изучая ассемблер, я узнал, что тот для рисования обращается к видеопамяти и понял, что это будет несколько быстрее того, что есть... И вообще пришел к выводу, что для непосредственно вывода точек желательно использовать ресурсы видеокарты... Но насколько мне известно напрямую это возможно в Dos, но естественно писать на него какие либо приложения сейчас нет смысла... зато у Windows есть тот самый DirectX, позволяющий использовать ресурсы видеокарты, но дело в том, что скоко я не гуглил так и не смог найти как в нем вывести на экран N-ое кол-во точек... сплошные спрайты, 3д, развороты, прозрачность... а мне всего то надо вывести множество точек... при том я уверен что сделать это быстро вполне реально, ведь как то это реализуется самим компом и ОС... То есть вывод спрайта - есть вывод ряда точек (на аппаратном уровне это точно так), а раз так то можно предположить что либо этот спрайт, либо изображение всего экрана где то храниться, и я так понимаю это и есть видеопамять(или видеобуфер, не знаю как это правильно называется...)... Так Вот мне необходимо получить туда доступ. Как это сделать? Как редактировать изображение непосредственно перед его выводом на экран? Как вобще работают полноэкранные приложения выводящие по 1024*768 и более (реже менее) точек?.. Понимаю что они не занимаются этим, а лишь передают эту задачу Windows(или чему то еще), DirectX'у, видеокарте, но возможно есть смысл позаимствовать их методы.
Итак... Как максимально быстро вывести на экран большое количество точек?
Если не сложно выложите исходники... Если я где то ошибся в рассуждениях - отпишитесь об этом плиз... Если есть литература по этой теме - дайте ссыль
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #2  
Старый 04.06.2010, 12:48
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Есть такая API функция BitBlt (подробнее смотри в сети)...
http://www.codenet.ru/progr/delphi/WinAPI/BitBit.php
Дальше нужно создать буфер
Код:
Buffer: TBItMap
Рисовать все на буфере
Код:
Buffer.Canvas.LineTo(...);
Потом буфер при помощи функции BitBlt выводить на форму...
Это самый быстрый способ вывести на экран изображение без аппаратной акселерации...
Вот пример
http://www.vbstreets.ru/VB/Articles/65569.aspx
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #3  
Старый 04.06.2010, 13:00
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Мне надо нарисовать точку!!! Не линию.. не прямоугольник, а точку! А то что ты кинул скорее походит на то, как избавиться от "мерцания"
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #4  
Старый 05.06.2010, 20:18
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Цитата:
скорее походит на то, как избавиться от "мерцания"
Тема как называется???
Какая собственно разница что нарисовано???
Линия, точка или окружность???
Код:
Randomize;
for i := 1 to 100000 do
begin
 X := Random(Buffer.Width);
 y := Random(Buffer.Height);
 Cl := Random(9999); 
 Buffer.Canvas.Pixels(X, Y,) = Cl;
end;
100000 точек в случайных координатах случайного цвета...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...

Последний раз редактировалось NIch, 05.06.2010 в 20:24.
Ответить с цитированием
  #5  
Старый 05.06.2010, 22:56
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

для вывода точек быстрее ScanLine нету способа.
__________________
Arrrgh
Ответить с цитированием
  #6  
Старый 07.06.2010, 09:09
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Цитата:
Тема как называется???
Какая собственно разница что нарисовано???
Линия, точка или окружность???
Тема называется "быстрая графика"...
Всмысле какая разница!? Мне не нужна окружность или линия!!! Мне нужна точка!!!
Код:
Randomize;
for i := 1 to 100000 do
begin
 X := Random(Buffer.Width);
 y := Random(Buffer.Height);
 Cl := Random(9999); 
 Buffer.Canvas.Pixels(X, Y,) = Cl;
end;
Ну и?.. Ты представляешь сколько на это уйдет процессорного времени?!
У меня нет проблемы нарисовать точку вобще... Мне надо сделать это очень (!!!) быстро...
Цитата:
для вывода точек быстрее ScanLine нету способа.
Высокоуровневых - возможно... однако полноэкранные приложения... да и сам Windows у меня на компе отрисовывают 1440*900 точек куда быстрее чем я 100*100 ScanLine'om или 10*10 способом NIch'a
Поставлю вопрос иначе...
Можно ли в Windows нарисовать 1 точку способом быстрее ScanLine'a и если да то как?
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
  #7  
Старый 07.06.2010, 09:39
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Цитата:
Мне надо сделать это очень (!!!) быстро...
Тогда наверное только методами DiretX или OpenGL...
Не ты первый подобным вопросом задался...
http://www.gamedev.ru/code/forum/?id=123160
http://forum.sources.ru/index.php?showtopic=280959
http://www.helloworld.ru/texts/comp/...opengl_03.html

ЗЫ
Цитата:
Всмысле какая разница!? Мне не нужна окружность или линия!!! Мне нужна точка!!!
А гнев свой можешь оставить при себе...Тебе НИКТО НИЧЕМ не обязан...
Цитата:
Поставлю вопрос иначе...
Ставит вопрос начальство, а ты выражай просьбу, тут тоже люди...У каждого свое мнение, свой уровень знаний и понятий, и свои амбиции...
Если считаешь себя умнее (продвинутее) других, то не показывай этого...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #8  
Старый 07.06.2010, 14:58
Аватар для urahara
urahara urahara вне форума
Новичок
 
Регистрация: 16.01.2010
Сообщения: 86
Репутация: 35
По умолчанию

Цитата:
Сообщение от Interface
Можно ли в Windows нарисовать 1 точку способом быстрее ScanLine'a и если да то как?
"Windows" попиксельно не чего не выводит.
__________________
Arrrgh
Ответить с цитированием
  #9  
Старый 08.06.2010, 14:25
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Итак поскольку на мои конкретные вопросы, я лишь получаю намеки о их некорректности... Я копну глубже... Задав такой вопрос, который, имхо, таким назвать нельзя... Итак: Меня интересует полный порядок перехода от графического файла к изображению на экране. С хотя бы приблизительными значениями затратами процессорного времени Представляю я себе этот порядок приблизительно так...
-Считывание файла в оперативную память
-Перенос в ОЗУ видеокарты
... ну и т.д. Это я привел в пример и скорее всего это далеко от истины...
Очень надеюсь на вашу помощь...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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