3d форум по Blender

Другое => Программирование (любое) => Тема начата: m.A от 01 Май 2023, 20:45:36

Название: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 01 Май 2023, 20:45:36
Привет. Вот приспичило мне обрабатывать некими алгоритмами массив точек(пикселей) области экрана. Чтобы была анимация неких генерируемых процессов в реальном(хотелось бы быстро чтобы наглядно) времени. Встал вопрос выбора подходящего инструмента - языка программирования. Подходящего для задачи и подходящего такому программисту, как я(в коде ниже возможна куча ошибок).
Для теста скорости отрисовки конкретным языком(библиотекой) решил просто рисовать массив точек черного или белого цвета. Как белый шум на экране аналогового тв, когда нет сигнала. И посмотреть сколько кадров в секунду вообще возможно рисовать. Ведь я еще даже не буду обрабатывать массив точек по нужному мне алгоритму, просто рандом(белый ИЛИ черный).
Попробовал Free Pascal(Lazarus). Если в лоб, то очень медленно. С разрешением поля 800х600 всего 3.5 к/с(кадров в секунду).
Рисую 60 циклов и считаю за какое время отрисовалось:
Код
begin
  myBitmap := TBitmap.Create;
  myBitmap.SetSize(800, 600);

  M1 := Now;
  for Count := 0 to 60 do
  begin
    for x := 0 to 800 do
      for y := 0 to 600 do
      begin
        if Random > 0.5 then
          myBitmap.Canvas.DrawPixel(x, y, TColorToFPColor(clWhite))
        else
          myBitmap.Canvas.DrawPixel(x, y, TColorToFPColor(clBlack));
      end;
    PaintBox1.Canvas.Draw(0, 0, myBitmap);
    //myBitmap.Free;
  end;
  M2 := Now;
  fps := 60 / (MilliSecondsBetween(M1, M2) / 1000);
  labCap := FloatToStr(fps);
  Label1.Caption := labCap;
end;

Медленно. Погуглил. Есть у Free Pascal быстрые библиотеки для манипуляции пикселями. Немного замороченные, не осилил. Да и как-то не понравилось в целом.

======================================
Ну, наверное, чистый С с какой-нибудь графической библиотекой покажет скорость? Наткнулся как раз на интересный фреймворк raylib. Код на С:
Код
#include "raylib.h"

int main(void)
{
    const int screenWidth = 1600;
    const int screenHeight = 900;
   
    InitWindow(screenWidth, screenHeight, "WhiteNoise window");

    while (!WindowShouldClose())
    {
        int x, y, rnd;
        BeginDrawing();
            for (x = 0; x < screenWidth; x++) {
                for (y = 0; y < screenHeight; y++) {
                    rnd = GetRandomValue(0, 1);
                    if(rnd==1) DrawPixel(x, y, RAYWHITE);
                    if(rnd==0) DrawPixel(x, y, BLACK);
                }
            }
            DrawFPS(0, 0); 
        EndDrawing();
    }
    CloseWindow();
    return 0;
}
С, при большем разрешении поля 1600х900 даёт всего-то 10 к/с. Интересно, что ГСЧ там не очень хороший, изображение(картинка1) как бы смещается вправо-вверх. Но это претензии не к скорости. Язык С дает всего 10 кадров? Наверное не правильную библиотеку выбрал. Или не умею его готовить.

======================================
Посмотрел, что может FreeBasic. Старый Демон плохого не посоветует же? Код:
Код
Dim As Integer screenWidth, screenHeight
screenWidth = 1600
screenHeight = 900
Screenres screenWidth, screenHeight, 32

Dim As Integer x, y, rand

Do
    If Inkey = Chr$(27) Then Exit Do 
    For x = 0 To screenWidth
        For y = 0 To screenHeight
            rand = Rnd
            If rand = 1 Then
                Pset (x, y), Rgb(255,255,255)
            Else
                Pset (x, y), Rgb(0,0,0)
            End If
        Next y
    Next x
Loop
End
Как подсчитывать в FreeBasic к/с не нашел. Но визуально около 10 к/с. И еще синхронизация с монитором не совпадает, плывет. Почитал документацию. Использовал буфер, чтобы синхронизация не плыла. Рисую 600 циклов и просто засекаю отдельным секундомером:
Код
Dim As Integer screenWidth, screenHeight
screenWidth = 1600
screenHeight = 900
ScreenRes screenWidth, screenHeight, 32

Dim As Integer x, y, rand, count

Dim image As Any Ptr = ImageCreate( screenWidth, screenHeight, RGB(0, 0, 0) )

For count = 1 To 600
   For x = 0 To screenWidth
      For y = 0 To screenHeight
         rand = Rnd
         If rand = 1 Then
            PSet image, (x, y), RGB(255, 255, 255)
         Else
            PSet image,  (x, y), RGB(0, 0, 0)
         End If
      Next y
   Next x
   
   Put (0, 0), image, PSet
   
Next count
End

FreeBasic: 600 циклов за ~45 секунд. ~13 к/с. FreeBasic медленный.

======================================
Что там далее? Попробовал язык Processing (Java):
Код
void setup() {
  size(1600, 900);
  frameRate(60);
  background(0);
}

void draw() {
  if (keyCode == ESC) exit();
  int rnd;
  for (int x = 0; x < width; x++)
  {
    for (int y = 0; y < height; y++)
    {
      rnd = (int)random(2);
      if(rnd==1) set(x, y, color(255,255,255));
      else set(x, y, color(0,0,0));
    }
  }
  String txt = String.format("Window 1   %6.2fps", frameRate);
  windowTitle(txt);
  println(frameRate);
  text(frameRate,0,0);
}

Processing: 32 к/с! Это рекорд, Java быстрее всех. А если еще переписать так:

Код
void setup() {
  size(1600, 900);
  frameRate(60);
  background(0);
}

void draw() {
  if (keyCode == ESC) exit();
  loadPixels();

  for (int i = 0; i < pixels.length; i++) {
    float rand = random(255);
    color c = color(rand);
    pixels[i] = c;
  }

  updatePixels();
  println(frameRate);
  text(frameRate, 0, 0);
}

То здесь получаем 53 к/с. Выбираю Processing.

Может кто-то перепишет примеры кода правильнее, чтобы быстрее было? Я где-то ошибся? Может кто-то напишет код на другом языке/фреймворке? Алгоритм я думаю понятен. Еще напишу, что хочется писать алгоритм обработки массива(вместо rand), а не  длиннющие портянки кода инициализации и работы с OpenGl напрямую.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 01 Май 2023, 21:52:55
Цитировать
Посмотрел, что может FreeBasic. Старый Демон плохого не посоветует же?
FreeBasic: 600 циклов за ~45 секунд. ~13 к/с. FreeBasic медленный.
Считай так... не вопрос :) Java все равно проиграет :) хотя, х.з. ... у всякого ЯП есть подводные камни...
Даже на конструкторе  GameEditor  мне попадался пример с симуляцией жидкости попиксельно (но там виртуальная машина Cи стоит, даже,а не Си)... и это работает быстро, т.к.
 OpenGL...
-------
Пока я не буду с тобой спорить... но как будет время разобраться и проверить, обязательно вернусь к этому вопросу.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Anchoret от 01 Май 2023, 23:54:33
Когда все это дело делалось на слабых машинах, то имитировалась через строчная развертка - чтобы более плавно все это дело появлялось на экране. Например на древнем ZX Spectrum кроме того, что все писалось на ассемблере, была некая экранная память - диапазон адресов экранного адресного пространства. Вот в эту "экранку" все напрямую и выгружалось строками байтов. Но это седая древность, тогда еще не было различных разрешений экрана и пр.. Как это все сейчас возможно реализовать в самом понятном для компе языке мне не ведомо)
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 00:00:16
Anchoret, на Freebasic и так, и этак и через укакзатель на видобуфер... и прямой к нему доступ через poke()...или ассемблер...
Просто у меня нет времени с этим ковыряться сейчас... я ж не программист, а любитель  :)
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 08:58:56
Как дилетант могу предложить C++ openGL . Можно поковыряться в  projectM Visualizer
An open-source library for music visualization using Milkdrop-style presets and shaders
https://github.com/projectM-visualizer
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 15:38:46

