Board.KolibriOS.org

Official KolibriOS board
It is currently Mon May 20, 2019 8:46 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 381 posts ]  Go to page Previous 115 16 17 18 1926 Next
Author Message
 Post subject: Re: Вопрос
PostPosted: Mon Feb 29, 2016 5:49 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
viewtopic.php?f=40&t=2315&start=150


Top
   
 Post subject: Re: Вопрос
PostPosted: Tue Mar 01, 2016 9:42 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Передавать значения в процедуру, можно через стек, а можно через переменные предназначенные для приёма передачи параметров в ту процедуру.
Proc1_P1: rb 1
Proc1_p2: rb 1
Proc1_Result rb 1
Proc1:
…......
ret

START:
mov [Proc1_P1], 34
mov [Proc1_P2], 64
call Proc1
xor eax,[Proc1_Result]
…..........
Какие достоинства и недостатки передачи параметров через переменные, вместо стека ?
Главное что интересует, - можно ли сказать что это более медленный (быстрый) способ передачи данных чем через стек ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Tue Mar 01, 2016 2:02 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Передача параметров через стек — это на 100% универсальный способ. Недостаток: чтобы использовать полученные параметры во вложенных процедурах, придётся исполнить народный танец.
Использование глобальных переменных не поддерживает многопоточность и рекурсию.
Использование указателя на локальную структуру — гибридный способ, поддерживает многопоточность, у нас используется в файловых системах. Для полной рекурсии достаточно выделить новую структуру. На что похожа выборочная рекурсия, можно увидеть в ntfs.inc со строки 1116 http://websvn.kolibrios.org/filedetails ... 2Fntfs.inc
Скорость может упасть только при перемешивании с кодом большого количества отдельных глобальных переменных.


Top
   
 Post subject: Re: Вопрос
PostPosted: Tue Mar 01, 2016 5:13 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Всё время забываю спросить....
А нельзя ли настроить Fasm (Fasm Editor 2.0) таким образом чтобы можно было писать по несколько команд в одной строке ? Вот так вот:
reset1: mov dx,$0100 mov eax,pts
.m1: mov byte [eax],$ff inc eax dec dx jnz .m1
ret


Top
   
 Post subject: Re: Вопрос
PostPosted: Tue Mar 01, 2016 7:42 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Если КОС запускать в qemu.exe то dosbox в ней не заупскается. Должно ли так быть ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Mar 03, 2016 12:35 am 
Offline
User avatar

Joined: Sat Sep 27, 2014 2:59 pm
Posts: 102
[quote="ALEXS1983"]Всё время забываю спросить....
А нельзя ли настроить Fasm (Fasm Editor 2.0) таким образом чтобы можно было писать по несколько команд в одной строке ? Вот так вот:
reset1: mov dx,$0100 mov eax,pts
.m1: mov byte [eax],$ff inc eax dec dx jnz .m1
ret[/quote]

Я конечно не специалист в макросах FASM'а, но вот, навоял на досуге простейший макрос, который позволяет писать в строчку, и принимает любое кол-во параметров.

macro asm_inline [args*]
{
forward
args
}

; копирует массив байт из buffer1, в buffer2.
asm_inline <mov esi, buffer1>, <mov edi, buffer2>, <mov ecx, 22>, <cld>, <rep movsb>

После припроцессинга, макрос развернётся в следующую конструкцию...

; копирует массив байт из buffer1, в buffer2.
mov esi, buffer1
mov edi, buffer2
mov ecx, 22
cld
rep movsb


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Mar 03, 2016 11:36 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
То ли лыжи не едут..... то ли фиг его знает :-) Нужна функция быстрого вывода графики на экран в КОС ! В Дельфи (винде) есть tbitmap ( Var gamecanvas: tbitmap;) в которою передаёшь точки которые нужно перечертить, вот так вот: gamecanvas.Canvas.Pixels[PutPixel_x,PutPixel_y]:=PutPixel_color; (эта передача пикселей без прорисовки их) далее перечерчиваешь tbitmap на форме процедурой:
MainForm.Canvas.StretchDraw(rect(0,0,MainForm.Width-0,MainForm.Height-30), gamecanvas)
которая заодно растягивает tbitmap на всю форму; ну или без растяжения, - вот так вот
MainForm.Canvas.Draw(0,0,gamecanvas); (еще быстрее прорисовывает чем StretchDraw)
Если игровое поле 255х255 при частоте вывода 50 раз в секунду, да и с кешированием
вывода точек, при котором фактически присваивается канвасу приблизительно от 50х50 до 70х70 точек, то это всё работает достаточно проворно, ЧЕГО В КОС НЕ НАБЛЮДАЕТСЯ, когда используешь Функция 1 - поставить точку в окне.
Скажите пожалуйста, есть ли достаточно проворные способы вывода графики в КОС не прибегая ко всяким опенгл и директам ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 12:26 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
ALEXS1983, попробуй порисовать в gs:[колво бит на пиксель * номер пикселя]. И где-то есть функция для получения параметров графики(эти самый кол-во бит на пиксель), там и про этот gs:[...] написано. Типа DirectDraw - прямой доступ к видеопамяти)


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 12:42 am 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Сам по себе системный вызов это где-то 1000 тактов. Кошерный способ — функция 65. Быстро выводить случайные пиксели можно только через видеобуфер по адресу FE000000h, но это может рисовать поверх других окон.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 9:23 am 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
"попробуй порисовать в gs:[колво бит на пиксель * номер пикселя]. И где-то есть функция для получения параметров графики(эти самый кол-во бит на пиксель), там и про этот gs:[...] написано. Типа DirectDraw - прямой доступ к видеопамяти)"

"Быстро выводить случайные пиксели можно только через видеобуфер по адресу FE000000h, но это может рисовать поверх других окон."

А МОЖНО ОБ ЭТОМ ПОПОДРОБНЕЙ ?!... И ХОТЯ БЫ С КУСОЧКОМ КОДА ПРИМЕРА КАК ЭТО ДЕЛАЕТСЯ!


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 2:42 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
ALEXS1983 wrote:
"попробуй порисовать в gs:[колво бит на пиксель * номер пикселя]. И где-то есть функция для получения параметров графики(эти самый кол-во бит на пиксель), там и про этот gs:[...] написано. Типа DirectDraw - прямой доступ к видеопамяти)"

"Быстро выводить случайные пиксели можно только через видеобуфер по адресу FE000000h, но это может рисовать поверх других окон."

А МОЖНО ОБ ЭТОМ ПОПОДРОБНЕЙ ?!... И ХОТЯ БЫ С КУСОЧКОМ КОДА ПРИМЕРА КАК ЭТО ДЕЛАЕТСЯ!

Нельзя. Не слушай про запись через gs. Слушай Pathoswithin и используй функцию 65 либо функцию 7.

_________________
Сделаем мир лучше!


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 3:33 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Прямой вывод в видеобуфер это только для полноэкранных приложений или рисования совсем уж случайных пикселей, вроде снега на экране, но такой эффект нужно отключать, если окно неактивно.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 3:49 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Pathoswithin, ну кинь код, - рассмотрю!
Вот еще есть вопрос, может быть конечно смешной и примитивный, но всё таки мне надо уточнить:
Быстродействие в КОС является таким же как в винде (на данной машине)?... ну конечно при условии использования исключительно арифметических команд асма, переходов, присваивания ячейкам памяти и прочее ?
Проще выражаясь, если написана процедура (на асме) с циклами обрабатывающая очень много данных массивов... плюсы... минусы.... ксоренье и пересылка данных между массивами.... имеющая множество вложенных вызовов (CALL) из процедуру в процедуру, без использования int и api и прочего.... короче, :-) если длительность выполнения такой процедуры в винде будет занимать 5 секунд, то на КОС, Я НАДЕЮСЬ, она тоже будет выполняться в пределах такого же времени?.... а не 40 сек ?... и даже не 10 сек? ТАК ОНО ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 4:44 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Ну по адресу FE000000h начинается обычное растровое изображение экрана.
Функцией 61.2 получаешь количество бит на пиксель (например 32), считаешь количество байт на пиксель (делишь на 8), умножаешь на Х.
Функцией 61.3 получаешь длину строки, умножаешь на Y.
Всё складываешь.
Ложишь по адресу цвет пикселя.
Но зачем тебе выводить отдельные пиксели?

Скорость работы самого кода — одинаковая.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Mar 04, 2016 8:11 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1619
ALEXS1983 wrote:
Pathoswithin, ну кинь код, - рассмотрю!
Вот еще есть вопрос, может быть конечно смешной и примитивный, но всё таки мне надо уточнить:
Быстродействие в КОС является таким же как в винде (на данной машине)?... ну конечно при условии использования исключительно арифметических команд асма, переходов, присваивания ячейкам памяти и прочее ?
Проще выражаясь, если написана процедура (на асме) с циклами обрабатывающая очень много данных массивов... плюсы... минусы.... ксоренье и пересылка данных между массивами.... имеющая множество вложенных вызовов (CALL) из процедуру в процедуру, без использования int и api и прочего.... короче, :-) если длительность выполнения такой процедуры в винде будет занимать 5 секунд, то на КОС, Я НАДЕЮСЬ, она тоже будет выполняться в пределах такого же времени?.... а не 40 сек ?... и даже не 10 сек? ТАК ОНО ?

Если писать с глобальными переменными на каждую процедуру и прочими деоптимизациями - будет медленнее. Хотя вряд ли в 8 раз, конечно. Но Колибри тут ни при чём, такой код в винде будет тормозить ровно так же.

_________________
Сделаем мир лучше!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 381 posts ]  Go to page Previous 115 16 17 18 1926 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited