[gelöst]Timer zu langsam
[gelöst]Timer zu langsam
Hallo Leute,
ich möchte in einem Widget was rendern, lassen doch ist der Timer dafür meines erachtens zu langsam(trotz startTimer(0);),
wenn ich ganz normal im windowmode in einem renderloop etwas rendere, dann bekomme ich in meiner Testscene etwa 330FPS, render ich in ein widget, mit Hilfe eines Timer ,komme ich so auf 110FPS.
Gibt es eine schneller möglichkeit in ein widget in qt zu rendern?
ich möchte in einem Widget was rendern, lassen doch ist der Timer dafür meines erachtens zu langsam(trotz startTimer(0);),
wenn ich ganz normal im windowmode in einem renderloop etwas rendere, dann bekomme ich in meiner Testscene etwa 330FPS, render ich in ein widget, mit Hilfe eines Timer ,komme ich so auf 110FPS.
Gibt es eine schneller möglichkeit in ein widget in qt zu rendern?
Zuletzt geändert von Nash am 9. Mai 2007 17:27, insgesamt 1-mal geändert.
ganze einfach einmal rendere ich die Szene in windowed Mode.
wo ich einen einfachen renderloop habe.
Die Application ist dann ohne QT.
und einmal rendere ich das über einen timer in ein QMainWindow.
exakt die selbe Szene.
OS: WinXP
Die Frage ist verwendete man einen Timer um solche Sachen zu animieren?
vielleicht verwendet man ja threads, oder sowas, oder es gibt noch eine andere Möglichkeit.
wo ich einen einfachen renderloop habe.
Die Application ist dann ohne QT.
und einmal rendere ich das über einen timer in ein QMainWindow.
exakt die selbe Szene.
OS: WinXP
Die Frage ist verwendete man einen Timer um solche Sachen zu animieren?
vielleicht verwendet man ja threads, oder sowas, oder es gibt noch eine andere Möglichkeit.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ich würde einfach sagen QTimer ist für sowas ungeeignet. Ein Thread rendet und schickt das fertige Bild an den Mainthread - und der stellt dar. Dazu gibt es sogar ein schönes Beispiel in den examples (Mandelbrot denke ich, auf alle Fälle unter dem Stichwort 'Threads')
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
nein, es liegt an qt
http://deposit.ddb.de/cgi-bin/dokserv?i ... 15978x.pdf
Quelle:Ein Problem von Qt liegt in seinem Konzept der Ereignisverwaltung. Leider verwendet Qt
eine globale Ereignisliste, die nur von einem einzelnen Thread bearbeitet werden kann. Dies
ist insofern problematisch, weil sich der gleiche Thread auch für die Erzeugung sowie die Aktualisierung
der Oberfläche und damit für das Rendern der Szene verantwortlich zeichnet.
Erschwerend kommt hinzu, dass nur derjenige Thread einen OpenGL Kontext verwenden
darf, der selbigen erzeugt hat. D.h. es gibt in Qt einen Thread, welcher das OpenGL Fenster
und dessen OpenGL Kontext erzeugt, die Benutzeroberfläche verwaltet und zudem die
Szene rendert. Als Konsequenz können niedrige Frameraten bei der Ausgabe einer Szene zu
Blockaden der Oberfläche führen. Auch der Einsatz der Klasse QTimer zur getriggerten Visualisierung
in regelmäßigen Zeitabständen bietet nicht die eigentlich gewünschte Multithread
Lösung, da QTimer nach einem Zeitscheibenverfahren Rechenzeit von dem Ausgangsthread
abzweigt
http://deposit.ddb.de/cgi-bin/dokserv?i ... 15978x.pdf
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Imho bezieht sich das Zitat auf Qt3. Qt4 ist in dieser Hinsicht wesentlich flexibler geworden wobei es immer noch der Fall ist dass nur der Hauptthread zeichnen darf/kann. Allerdings haben in Qt4 mittlerweile auch alle QThreads eine eigene Message-Loop was ein Rendering im Hintergrund ohne weiteres möglich macht (siehe die examples). Das die Framereaten nicht so hoch sein können wie bei 'handgeschriebenen' Code erklärt sich von allein, aber ich denke wenn man sich etwas mit QThreads und der ganzen Kommunikation innerhalb einer Qt-Anwendung auseinandersetzt sollte der Unterschied nicht wirklich gross sein.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung