如何将抗锯齿应用于像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的匿名子类之外,渲染的图像是抗锯齿的。 我们都不知道为什么到现在为止。 仅供参考。

我在玩CanvasAnimationTimer时遇到了类似的问题。 解决方案的一个重要关键是@jewelsea发布的评论 :

“……如果你注释掉动画计时器并且只是在没有它的情况下绘制弧线,那么弧线很好地抗锯齿……”

这基本上意味着,如果我们在抗锯齿时绘制弧线。 但是如果我们在AnimationTimerhandle()方法中绘制它,则每秒绘制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); }