1

寄稿文の最後にシステムスペックとコードサンプル!

まず第一に、私はこのフォーラムに不慣れです。レイアウトや質問自体に問題があれば教えてください。私はLinux、ubuntuも初めてで、Javaの初心者です。ubuntuの前はwindows7を使っていました。私のマシンにubuntuをインストールした後、問題が最初に現れました。

問題

eclipse で、swing パッケージまたは Java アプレットを使用してアニメーション ウィンドウを実行すると、アニメーションがびくびくして滑らかになりません。JPanel と、背景と左から右に移動する 2D ボールを持つ JFrame で構成される非常に単純なプログラムのコードのサンプルを示します。プログラムは 30 ミリ秒ごとに再描画するように設定されています。このような単純なグラフィックスを実行することは問題になりません。それ以外の場合、Eclipseは高速でスムーズです。誰かが以前にこのようなことに遭遇した場合は、助けやアドバイスをいただければ幸いです。

編集:

例外の追加: アプリケーション ウィンドウの上にマウスを置いて (そして動かし続けると)、アニメーションがびくびくしなくなります。動きを止めると、また滑らかではなく、びくびくし始めます。誰かがこれについて聞いたことがありますか?

私が試したこと

*これに関連するバグや問題を検索していますが、何も見つかりません

※最新のEclipseと最新のJDKをインストール

* eclipse.ini ファイルの編集

* 私の Windows 7 マシンで私のコードを実行しています (正常に動作します)

*バンブルビーをインストールし、nvidia optimus を使用

システム

OS: Ubuntu 12.04 (正確) 64 ビット

メモリ: 5.6 GiB、プロセッサ Intel Core 2.5 GHz x 4 CPU

日食ジュノ 4.2.0

Java -バージョンが私をもたらします

$ -java version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

lspci | grep VGA は私をもたらします

00:02:0 VGA compatible controller: Intel Corporation Ivy Bridge Graphics    Controller    (rev 09)

私のeclipse.iniファイル

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20120913-144807
 -product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs

-Xincgc

-XX:NewSize=8m
-XX:MaxPermHeapExpansion=10m
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseParNewGC
-XX:+CMSConcurrentMTEnabled
-XX:ConcGCThreads=2
-XX:ParallelGCThreads=2
-XX:CMSIncrementalDutyCycleMin=0
-XX:CMSIncrementalDutyCycle=5
-XX:GCTimeRatio=49
-XX:MaxGCPauseMillis=20
-XX:GCPauseIntervalMillis=1000
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSClassUnloadingEnabled
-XX:+DoEscapeAnalysis
-XX:+UseCompressedOops
-XX:+AggressiveOpts
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

-Dosgi.requiredJavaVersion=1.7
-Dhelp.lucene.tokenizer=standard
-XX:MaxPermSize=128m
-XX:PermSize=128m
-Xmn128m
-Xms1024m
-Xmx1024m
-Xss2m
-XX:+UseConcMarkSweepGC

コードサンプル

 /////////Sample from the JPanel class (extends JPanel)/////////
 private int y = 200;
 private int x = 0;

 public testPanel() {
     setVisible(true);
     setPreferredSize(new Dimension(1500, 400));
     setBackground(Color.black);
 }

 public void move() {
     x = x + 2;
 }

 public void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.setColor(Color.green);
     g.fillOval(x, y, 50, 50);
 }
 }

 ///////Sample from the JFrame class (extends JFrame)/////////

 private testPanel thePanel = new testPanel();
 private Timer t = new Timer(30, this);



 public testFrame() {
     add(thePanel);
     setVisible(true);
     setDefaultCloseOperation(EXIT_ON_CLOSE);
     pack();
     t.start();

 }

 public void actionPerformed(ActionEvent e) {
     thePanel.move();
     repaint();
 }
4

1 に答える 1

1

(これはそれ自体は答えではありません- 単なる観察の集まりです)。

私は Mac OSX でこれをいじっていましたが、最初はどもりで始まることに気付きましたが、ボールが跳ね返る前に滑らかになります。

これは、JIT の最適化に関係している可能性があり、システムが安定するにつれて GC の相互作用が関係している可能性もあります。

コードを試して、2 ~ 3 サイクル以上振動するかどうかをお知らせください (ボールは跳ね返ります)。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SimpleAnimation {

    public static void main(String[] args) {
        new SimpleAnimation();
    }

    public SimpleAnimation() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public static class TestPane extends JPanel {

        private int xPos = 0;
        private int xDelta = 2;
        protected static final int RADIUS = 40;

        public TestPane() {
            setBackground(Color.BLACK);
            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    xPos += xDelta;
                    if (xPos + RADIUS > getWidth()) {
                        xPos = getWidth() - RADIUS;
                        xDelta *= -1;
                    } else if (xPos < 0) {
                        xPos = 0;
                        xDelta *= -1;
                    }
                    repaint();
                }

            });
            timer.setCoalesce(true);
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(750, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

            int x = xPos;
            int y = (getHeight() - RADIUS) / 2;
            g2d.setColor(Color.GREEN);
            g2d.fillOval(x, y, RADIUS, RADIUS);
            g2d.dispose();
        }

    }

}
于 2013-05-11T11:34:24.717 に答える