FPS für bestimmte Komponente erzwingen



  • Guten Abend,

    gibt es eine Möglichkeit, für bestimmte Komponenten innerhalb eines Frames, z. B. für ein Label oder eine Panel zu "erzwingen", dass es ununterbrochen repainted wird?

    MfG :xmas1:


  • Mod

    Das ist so nicht zu empfehlen, da das Programm in dem Fall nicht mehr zu bedienen ist. Du kannst allerdings einen Timer bauen, so dass alle X Millisekunden repainted wird. Oder Du kannst auf andere Events reagieren, die sehr haeufig auftreten sollten.



  • Gregor schrieb:

    Das ist so nicht zu empfehlen, da das Programm in dem Fall nicht mehr zu bedienen ist. Du kannst allerdings einen Timer bauen, so dass alle X Millisekunden repainted wird.

    Schon gemacht... ist aber ziemlich ruckelig (bei mir)...
    Der Lehrer meinte, ich soll mal versuchen das ganze auf Windows statt Kubuntu laufen zu lassen.


  • Mod

    Sag mal, was das insgesamt eigentlich werden soll, damit man sich besser vorstellen kann, was Du eigentlich benötigen könntest.



  • Gregor schrieb:

    Sag mal, was das insgesamt eigentlich werden soll, damit man sich besser vorstellen kann, was Du eigentlich benötigen könntest.

    Ich habe eine Klasse Viewport (die JPanel erbt), die eine Simulation ist und natürlich flüssig ablaufen muss. Da das ganze mit der Java 2D API geschrieben ist (das war nicht meine Idee!) muss natürlich für eine entsprechende FPS für diese Komponente gesorgt werden. Im Moment habe ich das im Ctor stehen:

    new Timer().schedule(
                            new TimerTask()
                            {
                                @Override public void run()
                                {
                                    repaint();
                                }
                            }, 0, 1000 / 30);
    

    Ist schon ganz gut, aber ich dachte, vielleicht geht das schöner..


  • Mod

    Miss doch mal, wie lange das Zeichnen dauert. Wenn ich das richtig sehe, legst Du es momentan auf 30 Frames pro Sekunde an. Aber wie viele kriegst Du eigentlich? Kommt der ungefaehr auf die 30 fps oder kriegst Du da nur 10 fps raus?



  • Ich finde Gregors Gedanken gut, dass eine konstante Wartepause eventuell nicht angemessen ist, weil Zeichen- oder andere Vorgängen zuviel Zeit verbrauchen.

    Lege dir ein Delay fest, das sagt wie lange die Pause zwischen zwei Zeichenvorgängen sein soll und überprüfe die Dauer deiner Zeichenfunktion:

    final int fps = 30;
    final int delay = 1000/fps;
    
    while( running ) {
        long int starttime = System.getMilliTime();
        // doStuff();
        repaint();
        long int deltatime = System.getMilliTime()-starttime;
        if ( deltatime < delay ) {
            try {
                Thread.sleep( delay - deltatime ) );
            } catch ( Exception e ) {
            e.printStackTrace();
            }
        }
    }
    

    Je nach Bedarf kannst du dann entweder die weitere Programmlogik vor der repaint()-Methode in die Schleife einbauen oder die Grafik in einem unabhängigen Thread nebenherlaufen lassen (Vorsicht vor Synchronisationsproblemen).


Anmelden zum Antworten