I do not understand, I took the source code of delphi to see how it is performed with OpenGL (under android). so on every paint delphi do :
eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface)
so this make OpenGL swapping the back buffer with the display buffer (if i understand well), waiting for the vsync signal first (is this really true?). So as the vsync signal is fired every 16.6 ms I must have between every eglSwapBuffers a multiple of 16.6 (ex 16.6 or 33.2 or 49.8, etc).
To measure it I do like this :
I replace
procedure ContextFlip;
begin
if eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface) = 0 then
glGetError;
end;
with
var vSyncStopWatch: TstopWatch;
procedure ContextFlip;
begin
if eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface) = 0 then
glGetError;
vSyncStopWatch.Stop; if vSyncStopWatch.Elapsed.TotalMilliseconds > 16.6 then allog('VSYNC deadline missed', floattostr(vSyncStopWatch.Elapsed.TotalMilliseconds), tallogType.WARN); vSyncStopWatch := TstopWatch.StartNew;
end;
but what I don’t understand, is why I have value like 18ms, 22ms, 24ms, 28ms, 27ms, etc… instead of only 16.6 or 33.2 or 49.8, etc ? how is it possible ? does eglSwapBuffers really wait for the vsync signal ?