[gelöst]Timer zu langsam

Alles rund um die Programmierung mit Qt
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

[gelöst]Timer zu langsam

Beitrag von Nash »

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?
Zuletzt geändert von Nash am 9. Mai 2007 17:27, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Mal davon abgesehen, wie du visuell 110 von 330 fps unterscheiden willst, welches Betriebssystem verwendest du?
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Note that QTimer's accuracy depends on the underlying operating system and hardware. Most platforms support an accuracy of 1 millisecond, but Windows 98 supports only 55. If Qt is unable to deliver the requested number of timer clicks, it will silently discard some.
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

und das heißt jetzt? es liegt nicht am timer, schneller geht es nicht?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Genau
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

naja, mhm es muss eine möglichkeit geben.
hab die szene(oder das Modell besser mal gesagt) auch im 3ds Max viewport mir angeschaut, da komme ich so auf 250fps.
was recht gut ist und um einiges besser als der QT timer, vielleicht in einem thread auslagern...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich frag mich immer noch wie du 110 und 250fps unterscheiden willst. Ich bin zwar nicht mehr der jüngste, aber ich denke nicht, daß deine Augen so viel schneller sind... (Vom Monitor mal abgesehen)
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

hä?
klar macht das im endeffekt keinen unterschied aus, aber wenn ich sehe, das ein anderes Program mein Objekt nocht schneller Rendern kann, dann will ich das das genauso schnell ist.
und wir reden ja hier nicht von einem unterschied von 10-20 fps
sondern 150fps-200fps
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Könnte es sein, daß die andere Anwendung schnellere Zeichenroutinen hat, als deine?
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

nein, es liegt an qt
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
Quelle:

http://deposit.ddb.de/cgi-bin/dokserv?i ... 15978x.pdf
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich habe doch nun aufgezeigt wie es geht... tztz als ob man gegen eine Wand redet :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

ohh sorry deinen Beitrag hab ich überlesen. :cry:
du hast inzwischen bestimmt ein ganz komisches Bild von mir
Ich schau mir das Beispiel gleich mal an.

btw, stimmst du mit dem Zitat überein?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

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
Antworten