Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 268. 소개 - 프로세싱(https://processing.org/) [링크 복사], [링크+제목 복사],
조회: 16264
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

소개 - 프로세싱(https://processing.org/)

프로세싱을 예전에도 알긴 했었는데,

Processing
; https://processing.org/

그 당시에는 그다지 관심이 없었지만, 요새 읽고 있는 책 덕분에 장난감같던 프로세싱이 새롭게 여겨지고 있습니다. ^^

Nature of Code: 자연계 법칙을 디지털 세계로 옮기는 컴퓨터 프로그래밍 전략
; http://www.yes24.com/24/goods/17638500

0장부터 펄린 노이즈를 생성하는 noise 함수를 소개하고 있는데요.

펄린 노이즈(Perlin Noise)
; http://msparkms.tistory.com/entry/펄린-노이즈Perlin-Noise

간단하게 펄린 노이즈를 '부드러운 난수 생성기'라고 보셔도 될 것 같습니다. "Nature of Code" 책에서도 이를 이용해 파란 하늘을 표현할 수 도 있다고 언급하고 있는데요. 실제로 약간의 코드 변경으로 나름대로 표현을 해봤습니다. ^^

void setup()
{
  size(600, 600);
}

void draw()
{
  loadPixels();
  float xoff = 0.0;
  
  for (int x = 0; x < width; x ++)
  {
    float yoff = 0.0;
    
    for (int y = 0; y < height; y ++)
    {
      float g = map(noise(xoff, yoff), 0, 1, 120, 190);
      float b = map(noise(xoff, yoff), 0, 1, 230, 255);

      pixels[x + y * width] = color(0, g, b);
      yoff += 0.01;
    }
    
    xoff += 0.01;
  }
  updatePixels();
}

실행해 보면 다음과 같은 결과를 얻습니다.

processing_0.png

오~~~ 재미있군요. ^^ 3D와 결합하면 "실시간 수면 그래픽"까지 구현됩니다. 그 외에, 책에 실린 연습 문제에는 3D 상의 평탄한 지형 생성 예제로 다음과 같은 결과를 보여줍니다.

processing_1.png

이 정도면, "부드러운 난수 생성기"라는 의미를 이해하시겠죠? ^^




Processing 내부의 언어는 현재 "Java", "JavaScript" / "CoffeeScript", "Python"이 제공되고 있습니다. C#의 경우 논의한 흔적이 있고, 대학생의 과제로 C# 언어를 추가한 프로젝트가 공개된 정도입니다. 써보니... 간단한 수준에서 유효할 뿐 그다지 쓸만하지 않았습니다.

DotNetProcessing
; http://dnetprocessing.sourceforge.net/

그렇긴 해도, 프로세싱의 특징상 (대체로) 엄청난 로직을 작성하는 것은 아니므로 C# 개발자로써 Java 모드로 작성하는 것에 크게 거부감이 없기 때문에 굳이 닷넷 미지원이 아쉽지 않습니다.

개인적으로는, Processing이 빠른 결과물이나 프로토타입에 어울린다고 판단됩니다. 게다가, 아듀이노 쪽 임베디드나 게임과 같은 식의 "setup + 무한 draw"의 프로그램 구조 상 끊임없이 변화하는 프로그램에 적합합니다.

예를 들어, 다음은 우리 회사의 바리스타 직원이 출근했을 때 "파란 원"을 화면에 보여주는 프로세싱 코드입니다.

boolean baristaOn = false;

public class CheckThreads extends Thread 
{
  public void run() 
  {
    while (true)
    {
      baristaOn = checkOn();
      try
      {
       Thread.sleep(5000);
      } catch (InterruptedException e)
      {
      }
    }
  }
    
  boolean checkOn()
  {
    String lines[] = loadStrings("http://.../get_notif.aspx");
    
    for (int i = 0 ; i < lines.length; i++) 
    {
      String upperCase = lines[i].toUpperCase();
      if (upperCase.indexOf("{ON}") != -1)
      {
        return true;
      }
    }
    
    return false;
  }
}

void setup()
{
  size(600, 600);
  (new CheckThreads()).start();
}

void draw()
{
 if (baristaOn == true)
 {
  fill(0, 0, 255);
 }
 else
 {
  fill(255, 0, 0);
 }

  ellipse(width / 2, height / 2, width, height);
}

빠른 피드백을 받으며 간단하게 UI 프로그램을 만들 수 있지만, 사실 이 프로그램을 잠깐 실행하는 정도로는 쓸만해도 항상 켜놓기에는 부담스럽습니다. 왜냐하면, draw 무한 반복의 특성 상 CPU 사용이 크기 때문입니다. 다음 화면은 위의 코드를 실행했을 때 보여지는 CPU 사용률입니다.

processing_2.png

물론, draw를 무한 반복할 필요가 없기 때문에 다음과 같이 sleep 코드를 좀 추가해도 됩니다. (대개의 프로세싱 프로그램에는 sleep을 잘 쓰지 않죠!)

void draw()
{
 if (baristaOn == true)
 {
  fill(0, 0, 255);
 }
 else
 {
  fill(255, 0, 0);
 }

  ellipse(width / 2, height / 2, width, height);
  
  try
  {
    Thread.sleep(1000);
  } catch (InterruptedException e)
  {
  }  
}

그렇다고 해도 동일하게 C# 윈도우 폼 형태로 작성한 프로그램과,

using System.Drawing;
using System.Net;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool _baristaOn = false;

        public Form1()
        {
            InitializeComponent();

            Thread t1 = new Thread(threadFunc);
            t1.IsBackground = true;
            t1.Start();
        }

        private void threadFunc(object obj)
        {
            while (true)
            {
                WebClient wc = new WebClient();
                string txt = wc.DownloadString("http://.../get_notif.aspx");
                bool on = txt.ToUpper().IndexOf("{ON}") != -1;

                if (on != _baristaOn)
                {
                    _baristaOn = on;
                    this.Invalidate();
                }

                Thread.Sleep(5000);
            }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Brush fill = (_baristaOn == true) ? Brushes.Blue : Brushes.Red;
            e.Graphics.FillEllipse(fill, this.ClientRectangle);
        }
    }
}

CPU 사용량을 비교해 보면 근소하지만 여전히 차이가 납니다.

processing_3.png

dfsvc.exe 하위의 WindowsFormsApplication1.exe가 C# 윈폼 프로그램이고 Sleep이 해제되었을 때 0.01 CPU 사용률을 보이지만 프로세싱의 경우 sleep을 주었는데도 불구하고 항상 0.15 + 0.11 정도의 CPU 사용률이 있습니다.




어쨌든, 하나 정도의 언어를 잘 마스터한 사람이라면 프로세싱은 덤으로 사용할 수 있는 개발자의 도구입니다. 새삼스럽게 저도 이제서야 여러분들에게 추천하게 되었군요. ^^ 또한, "Nature of Code" 책도 다시 한번 추천합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 12/2/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...
NoWriterDateCnt.TitleFile(s)
11770정성태11/5/201819939Graphics: 27. .NET으로 구현하는 OpenGL (1) - OpenGL.Net 라이브러리 [3]파일 다운로드1
11769정성태11/5/201811743오류 유형: 501. 프로젝트 msbuild Publish 후 connectionStrings의 문자열이 $(ReplacableToken_...)로 바뀌는 문제
11768정성태11/2/201811646.NET Framework: 801. SOIL(Simple OpenGL Image Library) - Native DLL 및 .NET DLL 제공
11767정성태11/1/201813128사물인터넷: 55. New NodeMcu v3(ESP8266)의 IR LED (적외선 송신) 제어파일 다운로드1
11766정성태10/31/201814503사물인터넷: 54. 아두이노 환경에서의 JSON 파서(ArduinoJson) 사용법
11765정성태10/26/201812142개발 환경 구성: 420. Visual Studio Code - Arduino Board Manager를 이용한 사용자 정의 보드 선택
11764정성태10/26/201815765개발 환경 구성: 419. MIT 라이선스로 무료 공개된 Detours API 후킹 라이브러리 [2]
11763정성태10/25/201813725사물인터넷: 53. New NodeMcu v3(ESP8266)의 https 통신
11762정성태10/25/201814454사물인터넷: 52. New NodeMCU v3(ESP8266)의 http 통신파일 다운로드1
11761정성태10/25/201814116Graphics: 26. 임의 축을 기반으로 3D 벡터 회전파일 다운로드1
11760정성태10/24/201810580개발 환경 구성: 418. Azure - Runbook 내에서 또 다른 Runbook 스크립트를 실행
11759정성태10/24/201811322개발 환경 구성: 417. Azure - Runbook에서 사용할 수 있는 다양한 메서드를 위한 부가 Module 추가
11758정성태10/23/201813397.NET Framework: 800. C# - Azure REST API 사용을 위한 인증 획득 [3]파일 다운로드1
11757정성태10/19/201810855개발 환경 구성: 416. Visual Studio 2017을 이용한 아두이노 프로그램 개발(및 디버깅)
11756정성태10/19/201813166오류 유형: 500. Visual Studio Code의 아두이노 프로그램 개발 시 인텔리센스가 안 된다면?
11755정성태10/19/201814786오류 유형: 499. Visual Studio Code extension for Arduino - #include errors detected. [1]
11754정성태10/19/201811634개발 환경 구성: 415. Visual Studio Code를 이용한 아두이노 프로그램 개발 - 새 프로젝트
11753정성태10/19/201819112개발 환경 구성: 414. Visual Studio Code를 이용한 아두이노 프로그램 개발
11752정성태10/18/201811363오류 유형: 498. SQL 서버 - Database source is not a supported version of SQL Server
11751정성태10/18/201811476오류 유형: 497. Visual Studio 실행 시 그래픽이 투명해진다거나, 깨진다면?
11750정성태10/18/201810262오류 유형: 496. 비주얼 스튜디오 - One or more projects in the solution were not loaded correctly.
11749정성태10/18/201811706개발 환경 구성: 413. 비주얼 스튜디오에서 작성한 프로그램을 빌드하는 가장 쉬운 방법
11748정성태10/18/201812628개발 환경 구성: 412. Arduino IDE를 Store App으로 설치한 경우 컴파일만 되고 배포가 안 되는 문제
11747정성태10/17/201812775.NET Framework: 799. C# - DLL에도 EXE처럼 Main 메서드를 넣어 실행할 수 있도록 만드는 방법파일 다운로드1
11746정성태10/15/201812049개발 환경 구성: 411. Bitvise SSH Client의 인증서 모드에서 자동 로그인 방법파일 다운로드1
11745정성태10/15/201810606오류 유형: 495. TFS 파일/폴더 삭제 - The item [...] could not be found in your workspace, or you do not have permission to access it.
... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...