LINUX.ORG.RU

На каком яп можно так же легко и просто манипулировать пикселями?

 , ,


1

2

В процессе поисков яп для некоторых задач узнал про https://processing.org/, вопрос в заголовке. Нужно примерно такое https://i.imgur.com/Yy6BNwC.png то есть короткий, легкий для понимания код. В принципе processing устраивает, но вдруг есть какой-то искомый яп, с заданными хотелками, без vm java, достаточно производительный и такой же простой? Можно и не очень простой, если выбора совсем нет.Желательно без адовых портянок инициализации графики. Пример на скриншоте запущен на intel q6600. Сори за виндовс. Если накидаете аналог моего примера на предложенном вами яп, то вообще будет здорово!

void setup() {
  size(640, 480);
  //frameRate(60);
  background(0); 
}

void draw() {
  int stMillis = millis();
  
  for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
      if((int)random(2)==1) set(x, y, color(255,255,255));
      else set(x, y, color(0,0,0));
    }
  }
  
  float fps = 1000.0/float((millis() - stMillis));
  fill(0, 0, 0);
  rect(2, 2, 140, 35);
  fill(255, 50, 50);
  textSize(32);
  text(fps, 5, 30);
}

Кому интересно, вот что транслируется из примера выше в *.java:

import processing.core.*; 
import processing.data.*; 
import processing.event.*; 
import processing.opengl.*; 

import java.util.HashMap; 
import java.util.ArrayList; 
import java.io.File; 
import java.io.BufferedReader; 
import java.io.PrintWriter; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

public class noise extends PApplet {

public void setup() {
  
  //frameRate(60);
  background(0); 
}

public void draw() {
  int stMillis = millis();
  
  for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
      if((int)random(2)==1) set(x, y, color(255,255,255));
      else set(x, y, color(0,0,0));
    }
  }
  
  float fps = 1000.0f/PApplet.parseFloat((millis() - stMillis));
  fill(0, 0, 0);
  rect(2, 2, 140, 35);
  fill(255, 50, 50);
  textSize(32);
  text(fps, 5, 30);
}
  public void settings() {  size(640, 480); }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "noise" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}

Это же трындец сколько импортов всяких писать! Ну и если бы писал на чисто java без import processing думаю было бы все не так просто.

Ответ на: комментарий от Deleted
#include <SDL.h>
#include <math.h>

void draw_circle(SDL_Renderer *renderer, float x, float y, float r) {
	SDL_Point points[1024];
	float t;
	int i, n;
	
	for(t = 0, n = 0;t < M_PI*2;t += M_PI*2/40.0, n++)
		points[n] = (SDL_Point){x + r*cos(t), y + r*sin(t)};
	
	points[n++] = points[0];
	
	SDL_RenderDrawLines(renderer, points, n);
}

void main() {
	SDL_Window *window;
	SDL_Renderer *renderer;
	
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer);
	
	for(;;) {
		if(SDL_QuitRequested()) break;
		
		SDL_SetRenderDrawColor(renderer, 47, 137, 153, 255);
		SDL_RenderClear(renderer);
		
		SDL_SetRenderDrawColor(renderer, 49, 20, 82, 255);
		draw_circle(renderer, 100, 100, 50);
		
		SDL_RenderPresent(renderer);
	}
}
gcc $(pkg-config --libs --cflags sdl2) -lm main.c
./a.out
Deleted
()
Ответ на: комментарий от anonymous

Что-то я не понял. На processing(java), мой пример даёт 38fps. А на С и этой библиотеке raylib всего 30fps и причем код на С жрёт процессор стабильно на 20% больше. Плюс анимация с разрывами какая-то. Программа на processing занимает 88МБт озу, а на С 80МБт озу. Я прям озадачен.

#include "raylib.h"

int main(void)
{
    // Initialization
    //--------------------------------------------------------------------------------------
    const int screenWidth = 640;
    const int screenHeight = 480;

    InitWindow(screenWidth, screenHeight, "test");

    //SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
    //--------------------------------------------------------------------------------------

    // Main game loop
    while (!WindowShouldClose())    // Detect window close button or ESC key
    {
        // Update
        //----------------------------------------------------------------------------------
        // TODO: Update your variables here
        //----------------------------------------------------------------------------------

        // Draw
        //----------------------------------------------------------------------------------
        BeginDrawing();

            //ClearBackground(BLACK);

            for (int x = 0; x < screenWidth; x++) {
                for (int y = 0; y < screenHeight; y++) {
                    if(GetRandomValue(0,1)==1) DrawPixel(x, y, WHITE);
                    else DrawPixel(x, y, BLACK);
                }
            }
            
            DrawFPS(10, 10);

        EndDrawing();
        //----------------------------------------------------------------------------------
    }

    // De-Initialization
    //--------------------------------------------------------------------------------------
    CloseWindow();        // Close window and OpenGL context
    //--------------------------------------------------------------------------------------

    return 0;
}

Lorovec
() автор топика

Piet.

*злой смех*

Avial ★★★★★
()
Ответ на: комментарий от Deleted

Плюс в Java оптимизации, а ты в raylib рисуешь через комманды glные.

Deleted
()

Всёравно на каком языке.

Ошибка у тебя в...

Вобщем поменяй циклы местами.

for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) {

Скорость обработки увеличится в тысячи раз.

HIS
()

Грамотеев тут наплодилось, которые азы работы с кешем и памятью не знают.

HIS
()
Ответ на: комментарий от Lorovec

Можно заменить рандом на другую функцию. Она будет тоже рандом но гораздо быстрее.

HIS
()

Зачем тебе рандом в каждом пикселе? Реально рандом долгая функция.

Думаю здесь нужны упрощения.

HIS
()
Ответ на: комментарий от HIS

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

Deleted
()
Ответ на: комментарий от Lorovec

В любом случае мы тебе ускорили прогу.

Я это просто знаю по опыту.

HIS
()
Ответ на: комментарий от HIS

Я уверен что ты привираешь.

Зачем мне это? Я поменял, как ты написал и в java и в C. Ничего не поменялось. Зачем мне врать-то? Если бы ускорилось было бы хорошо.

Lorovec
() автор топика

Если тебе нужно это.

Я пока ищу в своих загашниках алгоритм.

Скажи какое максимальное число случайных чисел тебе нужно?

не говори что квадрилион например. Ну там миллион или сколько?

Для алгоритма нужно просто нагенерить простые числа.

HIS
()
Ответ на: комментарий от Lorovec

Я в raylib'е не силен, но вот наковырял, что смог:

  • Объект типа Image можен быть быстро обновлен на CPU
  • Объект типа Texture2D — на GPU
  • Каждый кадр обновляем содержимое screenPixels через указатель pixels, проходя по массиву пикселей построчно
  • Отправляем screenPixels на GPU один раз за кадр с помощью функции UpdateTexture
  • Рисуем в окне с помощью DrawTexture

Удалось выжать 48 fps.

#include "raylib.h"

int main(void)
{
    // Initialization
    //--------------------------------------------------------------------------------------
    const int screenWidth = 640;
    const int screenHeight = 480;

    InitWindow(screenWidth, screenHeight, "test");

    Image      screenImage   = GetScreenData();
    Texture2D  screenTexture = LoadTextureFromImage(screenImage);
    Color     *screenPixels  = GetImageData(screenImage);
    Color     *pixels;

    //SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
    //--------------------------------------------------------------------------------------

    // Main game loop
    while (!WindowShouldClose())    // Detect window close button or ESC key
    {
        // Update
        //----------------------------------------------------------------------------------
        // TODO: Update your variables here
        //----------------------------------------------------------------------------------

        // Draw
        //----------------------------------------------------------------------------------
        BeginDrawing();

            //ClearBackground(BLACK);

		pixels = screenPixels;

		for (int y = 0; y < screenHeight; y++) {
			for (int x = 0; x < screenWidth; x++, pixels++) {
                    if(GetRandomValue(0,1)==1) *pixels = WHITE;
                    else *pixels = BLACK;
                }
            }

			UpdateTexture(screenTexture, screenPixels);
			DrawTexture(screenTexture, 0, 0, WHITE);
            
            DrawFPS(10, 10);

        EndDrawing();
        //----------------------------------------------------------------------------------
    }

    // De-Initialization
    //--------------------------------------------------------------------------------------
    CloseWindow();        // Close window and OpenGL context
    //--------------------------------------------------------------------------------------

    return 0;
}

anonymous
()
Ответ на: комментарий от HIS

Зачем тебе рандом в каждом пикселе? Реально рандом долгая функция.

Я знаю. И рандом здесь ни причем. Если его вообще убрать и просто рисовать в цикле одним цветом, то С - 32fps, а java - 62fps. Ну и пример этот просто как мини иллюстрация некоторых возможностей, которые мне нужны.

Lorovec
() автор топика
Ответ на: комментарий от anonymous

Я же говорил, что поменять циклы х и у нужно :)

ТС наверное гонит. Но таки ускорить рандом тоже можно.

HIS
()
Ответ на: комментарий от HIS

Там дело было совсем не в циклах: нужно было четко разграничить зоны ответственности, а именно — хочешь рисовать попиксельно, значит, рисуй в буфер на CPU и отправляй один раз за кадр на GPU, вместо width * height вызовов рисования на GPU.

anonymous
()
Ответ на: комментарий от HIS

А какой тебе ФПС нужен и на чём?

Нужна быстрая манипуляция пикселами. Узнать цвет. Поменять цвет. И т.п.

Lorovec
() автор топика
Ответ на: комментарий от Deleted

та я просто тут людей научил правильно программить… А они тут гонят, что не в наших незнаниях дело... СмИшно.

HIS
()
Ответ на: комментарий от HIS

та я просто тут людей научил правильно программить…

Спасибо, конечно, за ответы в тему, но ты сам проверь. Не меняется ничего. Это же легко проверить.

Lorovec
() автор топика
Ответ на: комментарий от HIS

ты говоришь если рандом убрать то не поменяется?

Ты лжёшь.

Одинаково. Не лгу. А вот если ты проверишь и будет одинаково — что будет?

Lorovec
() автор топика
Ответ на: комментарий от Lorovec

Я разрабатывал программы по обработке на сотни тысяч пикселов для сканеров.

Да мой подход даёт прирост в тысячи раз.

Не гони.

HIS
()
Ответ на: комментарий от Lorovec

Да это так рандом генератор наверн работает.

Deleted
()
Ответ на: комментарий от HIS

Ааа, тебе проверить нечем - я и забыл, что компилятор есть только у меня. Но пока не могу его вернуть, так что поверь на слово.

Lorovec
() автор топика
Ответ на: комментарий от HIS

Ты обращался в больницу уже? Стоит же. Не шучу.

Deleted
()
Ответ на: комментарий от HIS

Ты потерял нить. Это не твой код. Если в коде анонима поменять х и у местами, то тоже будет 89fps. И я устал с тобой спорить.

Lorovec
() автор топика

Ты плакался, что у тебя всё плохо и нет хороших ФПС.

После моей подсказки у тебя легко идут 60 ФПС.

У тебя в чём трабла?

HIS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.