javafx辉光粉碎动画

javafx辉光粉碎动画,java,javafx,glow,Java,Javafx,Glow,我刚刚开始编写和学习javafx,做了一个简单的项目,我的问题是在我的图形环境中添加了发光效果之后,动画的速度明显减慢了 /** * JavaFX rocks ;) */ public class CDLMatrix extends Application { Stage matrixStage; private final String characters = "Effect glow = new Glow(1.0); gc.setEffect(glow); WHY

我刚刚开始编写和学习javafx,做了一个简单的项目,我的问题是在我的图形环境中添加了发光效果之后,动画的速度明显减慢了

/**
 * JavaFX rocks ;)
 */

public class CDLMatrix extends Application {
    Stage matrixStage;

    private final String characters = "Effect glow = new Glow(1.0); gc.setEffect(glow); WHY SHATTERS ?!";



    private final Random random = new Random();
    protected final Font font = Font.font("MS PGothic", FontWeight.BOLD, 15);
    char[] data = new char[2000 * 2000];
    int[] path = new int[2000 * 2000];
    private long lastTime = 0;

    int getNumberOfCharsPerRow() {
        return (int) matrixStage.getWidth() / 12;
    }

    int getNumberOfCharsPerColumn() {
        return (int) matrixStage.getHeight() / 12;
    }

    // takes random for now
    private char getChar() {
        return characters.charAt(Math.abs(random.nextInt()
                % characters.length()));
    }

    void update(long now) {
        if (lastTime == 0) {
            lastTime = now;
        }

        // fadeTime = how fast trail will fade out
        // flipRate = how fast trail chars will change

        final int fadeTime = 3;
        final float flipRate = 0.01f;
        final int fillStart = 100;
        final float fillRate = 0.01f;

        int numberOfCharsPerRow = getNumberOfCharsPerRow();
        int numberOfCharsPerColumn = getNumberOfCharsPerColumn();
        int numberOfChars = numberOfCharsPerRow * numberOfCharsPerColumn;

        for (int i = numberOfChars - 1; i >= 0; --i) {
            if (i + numberOfCharsPerRow < numberOfChars) {
                if (path[i] == 255) {
                    // This means char was just set
                    // Initialize the next row at this X
                    // position
                    path[i + numberOfCharsPerRow] = 255;
                    data[i + numberOfCharsPerRow] = getChar();
                }
            }

            // path[i] > 64 means if this char Green component > 25%
            if (path[i] > 64 && random.nextFloat() < flipRate) {
                data[i] = getChar();
            }

            // Decrement the char Green component
            if (path[i] > fadeTime) {
                path[i] -= fadeTime;
            } else {
                path[i] = 0;
            }

            // First row
            // Start doing stuff only if the Green component > 40%
            if (i < numberOfCharsPerRow && path[i] <= fillStart) {
                if (random.nextFloat() < fillRate) {
                    path[i] = 255;
                    data[i] = getChar();
                }
            }
        }

        lastTime = now;
    }

    @Override
    public void start(Stage stage) throws Exception {
        this.matrixStage = stage;
        matrixStage.setTitle("CDL Matrix");

        Group root = new Group();

        Scene scene = new Scene(root, 1024, 768);
        scene.addEventHandler(KeyEvent.KEY_PRESSED,
                new EventHandler<KeyEvent>() {
                    @Override
                    // F key for full screen ;)
                    public void handle(KeyEvent keyEvent) {
                        if (keyEvent.getCode() == KeyCode.F) {
                            matrixStage.setFullScreen(!matrixStage
                                    .isFullScreen());
                        }
                        // ctrl + Q = exit
                        if (keyEvent.isControlDown()
                                && keyEvent.getCode() == KeyCode.Q) {
                            matrixStage.close();
                        }
                    }
                });

        Canvas canvas = new Canvas();
        canvas.widthProperty().bind(matrixStage.widthProperty());
        canvas.heightProperty().bind(matrixStage.heightProperty());

        final GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.setFont(font);

//      Effect glow = new Glow(1.0); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//      gc.setEffect(glow);      <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

        new AnimationTimer() {
            @Override
            public void handle(long now) {
                update(now);

                gc.clearRect(0, 0, matrixStage.getWidth(),
                        matrixStage.getHeight());
                gc.setFill(Color.rgb(0, 1, 0));
                gc.fillRect(0, 0, matrixStage.getWidth(),
                        matrixStage.getHeight());

                int y = 0;
                int numberOfCharsPerRow = getNumberOfCharsPerRow();
                int numberOfCharsPerColumn = getNumberOfCharsPerColumn();

                // Colors
                for (int i = 0; i < numberOfCharsPerRow
                        * numberOfCharsPerColumn; ++i) {

                    gc.setFill(Color.rgb(0, path[i], 0));
                    String text = String.valueOf(data[i]);
                    gc.fillText(text, (i % numberOfCharsPerRow) * 12 + 1,
                            y + 13);

                    if (i % numberOfCharsPerRow == numberOfCharsPerRow - 1) {
                        y += 12;
                    }
                }
            }
        }.start();

        root.getChildren().add(canvas);

        matrixStage.setScene(scene);
        matrixStage.show();
    }
}
/**
*JavaFX;)
*/
公共类CDLMatrix扩展了应用程序{
阶段矩阵阶段;
private final String characters=“Effect glow=new glow(1.0);gc.setEffect(glow);为什么破碎?!”;
私有最终随机=新随机();
受保护的最终字体Font=Font.Font(“MS PGothic”,fontwweight.BOLD,15);
字符[]数据=新字符[2000*2000];
int[]路径=新int[2000*2000];
私有长lastTime=0;
int getNumberOfCharsPerRow(){
return(int)matrixStage.getWidth()/12;
}
int getNumberOfCharsPerColumn()列{
return(int)matrixStage.getHeight()/12;
}
//现在是随机的
私有字符getChar(){
返回characters.charAt(Math.abs(random.nextInt())
%字符长度());
}
无效更新(现在很长){
如果(lastTime==0){
上次=现在;
}
//fadeTime=轨迹淡出的速度
//flipRate=轨迹字符变化的速度
最终整数衰减时间=3;
最终浮动翻转率=0.01f;
最终int fillStart=100;
最终浮子填充率=0.01f;
int numberOfCharsPerRow=getNumberOfCharsPerRow();
int numberOfCharsPerColumn=getNumberOfCharsPerColumn();
int numberOfChars=NumberOfCharsError*numberOfCharsPerColumn;
对于(int i=numberOfChars-1;i>=0;--i){
如果(i+numberOfChars箭头64意味着如果此碳绿色成分>25%
if(路径[i]>64&&random.nextFloat()fadeTime){
路径[i]-=fadeTime;
}否则{
路径[i]=0;
}
//第一排
//只有当绿色部分>40%时,才开始做事
如果(i
然后,动画将以正常速度而不是幻灯片速度出现

更改:

gc.setEffect(glow); 
致:

JavaFX的内部实现中一定有某种东西会导致应用效果(例如应用于
GraphicsContext
而不是
节点
)的效率降低几个数量级。您可能希望在中提交一个问题,以便让开发人员进行研究


测试环境:Java 8u40,OS X 10.9

哇,辉光效果真的会扼杀动画性能,肯定不会在辉光下摇摆…谢谢你,它解决了我的问题。我一直在想,在更新中使用gc是否会影响我使用辉光效果后的性能下降。以及设置g高级别(画布)上的低级别解决了问题。无需担心。请添加一条评论,并链接到您创建的问题跟踪器问题(如果有)。谢谢。
canvas.setEffect(glow);