Скорость функции.
Участников: 5
Страница 1 из 1
Скорость функции.
- Код:
Dim framebuffer As UByte Ptr,xper as integer,yper as integer,xmax=640 as integer,ymax=480 as integer
framebuffer=ScreenPtr
screenres xmax,ymax,32,1,1
do
ScreenLock
For xper = 0 To xmax-1
For yper = 0 To ymax-1
Poke framebuffer + (yper*4 * xmax) + xper*4, 127
Poke framebuffer + (yper*4 * xmax) + xper*4+1,127
Poke framebuffer + (yper*4 * xmax) + xper*4+2,127
Next
Next
ScreenUnLock
loop while multikey(1)=0
p.s. даже после просто _неприличного_ сокращения
(
xu=xmax*4
yu=xu*(ymax-1)
xg=(xmax-1)*4
.....
For xper = 0 To xg Step 4
For yper = 0 To yu Step xu
sum=xper+yper+framebuffer
Poke sum, 127
Poke 1 + sum, 127
Poke 2 + sum, 127
Next
)
Всё равно разница в разы =(
Подскажите, что не так. Или это дело в некоторой "тормознутости" фрибейсика?
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
Да конечно, если учесть что FB транслирует в чистый ассембелер, следовательно ассемблер тормоз...Или это дело в некоторой "тормознутости" фрибейсика?
Дело в том что функция line орисовывает на аппаратном уровне, грубо говоря чипу видеокарты передаются координаты двух точек, а он уже рисует линию, отсюда и выйгрыш в скорости (для етого видюшка и нужна), а при подобном методе вся нарузка ложится на процессор, оперативу и пр не предназначенное для такого оборудование...
Re: Скорость функции.
Ага! Вот почему у меня подтормаживала собственная игруха!
Вот это мен лично ужасно интересно. Какие в бейсике ф-ии помимо лайн, сёркл и т.п. отправляют запрос на видеокарту? Мне хотелось бы побольше узнать о подобных вещах.
P.S. я потому и поставил над "тормознутостью" кавычки, так как видел сравнение в скорости выполнения.
Вот это мен лично ужасно интересно. Какие в бейсике ф-ии помимо лайн, сёркл и т.п. отправляют запрос на видеокарту? Мне хотелось бы побольше узнать о подобных вещах.
P.S. я потому и поставил над "тормознутостью" кавычки, так как видел сравнение в скорости выполнения.
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
Имеется ввиду что FB сам напрямую не работает с видеокартой. Сам FB использует функции графических библиотек операционной системы, которые в свою очередь обращаются к драйверам видеокарты, а они уже работают с железом. Можно конечно и самому напрямую работать с железом, но ето довольно сложно, и заставляет переписывать прогу практически к каждой видеокарте. Хотя некоторый стандарт режимов поддерживается всеми видеокартами, об этом можно узнать из книжек 90-х годов по ассемблеру... Но всеравно, допустим XP не даст работать в адресном пространстве напрямую, поэтому для подобных экспериментов я бы порекомендовал ченить типа доса иль винду до 98, где нет таких запретов.
Re: Скорость функции.
- Код:
графических библиотек операционной системы
tux, какие именно библиотеки вы имеете ввиду? Это директ драв?
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
Библиотеки directX, openGl и подобные.
А на низком уровне работать с видяхой, особенно современной это жесть!
А на низком уровне работать с видяхой, особенно современной это жесть!
Re: Скорость функции.
-да? А в чём заключается сложности?это жесть!
Вопрос есть:
Допустим надо мне нарисовать треугольник (либо одноцветно закрашенный, либо интерполированный по вершинам). Как это устроить? (понимаю - вопрос нупкий)
насчёт opengl:
Давно ищу информацию наподобии: "ОпенЖЛ для чайников"(Дело в том, что опыта 0, а большинство сайтов для уже матёрых программеров)
Если кто-нибуть изучает опенжл, то подскажите, с чего вы начинали.
Последний раз редактировалось: Gena (Чт Янв 01, 2009 8:26 pm), всего редактировалось 1 раз(а)
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
Я как-то заглянул и пришол в ужас.
Я лучше ручками, с текстом чего-нибудь помудрю.
Хотя говорят, что openGl жить помогает.
Читать? Ну даже не знаю... А вообще заглядывайте по чаще на википедию
http://ru.wikipedia.org/w/index.php?title=OpenGL&oldid=11751656
Я лучше ручками, с текстом чего-нибудь помудрю.
Хотя говорят, что openGl жить помогает.
Читать? Ну даже не знаю... А вообще заглядывайте по чаще на википедию
http://ru.wikipedia.org/w/index.php?title=OpenGL&oldid=11751656
Re: Скорость функции.
В первом сообщении в коде ошибка. framebuffer = screenptr должно быть после вызова screenres, а то GPF гарантирован.
Мгновенно заполняет экран серой субстанцией.
Неверно. Стандартная графическая библиотека FreeBASIC'а чисто софтовая - всё рисует во внутренний фреймбуфер, находящийся в обычной памяти, а затем флипает его или средствами DirectDraw или вообще GDI. Никакого 2d/3d ускорения нет в принципе.
- Код:
Dim shared framebuffer As UByte Ptr,xper as integer,yper as integer,xmax as integer,ymax as integer
xmax=640
ymax=480
screenres xmax,ymax,32',1,1
framebuffer=ScreenPtr
do
ScreenLock
For xper = 0 To xmax-1
For yper = 0 To ymax-1
Poke framebuffer + (yper*4 * xmax) + xper*4, 127
Poke framebuffer + (yper*4 * xmax) + xper*4+1,127
Poke framebuffer + (yper*4 * xmax) + xper*4+2,127
Next
Next
ScreenUnLock
sleep 10
loop while multikey(1)=0
Мгновенно заполняет экран серой субстанцией.
tux пишет:Да конечно, если учесть что FB транслирует в чистый ассембелер, следовательно ассемблер тормоз...Или это дело в некоторой "тормознутости" фрибейсика?
Дело в том что функция line орисовывает на аппаратном уровне, грубо говоря чипу видеокарты передаются координаты двух точек, а он уже рисует линию, отсюда и выйгрыш в скорости (для етого видюшка и нужна), а при подобном методе вся нарузка ложится на процессор, оперативу и пр не предназначенное для такого оборудование...
Неверно. Стандартная графическая библиотека FreeBASIC'а чисто софтовая - всё рисует во внутренний фреймбуфер, находящийся в обычной памяти, а затем флипает его или средствами DirectDraw или вообще GDI. Никакого 2d/3d ускорения нет в принципе.
ExMortis- Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 41
Откуда : Российская Империя, уездный город Белгород
Re: Скорость функции.
Не забыл. В так называемом OpenGL режиме стандартные графические функции (точки, линии, кружки и тд) не работают, внутренний фреймбуфер по барабану. В этом режиме нужно использовать функции OpenGL напрямую.tux пишет:а как же вы забыли об интеграции с OpenGL в самом компиляторе?
ExMortis- Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 41
Откуда : Российская Империя, уездный город Белгород
Re: Скорость функции.
имхо проще разобраться в функциях OpenGL-а (те так уж там и сложно), чем изобретать велосипед... хотя если интересно, то кто запрещает, иногда полезно бывает в целях самообразованияВ этом режиме нужно использовать функции OpenGL напрямую.
Re: Скорость функции.
"Никакого 2d/3d ускорения нет в принципе." - тогда же почему ускорение есть (примерно в 5 раз)?
О. наконец-то нашёл руководство для чайников!
http://www.compgraphics.info/OpenGL/draw_a_cube.php
О. наконец-то нашёл руководство для чайников!
http://www.compgraphics.info/OpenGL/draw_a_cube.php
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
А как это было измерено? Код бенчмарка в студию! Насколько я помню, Line при рисовании закрашенного прямоугольника делает примерно следующее:Gena пишет:"Никакого 2d/3d ускорения нет в принципе." - тогда же почему ускорение есть (примерно в 5 раз)?
- Код:
Dim shared framebuffer As UByte Ptr
#include once "crt.bi"
screenres 640, 480, 32
framebuffer=ScreenPtr
do
ScreenLock
memset framebuffer, &hff7f7f7f, 640*480*4
ScreenUnLock
sleep 10
loop while multikey(1)=0
ExMortis- Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 41
Откуда : Российская Империя, уездный город Белгород
Re: Скорость функции.
А что это такое и с чем это едят?
#include once "crt.bi"
memset framebuffer, &hff7f7f7f, 640*480*4
бенчмарка
А вот _выдранный_ код:
- Код:
...
Do
t=Timer
ScreenLock
If FLAG=0 Then
Line (0,0)-(639,479),RGB(Fon.R,Fon.G,Fon.B),bf
Else
For xper = 0 To xg Step 4
For yper = 0 To yu Step xu
sum=xper+yper+framebuffer
Poke sum, 127
Poke 1 + sum, 127
Poke 2 + sum, 127
Next
Next
End if
Locate 1
Print Using "Speed: ##.####";Timer-t
ScreenUnLock
Loop while MultiKey(1) = 0
...
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
1. memset - функция стандартной библиотеки Си (libc). Описание на инглише: http://www.gnu.org/software/libc/manual/pdf/libc.pdf
2. Если уж вдаваться в подробности, то для LINE BF внутри библиотеки в функции void fb_hGfxBox(int x1, int y1, int x2, int y2, unsigned int color, int full, unsigned int style) есть такой код:
if (full) {
w = clipped_x2 - clipped_x1 + 1;
h = clipped_y2 - clipped_y1 + 1;
dest = context->line[clipped_y1] + (clipped_x1 * context->target_bpp);
for (; h; h--) {
context->pixel_set(dest, color, w); // <-------
dest += context->target_pitch;
}
Буфер заполняется построчно в одинарном цикле. Думаю, заполнение по точкам в двойном цикле будет медленнее. А что касается memset'а, то внутри скорей всего имеем ассемблер:
mov edi, offset destination
mov eax, 0xff7f7f7f
mov ecx, 640*480
cld
rep movsd
Может, есть способ и быстрее (через mmx какой-нибудь) - не знаю.
3. Между строчками
ScreenUnLock
Loop while MultiKey(1) = 0
лучше вставить sleep 10, чтобы программа не отбирала 100% процессорного времени. Иначе возникают те самые мифические "тормоза".
2. Если уж вдаваться в подробности, то для LINE BF внутри библиотеки в функции void fb_hGfxBox(int x1, int y1, int x2, int y2, unsigned int color, int full, unsigned int style) есть такой код:
if (full) {
w = clipped_x2 - clipped_x1 + 1;
h = clipped_y2 - clipped_y1 + 1;
dest = context->line[clipped_y1] + (clipped_x1 * context->target_bpp);
for (; h; h--) {
context->pixel_set(dest, color, w); // <-------
dest += context->target_pitch;
}
Буфер заполняется построчно в одинарном цикле. Думаю, заполнение по точкам в двойном цикле будет медленнее. А что касается memset'а, то внутри скорей всего имеем ассемблер:
mov edi, offset destination
mov eax, 0xff7f7f7f
mov ecx, 640*480
cld
rep movsd
Может, есть способ и быстрее (через mmx какой-нибудь) - не знаю.
3. Между строчками
ScreenUnLock
Loop while MultiKey(1) = 0
лучше вставить sleep 10, чтобы программа не отбирала 100% процессорного времени. Иначе возникают те самые мифические "тормоза".
Последний раз редактировалось: ExMortis (Пт Янв 02, 2009 4:36 pm), всего редактировалось 1 раз(а)
ExMortis- Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 41
Откуда : Российская Империя, уездный город Белгород
Re: Скорость функции.
Жаль, что с англицким плохо, но постараюсь осилить.
Спору нет, что надо слип 1 поставить =) (а то простая зацикленная програмка на вывод одной строчки занимает 10% процессорного времени, а со слип 0%)
Но это не меняет дела в моей проге.Все равно медленней.
PS я плохо читаю на си. Лучше код на фрибейсике.
Спору нет, что надо слип 1 поставить =) (а то простая зацикленная програмка на вывод одной строчки занимает 10% процессорного времени, а со слип 0%)
Но это не меняет дела в моей проге.Все равно медленней.
PS я плохо читаю на си. Лучше код на фрибейсике.
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Re: Скорость функции.
Имеется ввиду что FB сам напрямую не работает с видеокартой. Сам FB использует функции графических библиотек операционной системы, которые в свою очередь обращаются к драйверам видеокарты, а они уже работают с железом.
А вот тут я не совсем согласен (: Смотря какой компилятор. Я вот лично пользуюсь компилятором для доса, и он несколько отличается от fb for win. Но тут не совсем понятно каким компилятором пользуется создатель темы, поэтому и я внесу свою лепту. (далее речь пойдет о fb for dos)
На счет вывода на экран графики. Он адаптируется под ОС. Под виндой работает на GDK (если ДХ не установлен), если установлен - то на DirectX. Но если его запустить под досом, то вывод графики будет осуществляться напрямую к видеокарте. Оссобенно это касается видеокарт VESA, если таковой нет,-нужен специальный драйвер, для эмулирования такой видеокарты.
Что касается скорости вывода точки.
Недавно занялся тоже подобным делом, нужно было рисовать точки как можно быстрее (софтверный рендеринг 3Д), и я тоже проводил анализ Line vs ScreenPtr. Оказалось что ScreenPtr работает раз 10 быстрее. Затем откомпилил в fb for win и удивился, но тот же код работал в 2~3 раза медленнее чем в fb for dos. Почему-то ScreenPtr в fb for win работала медленнее чем в fb for dos. А как насчет сравнения вывода линий посредством Line я не проверял.
Собственно вывод: компиляторы между собой отличаются, лучше заранее говорить какой у тебя, и для какой платформы, а то мало ли, может вы о разных вещах говорите... (:
Andrew- Сообщения : 45
Дата регистрации : 2008-09-23
Возраст : 35
Откуда : Киев
Re: Скорость функции.
Я говорил про компилятор под виндоус.
Сейчас мне это особо не нужно (легче изучить опенжл, чем маяться с каждой ф-ией в софтваре)
Сейчас мне это особо не нужно (легче изучить опенжл, чем маяться с каждой ф-ией в софтваре)
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|