![]() |
|
#1
|
|||
|
|||
![]() Год(может 2) назад у меня появилась задача: вывести большое количество точек на экран... Конечно сначала я наивно использовал:
Код:
Image1.Canvas.Pixels[x,y] := clWhite // Это для примера Код:
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
|
||||
|
||||
![]() Есть такая API функция BitBlt (подробнее смотри в сети)...
http://www.codenet.ru/progr/delphi/WinAPI/BitBit.php Дальше нужно создать буфер Код:
Buffer: TBItMap Код:
Buffer.Canvas.LineTo(...); Это самый быстрый способ вывести на экран изображение без аппаратной акселерации... Вот пример http://www.vbstreets.ru/VB/Articles/65569.aspx В начале был Бит, потом Байт и только потом появилось Слово... |
#3
|
|||
|
|||
![]() Мне надо нарисовать точку!!! Не линию.. не прямоугольник, а точку! А то что ты кинул скорее походит на то, как избавиться от "мерцания"
Я ни в чем никогда не уверен... И в этом тоже... ![]() |
#4
|
||||
|
||||
![]() Цитата:
Какая собственно разница что нарисовано??? Линия, точка или окружность??? Код:
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; В начале был Бит, потом Байт и только потом появилось Слово... Последний раз редактировалось NIch, 05.06.2010 в 20:24. |
#5
|
||||
|
||||
![]() для вывода точек быстрее ScanLine нету способа.
Arrrgh |
#6
|
|||
|
|||
![]() Цитата:
Всмысле какая разница!? ![]() Код:
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; У меня нет проблемы нарисовать точку вобще... Мне надо сделать это очень (!!!) быстро... Цитата:
Поставлю вопрос иначе... Можно ли в Windows нарисовать 1 точку способом быстрее ScanLine'a и если да то как? Я ни в чем никогда не уверен... И в этом тоже... ![]() |
#7
|
||||
|
||||
![]() Цитата:
Не ты первый подобным вопросом задался... 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
|
||||
|
||||
![]() Цитата:
Arrrgh |
#9
|
|||
|
|||
![]() Итак поскольку на мои конкретные вопросы, я лишь получаю намеки о их некорректности... Я копну глубже... Задав такой вопрос, который, имхо, таким назвать нельзя... Итак: Меня интересует полный порядок перехода от графического файла к изображению на экране. С хотя бы приблизительными значениями затратами процессорного времени Представляю я себе этот порядок приблизительно так...
-Считывание файла в оперативную память -Перенос в ОЗУ видеокарты ... ну и т.д. Это я привел в пример и скорее всего это далеко от истины... Очень надеюсь на вашу помощь... Я ни в чем никогда не уверен... И в этом тоже... ![]() |