2D Anwendung ruckelt beim scrollen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 2D Anwendung ruckelt beim scrollen

    Hi zusammen,

    ich programmiere gerade eine Anwendung die einige Objekte zeichnen soll. Ich verwende die Library G von Geosoft dazu (http://geosoft.no/graphics/index.html) die auf Java 2D aufsetzt. Je nach Eingabedaten muß die Anwendung eine unterschiedliche Anzahl von Objekten zeichnen. Jetzt habe ich das Problem, daß es beim scrollen manchmal ruckelt und hakt.

    Dabei wurden zum Beispiel um die 1100 Objekte gezeichnet. Diese Objekte sind nicht sonderlich komplex (sind sowas wie gefüllte Rechtecke, ovale, oder sehr einfache Polygone) und es laufen auch keine Animationen oder ähnliches im Hintergrund.

    Das kann doch nicht normal sein, daß das so ruckelt oder? Eine vergleichbare Anwendung, die fast dasselbe zeichnet ruckelt überhaupt nicht. Die ist in Perl geschrieben aber Perl ist doch nicht schneller als Java?!

    Was hab ich falsch gemacht? Jemand meinte zu mir man müsse einen Offscreen Buffer verwenden um alles flüssig zu halten, aber das sollte doch die Library machen oder??

    Vielen Dank,
    Robert
  • Dazu kann ich dir unsere Vorlesung zu DoubleBuffering empfehlen
    * Vorlesung9: Threads, Animation, DoubleBuffer, ...

    Nimme einfach mal diese Klasse:

    Quellcode

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. /**
    4. * Alle Klassen, die von DoubleBufferingFrame abgeleitet sind, unterstützen nun
    5. * das Double-Buffering automatisch
    6. *
    7. * Damit können schon bestehende Programme nachträglich flackerfrei gemacht
    8. * werden, ohne dass eine einzige Zeile der eigentlichen Ausgaberoutinen
    9. * geändert werden muss
    10. *
    11. * Double-Buffering lässt sich in Java komplett kapseln
    12. *
    13. */
    14. @SuppressWarnings("serial")
    15. public class DoubleBufferFrame extends Frame {
    16. private Image dbImage;
    17. private Graphics dbGraphics;
    18. private boolean resized;
    19. public DoubleBufferFrame() {
    20. addCL();
    21. }
    22. public DoubleBufferFrame(String s) {
    23. super(s);
    24. addCL();
    25. }
    26. public void addCL() {
    27. addComponentListener(new ComponentAdapter() {
    28. public void componentResized(ComponentEvent e) {
    29. resized = true;
    30. }
    31. });
    32. }
    33. public void update(Graphics g) {
    34. // Initialising double buffer
    35. if (dbImage == null || resized) {
    36. resized = false;
    37. dbImage = createImage(this.getSize().width, this.getSize().height);
    38. dbGraphics = dbImage.getGraphics();
    39. }
    40. // Clear background
    41. dbGraphics.setColor(getBackground());
    42. dbGraphics.fillRect(0, 0, this.getSize().width, this.getSize().height);
    43. // Paint foreground
    44. dbGraphics.setColor(getForeground());
    45. paint(dbGraphics);
    46. // Show offscreen
    47. g.drawImage(dbImage, 0, 0, this);
    48. }
    49. }
    Alles anzeigen


    Und dann leite dein Applet von DoubleBufferFrame anstatt von Frame ab.
  • ok, java swing nutzt in der Tat bereits double buffering.
    Aber das Wort Offscreen Buffering hast du eingeworfen. Und so wie ich das Thema verstanden habe, ist das ein und das selbe.

    DoubleBuffering baut doch auch nur ein zweites Bild auf (offscreen) und ersetzt dieses dann mit dem vorherigen Bild, sobald es fertig aufgebaut ist.
    Es existiert also keine weiße Seite mehr zwischen den Bildern - kein Flackern.

    Kenne deine Lib leider nicht... kann dir also nicht weiterhelfen :-/
  • Ok.
    Vielleicht habe ich mich etwas mißverständlich ausgedrückt. Mit ruckeln und haken meine ich nicht, daß das Bild zwischendurch mal komisch aussieht oder ähnliches.

    Es ist so: Ich sehe einen Ausschnit mit sagen wir 50 eigentständigen grafischen Objekten von insgesamt 1000 die der contendPane meines JFrames geaddet wurden. Jetzt scrolle ich und während des scrollens hakt es ein wenig.
    Das Programm guckt dann wohl welche Objekte jetzt kommen wenn ich scrolle und rendert diese. Und das "nachsehen" und rendern scheint etwas zu dauern, so daß das scrollen selber nicht flüssig ist (der scroll Balken steht dann kurz obwohl ich mit dem Mauszeiger eigentlich schon weiter bin).

    Ich habe das Double Buffering selber angesprochen weil jemand mir den Tip dazu gegeben hat. Daran liegt es dann wohl nicht?!?
    Erst dachte ich, daß es vielleicht daran liegt, daß einfach zu viele Objekte nachgesehen werden müssen und Java an sich das nicht zügig schaft. Aber dann habe ich eine Anwendung gesehen die fast dasselbe macht und die war in Perl geschrieben :-/

    Gruß,
    Robert

    P.S. Kennt jemand vielleicht ne andere gute Lib die auf Java 2D aufsetzt?