Цитировать
Привет. Вот приспичило мне обрабатывать некими алгоритмами массив точек(пикселей) области экрана. Чтобы была анимация неких генерируемых процессов в реальном(хотелось бы быстро чтобы наглядно) времени. Встал вопрос выбора подходящего инструмента - языка программирования. Подходящего для задачи и подходящего такому программисту, как я(в коде ниже возможна куча ошибок).
Для теста скорости отрисовки конкретным языком(библиотекой) решил просто рисовать массив точек черного или белого цвета. Как белый шум на экране аналогового тв, когда нет сигнала. И посмотреть сколько кадров в секунду вообще возможно рисовать. Ведь я еще даже не буду обрабатывать массив точек по нужному мне алгоритму, просто рандом(белый ИЛИ черный).
Попробовал Free Pascal(Lazarus). Если в лоб, то очень медленно. С разрешением поля 800х600 всего 3.5 к/с(кадров в секунду).
Именно из-за графики я и выбрал Freebasic. Да и с детства знаю этот ЯП.
Есть свои нюансы, естественно... но всё работает "из коробки" :)
Позже отпишусь по твоему вопросу более подробно... ты не запрещаешь прерывания, когда производишь отрисовку в видеобуфер: Screenlock, Scsreenunlock, потому у тебя и медленно... да куча там ещё вещей...
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Striver от 02 Май 2023, 15:59:02
По хорошему не должно быть НИКАКИХ попиксельных записей/чтений в видеопамять. Вся индивидуальная работа  с отдельными пискселями должна вестись с буфером в обычной памяти, а после всех циклов нужно выгружать этот буфер в видеопамять одной командой. Именно так, насколько я понял, работает второй (а, может, и первый тоже, тонкостей библиотеки Processing не знаю) вариант программы на яве, поэтому он быстрее всех и получился.

Наверное, альтернативой этому могла бы быть возня с пикселями через шейдеры чисто внутри видеопамяти, но тогда и алгоритмы придётся на glsl писать.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 16:15:56
Не знаю, чем вы тут занимаетесь, но, мне кажется стоит посмотреть в сторону готовых графических библиотек. Зачем рисовать на экране, если можно рисовать в окне в полно экранном режиме в уже приспособленных для этих целей программах
https://www.opennet.ru/docs/RUS/gtk_plus/x2486.html (https://www.opennet.ru/docs/RUS/gtk_plus/x2486.html)
или Simple C++ OpenGL program to draw points on a 2D canvas :
Код
#include<GL/glut.h>

void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);

glBegin(GL_POINTS);
glVertex2f(10.0, 10.0);
glVertex2f(150.0, 80.0);
glVertex2f(100.0, 20.0);
glVertex2f(200.0, 100.0);
glEnd();
glFlush();
}

void myinit() {
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(1.0, 0.0, 0.0);
glPointSize(5.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 499.0, 0.0, 499.0);
}

void main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("Points");
glutDisplayFunc(display);

myinit();
glutMainLoop();
}
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 16:38:06
Цитировать
Не знаю, чем вы тут занимаетесь, но, мне кажется стоит посмотреть в сторону готовых графических библиотек.
Ответ на твой вопрос, Ланухумыч:

Цитировать
Еще напишу, что хочется писать алгоритм обработки массива(вместо rand), а не  длиннющие портянки кода инициализации и работы с OpenGl напрямую.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 16:42:56
Цитировать
По хорошему не должно быть НИКАКИХ попиксельных записей/чтений в видеопамять. Вся индивидуальная работа  с отдельными пискселями должна вестись с буфером в обычной памяти, а после всех циклов нужно выгружать этот буфер в видеопамять одной командой.
Абсолютносогласен.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 16:43:15
А, что массивы и циклы в опенГЛ запрещены?
А каким способом желающий собирается объявлять цвет всех пикселей в двух словах?
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 16:47:07
Цитировать
А, что массивы и циклы в опенГЛ запрещены?
А каким способом желающий собирается объявлять цвет всех пикселей в двух словах?
в freebasic, он может на это забить... ну не надо ему OpenGL... под винду там сразу DirectX по умолчанию (если не происать рендер-движок явно)... да и может, тупо, битами и байтами манипулировать напрямую в видеобуфере, если врубится как...
Короче... вот ссылка, там дохренища инфы и примеров для freebasic: https://users.freebasic-portal.de/freebasicru/
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 16:54:41
Вот, по теме статья:
Низкоуровневая графика в FreeBASIC
https://users.freebasic-portal.de/freebasicru/lowlevelgraphics.html
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 16:55:39
А, я хочу без опенгл блендер, кинь мне ссылок сделать это на фрибейсике.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 16:58:33
А, я хочу без опенгл блендер, кинь мне ссылок сделать это на фрибейсике.
Мозг мне и себе не выёживай, пожалуйста :) Автор темы хотел ответы, думаю, он их получил. Дальше сам пусть мыслит.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 17:07:20
Хорошо, тогда я отвечу по существу вопроса: на каком яп можно быстро манипулировать пикселями?
Все об этом хорошо знают. Этот язык - ассемблер.
Цитировать
ОС на 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
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 17:17:33
Этот ассемблерный код легко вставляется в freebasic :)
Asm
код
End Asm
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 02 Май 2023, 17:24:00
А, зачем нам фрибейсик, когда мы знаем ассемблер? Пусть мы на год дольше попишем код, зато быстро-то как будет! ;D
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 02 Май 2023, 17:28:09
Цитировать
А, зачем нам фрибейсик, когда мы знаем ассемблер? Пусть мы на год дольше попишем код, зато быстро-то как будет! ;D
Критические места для быстродействия переписать... а остальное, вполне можно писать и на Си и на ином ЯП (freebasic), но не на скриптовых ЯП: Python,Java,Lua,Javascript,PHP и т.п.
Но согласен, ассемблер нужно знать, и знать как устроен комп... тогда у тебя для творчества вообще нет пределов, кроме предельных возможностей твоего оборудования.

Можно и даже ОС свою написать, при желании....
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Anchoret от 02 Май 2023, 23:26:13
Зато будет жесткая привязка к железу. К тому же процу с его набором команд. Правда последнее в случае использования каких-либо специфических и недокументированных команд, которые есть только на конкретном камне или линейке. Километры кода, зато быстродействие :) Даже печать символа на экране будет не тривиальной задачей) А всякие оконные интерфейсы так вообще жуть. Ну и разное оборудование, а точнее взаимодействие с ним в коде... Хранение данных на жестких дисках также: имитация файловой системы установленной ОС (либо использование компонентов системы, но надо знать где они живут и способы взаимодействия), написание драйвера под конкретную железяку. Да и море всего другого, что копилось и писалось годами другими программистами, и что есть в каждой ОС. Тот еще велосипед...
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 03 Май 2023, 17:27:49
Цитировать
Зато будет жесткая привязка к железу.
Для этого есть макросы, в которых можно прописать компилятору под какое оборудование прогу собирать...
Да, это головная боль... а как иначе? :)  Ну, юзайте Java и говнопитон тогда, если не хотите вникать в суть :)
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 03 Май 2023, 20:26:56
Какая мне разница, какая у меня привязка к железу жёсткая или мягкая? Вдруг кто-то макинтош подарит, то переписывать придётся?
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 06 Май 2023, 22:37:23
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


Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 07 Май 2023, 08:29:37
Спасибо за интересный вариант. Попробовал у себя: х64 - 17 к/с, х32 - 32 к/с. По скорости как первый вариант на Processing(Java).
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 26 Май 2023, 12:36:37
Наткнулся на интересную библиотеку с++  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;
}
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 28 Май 2023, 03:20:53
Цитировать
Продолжаю вести наблюдения, держу вас в курсе.  ;)
Спасибо! Интересно! Как найду время, проверю и отпишусь о результатах.
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 29 Май 2023, 19:25:51
Заменил стандартную встроенную функцию получения случайного числа на более быстрый и более случайный алгоритм, который подсмотрел там же где фреймворк взял. Теперь 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;
}
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 31 Май 2023, 00:47:37
Рисую на спрайте, который потом копируется в память видеокарты. 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;
}
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 03 Июнь 2023, 12:43:43
m.A, увы я только в Си чуток соображаю, а тут C++... не подскажешь, как мне это барахло скомпилировать на Code::Blocks?
Или, какой компилятор и IDE ты использовал?
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: LanuHum от 03 Июнь 2023, 21:01:09
Я бы в кутекреаторе попытался реализовать. Кодэблок оно более специфичное для продвинутых. Но, это лишь мнение...
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: m.A от 03 Июнь 2023, 21:13:36
Я делал в Visual Studio. Но можно и в Code::Blocks
https://youtu.be/fLXkoR4p_G0
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 03 Июнь 2023, 21:16:13
Я делал в Visual Studio. Но можно и в Code::Blocks
https://youtu.be/fLXkoR4p_G0 (https://youtu.be/fLXkoR4p_G0)
Спасибо за ссылку. Попробую...
Название: Re: Каким яп можно быстро манипулировать пикселями? (выбор яп)
Отправлено: Samovar от 07 Июль 2023, 05:28:38
Подумал, помыслил... фигня это всё и мереньё йухами :)
Нравится тебе эта хрень, используй на здоровье.... Я  буду использовать Freebasic и Ассемблер, потому, что знаю их... а кто-то Python и прочую интерпретируемую хню... или Pascal... или иной ЯП...
Один хрен, в  массовом игрострое под ОС надо всегда рассчитывать на одно ядро и на слабую архитектуру... а не на супер-пупер компы...
Про мобильные игры и браузерные молчу... не знаю, не шарю, не пробовал пока и не делал... Это пока для меня тёмный лес, увы...
------------
Да и во всём досконально шарить невозможно... оперативная память в мозгу быстро заканчивается :) Шарить надо именно в базовых принципах, тогда всё просто... собственно об этом я и трындел на БУ, и здесь, долгие годы, и трындю... это касается и искусства, и программирования..