java javafx rendering antialiasing

¿Cómo aplicar antialiasing a los métodos de javafx como GraphicsContext.fillArc()?



rendering (1)

Me encontré con un problema similar mientras jugaba con Canvas y AnimationTimer . Una clave importante para la solución es el comentario publicado por @jewelsea :

"... si comenta el temporizador de animación y dibuja el arco sin él, entonces el arco está bien antialiasado ..."

Esto significa básicamente, si dibujamos el arco una vez que está antialiasado. Pero si lo dibujamos en el método handle() del AnimationTimer , se dibuja 60 veces por segundo. Los resultados se pueden ver mejor después de agregar un sueño largo al método handle() . La primera vez que se representa el círculo sobre un fondo blanco y se ve como se desea. La segunda vez se representa un círculo azul sobre el círculo azul anterior. Los píxeles que fueron coloreados parcialmente azules debido al antialiasing, se oscurecen. Lo mismo ocurre cuando el círculo se dibuja la tercera vez, y así sucesivamente. La siguiente imagen muestra una parte ampliada del arco después de 1, 2, 3, 4, 5, 10 y 50 iteraciones:

Una solución simple al problema es llenar el lienzo con el color de fondo, antes de representar algo:

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); }

Soy nuevo en javafx, y estoy programando un juego usando sus funciones de representación, específicamente, GraphicsContext.fillArc() y similares en eclipse.

Este es mi código actual:

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();

Sin embargo, el método fillArc() representa una forma en mi pantalla con bordes irregulares. Quiero que se aplique un antialiasing para suavizar los bordes. Sin embargo, no puedo encontrar ningún método relacionado en la clase GraphicsContext y cambiar la creación de instancias de la scene a una new Scene(root, 400, 400, false, SceneAntialiasing.BALANCED); no tiene ningún efecto también. Entonces mi pregunta es cómo lograr un antialiasing en GraphicsContext.fillArc() o si es fundamentalmente posible.

También soy muy nuevo en javafx y cgi en general, por lo que cualquier sugerencia y recomendación son bienvenidas.

Actualizar:

Según lo sugerido por @jewelsea, cuando el bloque de código 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); se coloca fuera de la subclase anónima de AnimationTimer , la imagen renderizada tiene antialias. Ninguno de nosotros puede entender por qué a partir de ahora. FYI.