如何将抗锯齿应用于像GraphicsContext.fillArc()这样的javafx方法?
我是javafx的新手,我正在使用其渲染函数编写游戏,特别是在Eclipse中使用GraphicsContext.fillArc()
等。
这是我目前的代码:
BorderPane root = new BorderPane(); Scene scene = new Scene(root, 400, 400); primaryStage.setScene(scene); scene.getStylesheets() .add(getClass().getResource("application.css").toExternalForm()); Canvas canvas = new Canvas(400, 400); root.getChildren().add(canvas); GraphicsContext gc = canvas.getGraphicsContext2D(); new AnimationTimer() { public void handle(long currentNanoTime) { gc.setFill(Color.BLUE); gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND); } }.start(); primaryStage.show();
但是fillArc()
方法在我的屏幕上呈现一个边缘fillArc()
的形状。 我想要应用抗锯齿,以便边缘平滑。 但是我在GraphicsContext
类中找不到任何相关的方法,并将scene
的实例化更改为new Scene(root, 400, 400, false, SceneAntialiasing.BALANCED);
也没有效果。 所以我的问题是如何在GraphicsContext.fillArc()
上实现抗锯齿,或者它是否从根本上可行?
另外我对javafx和cgi一般都很新,所以欢迎任何建议和建议。
更新:
正如@jewelsea所建议的,当代码块gc.setFill(Color.BLUE); gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND);
gc.setFill(Color.BLUE); gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND);
放置在AnimationTimer
的匿名子类之外,渲染的图像是抗锯齿的。 我们都不知道为什么到现在为止。 仅供参考。
我在玩Canvas
和AnimationTimer
时遇到了类似的问题。 解决方案的一个重要关键是@jewelsea发布的评论 :
“……如果你注释掉动画计时器并且只是在没有它的情况下绘制弧线,那么弧线很好地抗锯齿……”
这基本上意味着,如果我们在抗锯齿时绘制弧线。 但是如果我们在AnimationTimer
的handle()
方法中绘制它,则每秒绘制60次。 在handle()
方法中添加长睡眠后,可以更好地看到结果。 第一次在白色背景上渲染圆圈并按需要显示。 第二次在前一个蓝色圆圈的顶部渲染一个蓝色圆圈。 由于抗锯齿而部分呈蓝色的像素变得更暗。 第三次绘制圆时会发生同样的情况,依此类推。 下图显示了1,2,3,4,5,10和50次迭代后弧的放大部分:
解决问题的一个简单方法是在渲染任何内容之前用canvas填充背景颜色:
public void handle(long currentNanoTime) { gc.setFill(Color.WHITE); gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); gc.setFill(Color.BLUE); gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND); }