A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
Windows 2000 + IE 6.0 + JDK 1.6 で動かしてみました。
大きい画像のほうが多少は遅くなりますが、たんに大きいため大きさに比例して処理に時間がかかるだけだと思いました。不安定だとは感じませんでした。Firefox 2.0 でも試しましたが IE と比べてとくに違いはありませんでした。
> しかし、僕がwebを見回した感じだと、Appletであまり大きい画像を扱ってるのを見たことが無いので、どの環境でも似た現象が起こるんではないか...と憶測してます。
最近は、複雑なことはみなさん Flash で作ってしまうからではないでしょうか。とくに Java Applet だからどうこうということはないと思います。
No.4
- 回答日時:
私は、画像関係の API はあまり得意ではないのですが、flush で Pixels の内容を Image に確定するのではないでしょうか?
なお、paint の引数で受け取った Graphics ならば dispose は不要です。(getGraphics で取得した Graphics ならば dispose が必要。)
私だったら、上記を反映して、つぎのようなコードにします。少なくとも createImage は毎回やらなくて済むので、多少は軽くはなると思います。
なお、Image は結局は実行環境の peer に大きく依存しますので、速度などは、環境(Windows/Linux 等の違いやグラフィックボードのドライバーなど)に左右されるので、そのせいかもしれません。一度、ぜんぜん別の環境で動かされて試してみてはどうでしょうか。
repaint をどういったタイミングでされているのかも気になります。
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
class SomeApplet extends Applet{
int[] Pixels;
MemoryImageSource Mis;
Image Img;
int ImgW, ImgH; // 幅, 高さ。
public void init(){
ImgW = 500; // 任意の値を入れる。
ImgH = 500;
Pixels = new int[ImgW*ImgH];
Mis = new MemoryImageSource(ImgW, ImgH, Pixels, 0, ImgW);
Img = createImage(Mis);
}
public void paint(Graphics g){
/////////////////////////
// ここにPixels への処理を入れる。
/////////////////////////
Img.flush();
g.drawImage(Img, 0, 0, null);
}
}
この回答への補足
Img.flush()でも、見た感じcreateImageと一緒でした。あいにく別環境が身近にないので、もし良かったら見てみてください。
http://www17.ocn.ne.jp/~wp38/AppletTest.htm
アップロードして、テストしながら気づいたんですがIEとFireFoxでも違うみたいです。FireFoxの方が大きめでも安定してます。他のブラウザは見てません。
しかし、僕がwebを見回した感じだと、Appletであまり大きい画像を扱ってるのを見たことが無いので、どの環境でも似た現象が起こるんではないか...と憶測してます。
No.3
- 回答日時:
> Appletの場合はdisposeがないようですが、何か代わりはあるんでしょうか。
あまり良くは知りませんが、AWT の場合、createImage で Image を取得した後、getGraphics で Grahpics を取得していると思いますが、使い終わったら、この Graphics を dispose しなければなりません。
Image image = component.createImage();
Graphics graphics = image.getGraphics();
graphics.draw~();
graphics.dispose(); // ← これ
この dispose は良く忘れがちになり、dispose がなくても一応は動きますが、これがないと前述のようにガーベッジコレクションのタイミングが制限されるので、処理が滞りやすくなるかもしれません。
あと、再現するコードを提示されるのも手です。
この回答への補足
コードは大体こんな感じです。
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
class SomeApplet extends Applet{
int[] Pixels;
MemoryImageSource Mis;
Image Img;
int ImgW, ImgH; // 幅, 高さ。
public void init(){
ImgW = 500; // 任意の値を入れる。
ImgH = 500;
Pixels = new int[ImgW*ImgH];
Mis = new MemoryImageSource(ImgW, ImgH, Pixels, 0, ImgW);
}
public void paint(Graphics g){
/////////////////////////
// ここにPixels への処理を入れる。
/////////////////////////
Img = createImage(Mis);
g.drawImage(Img, 0, 0, null);
// このGraphicsでは、効果がない様でした。
g.dispose();
}
}
Img.flush()をするとPixelsが開放されるので、ImgはPixelsをコピーせずラップしているだけだと思うんですが、もしそうならPixelsのサイズにGCはあまり影響を受けなさそうです。このコードとは違う方法に、Mis.setAnimated(true)とMis.newPixels()でする方法もありますが、Mis.setAnimated(true)をするとg.drawImageがかなり重たくなります。
No.2
- 回答日時:
> あと書き忘れてましたがdrawImageの前にcreateImageをしてます。
createImage したら、その後、使い終わったら dispose しなければならないと思いますが、ちゃんと dispose されているでしょうか?もし dispose しないと、ガーベッジコレクションの手順に自由度が小さくなるので、一時期に処理が滞るようなことが置きやすくなるかもしれません。
また、毎回 createImage しないといけないのでしょうか?一度 createImage したものを使いまわすことはできないのでしょうか?
> 500*500と400*400で違う原因は何でしょう。
前者のほうが後者に比べ、およそ5割増ですから、いろいろ処理は余計にかかるのかもしれません。なお、「数十ミリ秒程」ならひょっとしたらかかってもしかたのない時間なのかもしれません。
回答ありがとうございます。
Appletの場合はdisposeがないようですが、何か代わりはあるんでしょうか。あと、細かく試してみると500*454と500*455の間で一定と不一定が切り替わるようです。
No.1
- 回答日時:
おそらくガーベッジコレクション(GC)が動いているためだと思います。
確かめる一例としては、毎回の drawImage ごとに Runtime#freeMemory などでメモリーの空き具合を println するようにしてみて、時間がかかるときと、その値の変化に相関関係があるかどうかで分かります。
参考URL:http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ …
Runtime#freeMemory、知りませんでした、ありがとうございます。
500*500のイメージで試してみたら、相関関係がありました。でも400*400のイメージではGCが動いている様子はなく、描画速度も一定でした。あと書き忘れてましたがdrawImageの前にcreateImageをしてます。500*500と400*400で違う原因は何でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl 画像が表示でnull; this.src 1 2022/04/19 11:31
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- HTML・CSS ブロックエディターで作りつつ、画像を挿入しつつ、画像にスタイルシートのコードを付ける方法はありますか 1 2022/08/23 18:46
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- 物理学 特殊相対性理論を、完全否定に成功~ガンマの数式は、成立しない。 2 2023/03/08 19:30
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「例外 *** は対応する try 文...
-
eclipseに記述したjavaファイル...
-
setAttribute(String, int)は適...
-
文字列を数式に
-
python OpenPyXLを使って出力結...
-
drawImageの描画速度について
-
<forEach> 内で供給された "ite...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
-
BOOL値を逆にしたい
-
ダブルクォーテーションのrepla...
-
yyyymmddからyyyy/mm/d...
-
<s:iterator>の値をリストで取...
-
C# 半角カナの文字化けについて
-
JSPやサーブレットでSystem.out...
-
ボタンのイベントで異なるウィ...
-
Eclipseのコンソールを常に表示...
-
ORA-01858: 数値を指定する箇所...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
<forEach> 内で供給された "ite...
-
「例外 *** は対応する try 文...
-
importするには java.io.*; imp...
-
Javaを使ってデジタル時計を作...
-
setAttribute(String, int)は適...
-
シャットダウンフックが呼ばれない
-
干支の計算で。。。
-
Selenium IDEでexportしたコー...
-
ColabでのPytorchのエラー
-
【JAVAエラー】互換性のない型...
-
文字列を数式に
-
importとextendsの用い方の違い...
-
Java3Dで横置き円筒体の円筒中...
-
HttpClientについて
-
ActionForm form にnullが入っ...
-
java初心者です。座標取得と図...
-
javaで画像を回転縮小
-
(急募)Javaじゃんけんゲームで
-
画面遷移時のデータ遷移について
おすすめ情報