2009-03-22 10 views
0

Für mein Praktikum am Brain-Computer Interfacing muss ich einige sehr schnelle flackernde Quadrate auf einem CRT-Monitor erzeugen (flackernd = alternierend zwischen zwei Farben). Die Bildwiederholrate des Monitors beträgt 85 Hz und wir möchten, dass dies der Engpass ist, was bedeutet, dass das Neuzeichnen aller Quadrate höchstens 1000/85 = 11 ms dauern kann.Wie generiere ich einfache 2D-Grafiken in Echtzeit?

Meine bevorzugte Sprache für GUI/Grafik-Programmierung ist Java, also habe ich versucht, einen Prototyp mit AWT zu machen, weil es synchron ist (im Gegensatz zu Swing). Ich habe jetzt scheinbar zwei Probleme: Zum einen zeigen die Zeitmessungen, dass das Übermalen von 9 Quadraten einfach zu lange dauert. Mein Algorithmus nimmt die gewünschte Frequenz und berechnet die Zeiten, zu denen das System im Voraus neu streichen sollte und verwendet dann eine Schleife (ohne Schlaf-/Warteverzögerung), die jedes Mal prüft, ob die nächste "Zeit" erreicht wurde Quadrate, um sie neu zu streichen. Die Art, wie ich es jetzt implementiert habe, ist, dass die Quadrate Panels mit Hintergrundfarbe A sind und in einem anderen Panel mit Hintergrundfarbe B enthalten sind und das Flackern geschieht, weil die Sichtbarkeit der Panels geändert wird. Ich dachte mir, dass das schneller wäre als ein Panel, das ständig Rechtecke zeichnen muss. Ich habe kein anständiges Profiling-Tool (kann nicht Eclipse TPTP oder NetBeans Profiler arbeiten), so kann ich nicht sicher sein, aber ich habe das Gefühl, dass der Engpass ist eigentlich nicht in der Neulackierung, sondern in der Schleife (mit bedingter Prüfung etc.). Können Sie mir etwas empfehlen, was ich tun sollte?

Das zweite Problem ist, dass es scheint, als ob die Quadrate von oben nach unten gerendert werden. Es ist, als ob sie sich wirklich schnell ausrollen, aber immer noch sichtbar. Das ist inakzeptabel. Was ich jedoch frage, ist, was das verursacht. Ist es Java/AWT oder Windows oder schreibe ich nur einen langsamen Algorithmus?

Können Sie mir einige Dinge empfehlen, die ich ausprobieren kann? Ich bevorzuge Java, aber ich werde C (oder etwas) verwenden, wenn ich muss.

Antwort

3

Ich würde jede Art von High-Level "Komponenten", wie JPanels und dergleichen vermeiden. Versuchen Sie, einen Graphics2D zu erhalten, der den Inhalt des Fensters darstellt, und verwenden Sie die Methode fillRect().

Wenn das nicht klappt, könnten Sie das wahrscheinlich in C und OpenGL so einfach machen. rasonly.c ist ein Standardvorlagenprogramm, das OpenGL so konfiguriert, dass es nur als "Rasterizer" arbeitet, d. H. Im 2D-Modus. Wenn Sie dies als Ausgangspunkt verwenden, sollten Sie in der Lage sein, etwas zu erreichen, das Ihre gewünschten "Quadrate" ohne große Probleme zeichnet.

Sie beschreiben Ihre gewünschte Szene nicht sehr gut, es klingt aus dieser Gleichung, als ob Sie 100 Quadrate zeichnen wollen, die jeweils eine andere Farbe haben. Für maximale Leistung in OpenGL sollten Sie alle Quadrate der gleichen Farbe zusammen zeichnen, um die "Statusänderungen" zwischen Zeichnungsaufrufen zu minimieren. Dies ist wahrscheinlich ein rein theoretischer Punkt, denn das Zeichnen von 100 2D-Quadraten bei 85 Hz sollte OpenGL eigentlich nicht besteuern.

UPDATE: Oh, also es ist eine Reihe von Jahren, und heutzutage müssen Sie wahrscheinlich die oben genannten mit einem Körnchen Salz und lesen Sie ein modernes Tutorial. Dinge haben sich geändert. Schau dir die Vulkan API an.

2

(Ich erinnere mich an eine Demonstration dieser die BBC Micro und Palette Schalt verwenden, obwohl das 50fps wäre eher als 85, wie es ein britisches Inland TV war)

ich jogl wechseln würde und Anzeigelisten verwenden . Sie erzielen sehr hohe fps-Raten in Java.