質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

270閲覧

Proccesingでfillとrectだけで画像描画したい

rikurumu

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2018/05/19 02:36

編集2018/05/19 02:49

processing(JAVA)で265×300の画像をfillとrectだけで描画したいです。(こんなことする意味があるのかは置いといて)

int x=0;
int y=0;

fill(-6052883);
rect (x + 0,y + 0,1,1 );
fill(-6053138);
rect (x + 1,y + 0,1,1 );
fill(-6053388);
rect (x + 2,y + 0,1,1 );
fill(-6053387);
rect (x + 3,y + 0,1,1 );
fill(-6053641);
rect (x + 4,y + 0,1,1 );
fill(-6119693);
rect (x + 5,y + 0,1,1 );
fill(-6054160);
rect (x + 6,y + 0,1,1 );
fill(-5923090);
rect (x + 7,y + 0,1,1 );
fill(-5923605);
.
.
.
と、こんな感じで40万行近くになりましたがいざ実行してみるとエラーコードやらが出る前にprocessingが動かなくなります。
processingのスペルも覚えてない超初心者ですが解決策を教えていただけませんでしょうか……

追記 エラーコード出てました
Exception in thread "TimerQueue" Exception in thread "Thread-64" Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/19 05:20 編集

このパターンで1ドットごとにrectとfillを実行するとして、256×300×2行≒16万行程度にしかなりませんが、残りの24万行は何をしているのでしょうか? rectとfillの呼び出しだけでそんなにメモリを消費するとは思えません。
rikurumu

2018/05/19 08:56

すみませんなぜか二回ループしてましたが解決しました
guest

回答1

0

ベストアンサー

計算機のパワーには限界があります。それはスピードだったり、メモリーやハードディスクの容量などハードウェア的な制約であったり、OSなどのソフトウェア的な制約(同時に開くことができるファイルの数は1000個までとか・・・)であったりします。

その制約の下で効率よく動くようにプログラミングするのが常道です。

もし使っている計算機に何テラ・何ペタものメモリーと超高速なプロセッサーを搭載しているなら40万行のコードもなんなく実行できるかも知れません。しかし例えば8GBしか主記憶が搭載されてない計算機で実行しようとすると、1行あたりのJavaのバイトコードが仮に20バイトぐらいメモリーを消費するとすれば40万行で8GBにも達します。単なるバイトコードだけでそれだけになるとJavaのオブジェクトを格納しておくべきヒープやらProcessing以外にOS配下で動いているもろもろのプログラムが「スムーズに動けなくなる」ことは想像に難くありません。

こんなことする意味があるのかは置いといて

それはかまわないのですが、40万行はナンセンスな分量と言えましょう。少なくともコードの中に直接定数を並べて同じような処理を並べるのは止めましょう。こういうものは可変の部分を計算によって求めたり、外部のファイルへ置くなどして「プログラムコード自体は小さく」書くのが普通です。


訂正:
40万行のバイトコードの試算を間違えて8GBと計算してしまったため、ちょっと変なところに着目して回答してしまいました。失礼しました。

プロセッシングがフリーズ(?)した直接原因は不明ですが、少なくともJVMの仕様制限にひっかかるぐらいメソッドが大きすぎるのは確実と思います。1万行ぐらいでやってみましたが、Javacでコンパイルするとコンパイル時に「コードが大きすぎます」というコンパイルエラーになりますね。

しかしながら、「何万行ものコードを書くのはよくない」という点は同じでそれが回答の要点であると受け取ってください。

投稿2018/05/19 04:22

編集2018/05/19 06:24
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/19 05:59

20バイト×40万行=8Mバイトなのでは?
KSwordOfHaste

2018/05/19 06:02

これはしたりw; ご指摘ありがとうございます。 本文の説明を書き直さないといけないレベルですね・・・
退会済みユーザー

退会済みユーザー

2018/05/19 06:07

コンパイル後のメソッドサイズが64Kバイトを超えると実行時にエラーとなるようです。
KSwordOfHaste

2018/05/19 06:16

そんなエラーに遭遇するのはなかなかないですよねw; javacでやってみるとコンパイル時にエラーになりました。 J.java:4: エラー: コードが大きすぎます
rikurumu

2018/05/19 09:00

返信遅くなり申し訳ありません。 そうですよね、さすがにあれだけ多いのは無理ですよね笑 最終的に下のように画像を解析しながら描画することにしました お二方ともありがとうございました! PImage img; //画像の下準備 int i =0; //x座標 int j =0; //y座標 void setup() { img = loadImage("miku.jpg"); //スケッチフォルダのdataフォルダに画像を入れ、その画像ファイルの名前を入力 size(401, 258); //画像ファイルの横サイズの二倍の数値と縦サイズの数値を入力 //この先入力不要 noStroke(); } void draw() { img.loadPixels(); //画像ファイルのピクセル情報を読み込む for (int j= 0; j <height; i =0) { //上から一行ずつ処理 for (int i= 0; i <width/2; i ++) { fill(img.pixels[(j*width/2+i)]); //描画しようとしている色を取得 rect(i, j, 1, 1); //ドットを描く //これを一行すべて描画した後、次の行へ } j ++; } noLoop(); //ループさせない }
KSwordOfHaste

2018/05/19 09:06

簡単に画像を描画できるメソッドがあることはご存知でしょうけども、おそらく画像を加工して何かするといった想定があって、こうした低水準な処理に取り組んでおられるのだと思います。 こういう研究は大事と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問