Скорость функции.

Предыдущая тема Следующая тема Перейти вниз

Скорость функции.

Сообщение  Gena в Ср Дек 31, 2008 9:19 pm

Код:

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
Это самая простая ф-ия для заполнения экрана точками которую я написал. Но она проигрывает состязание с обычной функцией LINE (~ в три-семь раза дольше) Почему так?
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
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  tux в Ср Дек 31, 2008 11:59 pm

Или это дело в некоторой "тормознутости" фрибейсика?
Да конечно, если учесть что FB транслирует в чистый ассембелер, следовательно ассемблер тормоз...
Дело в том что функция line орисовывает на аппаратном уровне, грубо говоря чипу видеокарты передаются координаты двух точек, а он уже рисует линию, отсюда и выйгрыш в скорости (для етого видюшка и нужна), а при подобном методе вся нарузка ложится на процессор, оперативу и пр не предназначенное для такого оборудование...
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 01, 2009 4:18 pm

Ага! Вот почему у меня подтормаживала собственная игруха!
Вот это мен лично ужасно интересно. Какие в бейсике ф-ии помимо лайн, сёркл и т.п. отправляют запрос на видеокарту? Мне хотелось бы побольше узнать о подобных вещах.
P.S. я потому и поставил над "тормознутостью" кавычки, так как видел сравнение в скорости выполнения.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  tux в Чт Янв 01, 2009 4:57 pm

Имеется ввиду что FB сам напрямую не работает с видеокартой. Сам FB использует функции графических библиотек операционной системы, которые в свою очередь обращаются к драйверам видеокарты, а они уже работают с железом. Можно конечно и самому напрямую работать с железом, но ето довольно сложно, и заставляет переписывать прогу практически к каждой видеокарте. Хотя некоторый стандарт режимов поддерживается всеми видеокартами, об этом можно узнать из книжек 90-х годов по ассемблеру... Но всеравно, допустим XP не даст работать в адресном пространстве напрямую, поэтому для подобных экспериментов я бы порекомендовал ченить типа доса иль винду до 98, где нет таких запретов.
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 01, 2009 5:06 pm

Код:
графических библиотек операционной системы
- интересно. Мне было бы интересно работать именно на "низком" уровне.
tux, какие именно библиотеки вы имеете ввиду? Это директ драв?

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Eric-S в Чт Янв 01, 2009 5:56 pm

Библиотеки directX, openGl и подобные.

А на низком уровне работать с видяхой, особенно современной это жесть!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 01, 2009 7:41 pm

это жесть!
-да? А в чём заключается сложности?
Вопрос есть:
Допустим надо мне нарисовать треугольник (либо одноцветно закрашенный, либо интерполированный по вершинам). Как это устроить? (понимаю - вопрос нупкий)
насчёт opengl:
Давно ищу информацию наподобии: "ОпенЖЛ для чайников"(Дело в том, что опыта 0, а большинство сайтов для уже матёрых программеров)
Если кто-нибуть изучает опенжл, то подскажите, с чего вы начинали.


Последний раз редактировалось: Gena (Чт Янв 01, 2009 8:26 pm), всего редактировалось 1 раз(а)

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Eric-S в Чт Янв 01, 2009 8:22 pm

Я как-то заглянул и пришол в ужас.
Я лучше ручками, с текстом чего-нибудь помудрю.

Хотя говорят, что openGl жить помогает.

Читать? Ну даже не знаю... А вообще заглядывайте по чаще на википедию
http://ru.wikipedia.org/w/index.php?title=OpenGL&oldid=11751656

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  ExMortis в Чт Янв 01, 2009 8:54 pm

В первом сообщении в коде ошибка. framebuffer = screenptr должно быть после вызова screenres, а то GPF гарантирован.
Код:


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

Мгновенно заполняет экран серой субстанцией. Smile

tux пишет:
Или это дело в некоторой "тормознутости" фрибейсика?
Да конечно, если учесть что FB транслирует в чистый ассембелер, следовательно ассемблер тормоз...
Дело в том что функция line орисовывает на аппаратном уровне, грубо говоря чипу видеокарты передаются координаты двух точек, а он уже рисует линию, отсюда и выйгрыш в скорости (для етого видюшка и нужна), а при подобном методе вся нарузка ложится на процессор, оперативу и пр не предназначенное для такого оборудование...

Неверно. Стандартная графическая библиотека FreeBASIC'а чисто софтовая - всё рисует во внутренний фреймбуфер, находящийся в обычной памяти, а затем флипает его или средствами DirectDraw или вообще GDI. Никакого 2d/3d ускорения нет в принципе.
avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  tux в Чт Янв 01, 2009 9:11 pm

а как же вы забыли об интеграции с OpenGL в самом компиляторе?
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  ExMortis в Чт Янв 01, 2009 9:21 pm

tux пишет:а как же вы забыли об интеграции с OpenGL в самом компиляторе?
Не забыл. В так называемом OpenGL режиме стандартные графические функции (точки, линии, кружки и тд) не работают, внутренний фреймбуфер по барабану. В этом режиме нужно использовать функции OpenGL напрямую.
avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  tux в Чт Янв 01, 2009 9:28 pm

В этом режиме нужно использовать функции OpenGL напрямую.
имхо проще разобраться в функциях OpenGL-а (те так уж там и сложно), чем изобретать велосипед... хотя если интересно, то кто запрещает, иногда полезно бывает в целях самообразования
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 28
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 01, 2009 10:26 pm

"Никакого 2d/3d ускорения нет в принципе." - тогда же почему ускорение есть (примерно в 5 раз)?
О. наконец-то нашёл руководство для чайников! bounce bounce cheers cheers
http://www.compgraphics.info/OpenGL/draw_a_cube.php

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  ExMortis в Чт Янв 01, 2009 11:09 pm

Gena пишет:"Никакого 2d/3d ускорения нет в принципе." - тогда же почему ускорение есть (примерно в 5 раз)?
А как это было измерено? Код бенчмарка в студию! Насколько я помню, Line при рисовании закрашенного прямоугольника делает примерно следующее:


Код:
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
avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 01, 2009 11:16 pm


#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
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  ExMortis в Чт Янв 01, 2009 11:42 pm

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% процессорного времени. Иначе возникают те самые мифические "тормоза".


Последний раз редактировалось: ExMortis (Пт Янв 02, 2009 4:36 pm), всего редактировалось 1 раз(а)
avatar
ExMortis

Сообщения : 11
Дата регистрации : 2009-01-01
Возраст : 34
Откуда : Российская Империя, уездный город Белгород

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Пт Янв 02, 2009 3:20 pm

Жаль, что с англицким плохо, но постараюсь осилить.
Спору нет, что надо слип 1 поставить =) (а то простая зацикленная програмка на вывод одной строчки занимает 10% процессорного времени, а со слип 0%)
Но это не меняет дела в моей проге.Все равно медленней.
PS я плохо читаю на си. Лучше код на фрибейсике.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Andrew в Чт Янв 15, 2009 4:59 pm

Имеется ввиду что 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
Возраст : 28
Откуда : Киев

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Gena в Чт Янв 15, 2009 5:20 pm

Я говорил про компилятор под виндоус.
Сейчас мне это особо не нужно (легче изучить опенжл, чем маяться с каждой ф-ией в софтваре)

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 23
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Скорость функции.

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения