Автор Тема: Каким яп можно быстро манипулировать пикселями? (выбор яп)  (Прочитано 1754 раз)

Оффлайн LanuHum

  • Житель
Хорошо, тогда я отвечу по существу вопроса: на каком яп можно быстро манипулировать пикселями?
Все об этом хорошо знают. Этот язык - ассемблер.
Цитировать
ОС на Assembler
Форум программистов и сисадминов Киберфорум > Форум программистов > Низкоуровневое программирование > Assembler, MASM, TASM > ОС на Assembler
Как нарисовать пиксель?
вопрос:
Здравствуйте, делаю мега-примитивную OC, скажите пожалуйста, как правильно закрасить пиксель каким нибудь цветом, под словом "правильно", я подразумеваю, что как лучше в видеобуффер загружать каким-то образом пиксель или вообще сделать универсальный мини-драйвер, и куда тогда лучше смотреть ?
ответ:
Как-то занимался я регистрами видеокарты. Щас надо поднимать старый исходник. Почитай Роберта Джордейна он рассказывает как это работает. И второе поищи инфу о стандарте ultra vbe 2.0 на картах с этим стандартом можно рисовать в svga без драйверов(почти все современные поддерживают этот стандарт).

ps: Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT
рандом на ассемблере:
Код
random:
push cx
push dx
push di
 
mov dx, word [seed]
or dx, dx
jnz @f
rdtsc
mov dx, ax
@@:
mov ax, word [seed2]
or ax, ax
jnz @f
in ax, 40h
@@:
mul dx
inc ax
mov word [seed], dx
mov word [seed2], ax
 
xor dx, dx
sub di, si
inc di
div di
mov ax, dx
add ax, si
 
pop di
pop dx
pop cx
ret

Оффлайн Samovar

  • Житель
Этот ассемблерный код легко вставляется в freebasic :)
Asm
код
End Asm

Оффлайн LanuHum

  • Житель
А, зачем нам фрибейсик, когда мы знаем ассемблер? Пусть мы на год дольше попишем код, зато быстро-то как будет! ;D

Оффлайн Samovar

  • Житель
Цитировать
А, зачем нам фрибейсик, когда мы знаем ассемблер? Пусть мы на год дольше попишем код, зато быстро-то как будет! ;D
Критические места для быстродействия переписать... а остальное, вполне можно писать и на Си и на ином ЯП (freebasic), но не на скриптовых ЯП: Python,Java,Lua,Javascript,PHP и т.п.
Но согласен, ассемблер нужно знать, и знать как устроен комп... тогда у тебя для творчества вообще нет пределов, кроме предельных возможностей твоего оборудования.

Можно и даже ОС свою написать, при желании....

Оффлайн Anchoret

  • Житель
Зато будет жесткая привязка к железу. К тому же процу с его набором команд. Правда последнее в случае использования каких-либо специфических и недокументированных команд, которые есть только на конкретном камне или линейке. Километры кода, зато быстродействие :) Даже печать символа на экране будет не тривиальной задачей) А всякие оконные интерфейсы так вообще жуть. Ну и разное оборудование, а точнее взаимодействие с ним в коде... Хранение данных на жестких дисках также: имитация файловой системы установленной ОС (либо использование компонентов системы, но надо знать где они живут и способы взаимодействия), написание драйвера под конкретную железяку. Да и море всего другого, что копилось и писалось годами другими программистами, и что есть в каждой ОС. Тот еще велосипед...

Оффлайн Samovar

  • Житель
Цитировать
Зато будет жесткая привязка к железу.
Для этого есть макросы, в которых можно прописать компилятору под какое оборудование прогу собирать...
Да, это головная боль... а как иначе? :)  Ну, юзайте Java и говнопитон тогда, если не хотите вникать в суть :)

Оффлайн LanuHum

  • Житель
Какая мне разница, какая у меня привязка к железу жёсткая или мягкая? Вдруг кто-то макинтош подарит, то переписывать придётся?

Оффлайн Samovar

  • Житель
m.A, вот, поправил, через указатель на видеобуфер. Это работает быстрей, чем оператор Pset. Две видеостраницы. Рисуем в одной, потом копируем в другую. На моём компе 24-25 кадров в секунду. Лучше собирать под x32 ( в x64 тупит, почему-то... надо допетривать, почему).


Freebasic

Код
Const screenWidth = 1600
Const screenHeight = 900
ScreenRes screenWidth, screenHeight, 32,2
Dim As Integer w, h, depth, frames, fps, x, y, rand
Dim As String driver, s
Dim As Double t
t = Timer
Screeninfo w,h,depth,,,,driver
?
? " "& w & " x " & h & " x " & depth
?
? " Using driver " & driver
?
? " Press any key"
Sleep
ScreenSet 1, 0
Dim As Ulong Ptr p = Screenptr, dest
Do
   dest = p
   Screenlock
   For x = 0 To screenWidth-1
      For y = 0 To screenHeight-1
         rand = Rnd
         *dest = Iif (rand=1,&hffffffff,0)
         dest += 1
      Next y
   Next x
   Screenunlock
   Pcopy 1,0
   s = "fps: " & fps
   Windowtitle s
    If Int(t) <> Int(Timer) Then
        t = Timer
        fps = frames
        frames = 0
    End If
    frames += 1
   Sleep 1,1
Loop until inkey=Chr(27)
End



Оффлайн m.A

  • Житель
Спасибо за интересный вариант. Попробовал у себя: х64 - 17 к/с, х32 - 32 к/с. По скорости как первый вариант на Processing(Java).

Оффлайн m.A

  • Житель
Наткнулся на интересную библиотеку с++  https://github.com/OneLoneCoder/olcPixelGameEngine
Там прямо даётся хеловорлд почти как надо(изменил на чёрно-белый и размер пикселей уменьшил).
Стабильно 40 к/с. Продолжаю вести наблюдения, держу вас в курсе.  ;)

Код
#define OLC_PGE_APPLICATION
#include "olcPixelGameEngine.h"

class Example : public olc::PixelGameEngine
{
public:
Example()
{
sAppName = "Example";

}

public:
bool OnUserCreate() override
{
// Called once at the start, so create things here
return true;
}

bool OnUserUpdate(float fElapsedTime) override
{
// called once per frame
for (int x = 0; x < ScreenWidth(); x++)
for (int y = 0; y < ScreenHeight(); y++)
//Draw(x, y, olc::Pixel(rand() % 255, rand() % 255, rand() % 255));
if (rand() % 2) Draw(x, y, olc::Pixel(olc::BLACK));
else Draw(x, y, olc::Pixel(olc::WHITE));
return true;
}
};


int main()
{
Example demo;
if (demo.Construct(1600, 900, 1, 1))
demo.Start();

return 0;
}

Оффлайн Samovar

  • Житель
Цитировать
Продолжаю вести наблюдения, держу вас в курсе.  ;)
Спасибо! Интересно! Как найду время, проверю и отпишусь о результатах.

Оффлайн m.A

  • Житель
Заменил стандартную встроенную функцию получения случайного числа на более быстрый и более случайный алгоритм, который подсмотрел там же где фреймворк взял. Теперь 150-170 к/с
Код
#define OLC_PGE_APPLICATION
#include "olcPixelGameEngine.h"

class Example : public olc::PixelGameEngine
{
public:
Example()
{
sAppName = "White Noise";

}

public:
bool OnUserCreate() override
{
// Called once at the start, so create things here
return true;
}

bool OnUserUpdate(float fElapsedTime) override
{
// called once per frame
for (int x = 0; x < ScreenWidth(); x++)
for (int y = 0; y < ScreenHeight(); y++)
{
bool bBlWt = false;
bBlWt = rnd() % 2;
Draw(x, y, bBlWt ? olc::Pixel(olc::BLACK) : olc::Pixel(olc::WHITE));
}
return true;
}

private:
uint32_t nProcGen = 0;

uint32_t rnd() //fast random alg Lehmer
{
nProcGen += 0xe120fc15;
uint64_t tmp;
tmp = (uint64_t)nProcGen * 0x4a39b70d;
uint32_t m1 = (tmp >> 32) ^ tmp;
tmp = (uint64_t)m1 * 0x12fad5c9;
uint32_t m2 = (tmp >> 32) ^ tmp;
return m2;
}

};


int main()
{
Example demo;
if (demo.Construct(1600, 900, 1, 1))
demo.Start();

return 0;
}

Оффлайн m.A

  • Житель
Рисую на спрайте, который потом копируется в память видеокарты. 220-250 к/с

Код
#define OLC_PGE_APPLICATION
#include "olcPixelGameEngine.h"

class Example : public olc::PixelGameEngine
{
public:
Example()
{
sAppName = "White Noise";

}

public:
bool OnUserCreate() override
{
sprDemo = new olc::Sprite(ScreenWidth(), ScreenHeight());
decDemo = new olc::Decal(sprDemo);
return true;
}

bool OnUserUpdate(float fElapsedTime) override
{
for (int x = 0; x < ScreenWidth(); x++)
for (int y = 0; y < ScreenHeight(); y++)
{
sprDemo->SetPixel(x, y, rnd() % 2 ? olc::Pixel(olc::BLACK) : olc::Pixel(olc::WHITE));
}
decDemo->Update();
DrawDecal({ 0, 0 }, decDemo);
return true;
}

private:
olc::Sprite* sprDemo = nullptr;
olc::Decal* decDemo = nullptr;


uint32_t nProcGen = 0;

uint32_t rnd() //fast random alg Lehmer
{
nProcGen += 0xe120fc15;
uint64_t tmp;
tmp = (uint64_t)nProcGen * 0x4a39b70d;
uint32_t m1 = (tmp >> 32) ^ tmp;
tmp = (uint64_t)m1 * 0x12fad5c9;
uint32_t m2 = (tmp >> 32) ^ tmp;
return m2;
}

};

int main()
{
Example demo;
if (demo.Construct(1600, 900, 1, 1))
demo.Start();

return 0;
}

Оффлайн Samovar

  • Житель
m.A, увы я только в Си чуток соображаю, а тут C++... не подскажешь, как мне это барахло скомпилировать на Code::Blocks?
Или, какой компилятор и IDE ты использовал?
« Последнее редактирование: 03 Июнь 2023, 13:24:41 от Samovar »

Оффлайн LanuHum

  • Житель
Я бы в кутекреаторе попытался реализовать. Кодэблок оно более специфичное для продвинутых. Но, это лишь мнение...

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 29
Автор: LEXA ANЭGROWND
blender.png
Скачано: 51
Автор: ipv2007
4.png
Скачано: 72
Автор: hiroyukiss
2.png
Скачано: 69
Автор: hiroyukiss

Скачано: 74
Автор: Dilifa12