Dies ist, was passiert:Was verursacht bei der Präsentation des Renderbuffers schwankende Ausführungszeiten? (OpenGL)
Die drawGL Funktion am genauen Ende des Rahmens genannt wird dank einer
usleep
, wie vorgeschlagen. Dies hält bereits eine konstante Framerate aufrecht. Die tatsächliche Darstellung des Renderpuffers erfolgt mitdrawGL()
. Das Messen der dafür notwendigen Zeit gibt mir schwankende Ausführungszeiten, was zu einem Stottern in meiner Animation führt. Dieser Timer verwendet mach_absolute_time also es ist extrem genau.Am Ende meines Rahmens, messen ich
timeDifference
. Ja, es ist im Durchschnitt 1 Millisekunde, aber es weicht sehr viel, von 0,8 Millisekunden bis 1,2 mit Spitzen von bis zu mehr als 2 Millisekunden.
Beispiel:
// Every something of a second I call tick
-(void)tick
{
drawGL();
}
- (void)drawGL
{
// startTime using mach_absolute_time;
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
// endTime using mach_absolute_time;
// timeDifference = endTime - startTime;
}
Mein Verständnis ist, dass, sobald der Framebuffer erstellt wurde, sollte die renderbuffer präsentiert immer den gleichen Aufwand, unabhängig von der Komplexität des Rahmens? Ist das wahr? Und wenn nicht, wie kann ich das verhindern?
Übrigens ist dies ein Beispiel für eine iPhone App. Wir sprechen hier von OpenGL ES, obwohl ich nicht glaube, dass es ein plattformspezifisches Problem ist. Wenn es ist, als was ist los? Und sollte das nicht nicht passiert sein? Und wenn ja, wie kann ich das verhindern?
Ich habe ja schon mal meine Berechnungen, um eine stabile Framerate zu erhalten. Die eigentliche Zeichnung findet immer am exakten Ende des Rahmens statt. (Ich verwende einen Schlaf-Timer dafür) Ich werde die Frage dafür klären. – Kriem