Comment augmenter la vitesse de dessin des lignes sur le canevas dans Javafx


Je fais une application de peinture de base dans Javafx. Et je me demande s'il existe un moyen d'augmenter la vitesse de tirage des lignes sur la toile.

public class MouseListener implements EventHandler<MouseEvent>{

    @Override
    public void handle(MouseEvent event) {


        if(event.getSource() == canvas){
            canvas.getParent().setCursor(Cursor.CROSSHAIR);

        }


        if(event.getEventType() == MouseEvent.MOUSE_PRESSED){

            x1 = event.getX(); 
            y1 = event.getY(); 

        }else if(event.getEventType() == MouseEvent.MOUSE_MOVED){


            pGraphics.reset();

            x2 = event.getX();
            y2 = event.getY();

            mouseClick = 0; 

            pGraphics.drawLine(x1, y1, x2, y2);

        }


    }


public void drawLine(double x1, double y1, double x2, double y2){

    gc.strokeLine(x1, y1, x2, y2);

}

public void reset()
{
    gc.clearRect(0,0, gc.getCanvas().getWidth(), gc.getCanvas().getHeight());
}

Comme vous pouvez le voir, le dessin est assez simple en utilisant un MouseListener pour détecter la position (x1, y1) où la ligne commence, et il en va de même pour définir la position (x2, y2) où la ligne est censée se terminer. Comme vous le voyez j'ai effacer la ligne après le dessin, c'est mon intention, puisque c'est la fonction qui sont censés pour "montrer" où la ligne est censée aller, par exemple comme dans Microsoft Paint en utilisant la fonction line. Le problème de tout cela cependant, est que la ligne "traîne" derrière le curseur, et beaucoup à quand le curseur se déplace à la bonne vitesse. La question est donc: est-ce que cela a quelque chose à voir avec ma fonction de dessin, la fonction de dessin de toile, le taux de rafraîchissement du mouseListener ou autre chose entièrement, ou tous ensemble? J'apprécierais vraiment quelques suggestions à ce sujet.

Author: Skarsh, 2016-06-17

3 answers

Le problème n'est probablement pas la vitesse de dessin, mais plutôt le retard de réaction d'entrée similaire à celui qui est discuté dans la question: bonne façon de déplacer un nœud en faisant glisser dans javafx 2?

Essayez certaines des approches des réponses à la question liée et voyez si cela aide.

Notez que, si c'est le cas, que vous utilisiez un canevas ou un graphique de scène ne fera pas vraiment de différence pour le problème de performance car le problème lié au traitement des événements d'entrée comme contrairement au système de rendu.

Ticket de suivi de bogues associé: Problème de performance lors du suivi des événements de la souris .

Je vois que vous avez donné une solution définissant l'indicateur JVM non documenté

-Djavafx.animation.fullspeed=true

Comment puis-je commencer à faire cela?

Ce n'était pas une solution que j'ai écrite et faites un peu attention à ce que l'indicateur non documenté puisse être supprimé ou son comportement modifié dans les futures versions de Java (bien que dans ce cas, je suppose que c'est probable). Néanmoins, il vaut la peine d'essayer.

Pour comprendre comment définir des indicateurs de ligne de commande, voir: Utilisation correcte des paramètres de ligne de commande Java-Det aussi la section java man page intitulée: "-Dproperty=value".

Cela devrait être aussi simple que de taper java -Djavafx.animation.fullspeed=true my package.MyMainClass ou java -Djavafx.animation.fullspeed=true myjar.jar (en substituant les valeurs My aux valeurs appropriées pour votre application bien sûr).

 1
Author: jewelsea, 2017-05-23 10:30:30

Je pense que vous suivez une approche complètement fausse ici. Il serait beaucoup plus facile et beaucoup plus efficace de simplement placer un nœud de ligne au-dessus de votre canevas et de simplement modifier les données de géométrie de cette ligne au lieu d'effacer constamment le canevas et de redessiner la ligne. (Vous devriez également vous demander si l'utilisation d'une toile ici est la bonne chose à faire de toute façon, mais c'est quelque chose que vous seul pouvez décider parce que vous ne fournissez aucune information sur ce que vous voulez réellement faire avec votre toile.)

 2
Author: mipa, 2016-06-17 14:31:31

Dans votre exemple simple,il serait plus efficace dans la fonction de réinitialisation de tracer une ligne avec la couleur d'arrière-plan sur la ligne x1,y1,x2, y2 précédente, puis de tracer la nouvelle ligne.

Mais, si vous déplacez 1 px, l'utilisateur ne remarquera probablement pas la différence.

Si l'utilisateur joue juste aux coordonnées x1 = 50, y1 = 50 à x2'=51, y2'=50 ou x2"=50, y2=51 vous effacerez toujours toute la toile, ce qui est assez stupide pour seulement 1-2 pixels modifiés, pour une toile qui pourrait en avoir des milliers ou des millions de pixels.

, Mais, de toute façon, vous pouvez ignorer certains redessine " sans trop d'impact pour l'utilisateur afin d'optimiser pour la vitesse. Ajoutez donc un if pour vérifier que la différence entre les x2 et y2 précédents est supérieure à x pixels par rapport aux x2 et y2 actuels

 0
Author: Nicolae Natea, 2016-06-17 13:36:07