Ну у меня не вылетает собственно... Лога нет...
так проблему решили?
есть мнение что, нужно скомпилить релиз верисию и проверить =)) а лучше не использовать дельфи для разработки критических к времени исполнения приложений
Executor
у тебя не Виндойус 7 ?
Kloun
есть мнение, что лучше не холиварить в ветке, где мучается заядлый дельфи-программист.
DevilDevil
> у тебя не Виндойус 7 ?
Вин7, угу...
Вот например приложение на DX7:
http://www.codeguru.com/cpp/g-m/directx/article.php/c4357/
Работает нормально...
>>а лучше не использовать дельфи для разработки критических к времени исполнения приложений
Какое отношение имеет потеря 10% производительности к разработке приложений, стабильно упирающихся в производительность видеокарты?
Вот шейдеры точно на дельфи писать не стоит.
а вызов
glDrawArray
что на С++, что на Delphi будет работать с одинаковой скоростью.
@!!ex
> стабильно упирающихся в производительность видеокарты?
я полистал ветку, и чет не увидел, что выяснили причину тормозов.... может там матрицы умножаются в больших количествах?
просто для примера. мое приложение упирается в производительность видиокарты.
релиз - 100фпс
дебаг - 20 макс. уже точно не пмоню. но не больше. запускаю в исключительно редких случаях ;(
Дома (Athlon 1700, GeFource4) произвёл профилирование exe-шников, нашёл самые слабые места:
GL_notVBO: SwapBuffers(h_DC)
GL_VBO : LockVertexBuffer() //моя функция
DX : Device.EndScene()
Чё за фигня ?
P.S.
// инициализация буферов glGenBuffersARB(2, @VertexBuffers[false]); glBindBufferARB( GL_ARRAY_BUFFER_ARB, VertexBuffers[false]); glBufferDataARB( GL_ARRAY_BUFFER_ARB, MAX_QUADS_COUNT*sizeof( TQuad), nil, GL_STREAM_DRAW_ARB); glBindBufferARB( GL_ARRAY_BUFFER_ARB, VertexBuffers[true]); glBufferDataARB( GL_ARRAY_BUFFER_ARB, MAX_QUADS_COUNT*sizeof( TQuad), nil, GL_STREAM_DRAW_ARB); procedure LockVertexBuffer( var VertexBufferPtr: pointer); begin if ( VertexBufferPtr = nil) then begin CurrentVertexBuffer := not CurrentVertexBuffer; // Lock CurrentVertexBuffer áóôåð glBindBufferARB( GL_ARRAY_BUFFER_ARB, VertexBuffers[CurrentVertexBuffer]); VertexBufferPtr := glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); end; end;
DevilDevil
> GL_VBO : LockVertexBuffer() //моя функция
ты лочишь буфер в каждом кадре? буфер динамический? для DX проверял - вершинный буфер, обновляемый в каждом кадре, работает не быстрее чем скармливание GAPI массива вершин из системной памяти
Поочерёдно используются 2 динамических буфера. Если GL без VBO, то выделяется один буфер в памяти
AMD Turion X2 Ultra ZM-85 2.3Ghz, Radeon HD 4650
DX - ~1360
GL - AV по адресу 0
eXgine - ~1320, но совершенно ничего не знает о рамках окон в Windows Vista
ЗЫ: по поводу падения FPS в OpenGL - было время, наблюдал кое-чего интересного на GeForce 7900GS. Если менялся стиль окна - FPS падал на слабых сценах, стоило перед обновлением "выключать" текущий контекст, а потом "включать" - все оставалось стабильным, но такой способ страшно глючил на старенькой Radeon 9600Pro при нескольких вызовах подряд :) Потом глюк пропал, вместе с обновлением драйверов.
Andru, c AV уже разобрался
Соображния:
По поводу Intel:
- если инициализировать GL в свёрнутом режиме, то инициализируется SoftWare-ный режим; если инициализировать GL в нормальном режиме, то включается HardWare-ный режим, всё работает нормально.
- DX инициализируется в SoftWare-ном режиме (по праздникам в HardWare-ном), поэтому такой низкий FPS. Вероятно из-за плохих DX драйверов.
По поводу Athlon+GeFource4:
- оба рендера инициализируются в хардварном режиме, но какие-то флаги/манипуляции тормозят рендер при завершении сцены (glFinish/Device.EndScene).
По поводу DX в Windows 7:
- вполне возможно, что как раз эти флаги/манипуляции не позволяют драйверам в Windows 7 работать корректно.
Какие идеи ?
DevilDevil
Я тут посмотрел дебагером твой код и код хпрогера... Я хз как ты можешь сравнивать совершенно два разных кода по производительности...
Executor,
недопонял. Распиши, пожалуйста по-подробнее.
Твой код:
wglDescribePixelFormat(0x4B011F1D, 7, 40, 0x12FDF8) glGetString( GL_EXTENSIONS) wglGetProcAddress( wglSwapIntervalEXT) wglGetProcAddress( wglGetSwapIntervalEXT) wglGetSwapIntervalEXT( ) glClearColor( 0, 0, 0, 0) glShadeModel( GL_SMOOTH) glDisable( GL_DEPTH_TEST) glDepthFunc( GL_LEQUAL) glDisable( GL_ALPHA_TEST) glClearDepth( 1) glEnable( GL_BLEND) glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable( GL_TEXTURE_2D) glDisable( GL_NORMALIZE) glEnable( GL_COLOR_MATERIAL) wglGetProcAddress( glBindBufferARB) wglGetProcAddress( glDeleteBuffersARB) wglGetProcAddress( glGenBuffersARB) wglGetProcAddress( glBufferDataARB) wglGetProcAddress( glMapBufferARB) wglGetProcAddress( glUnmapBufferARB) wglGetProcAddress( glEnableClientState) wglGetProcAddress( glDisableClientState) wglGetProcAddress( glVertexPointer) wglGetProcAddress( glColorPointer) wglGetProcAddress( glTexCoordPointer) wglGetProcAddress( glDrawArrays) glGenBuffersARB( 2, 0x47CA6C) glBindBufferARB( GL_ARRAY_BUFFER, 1) glBufferDataARB( GL_ARRAY_BUFFER, 48000, 0x0, GL_STREAM_DRAW) glBindBufferARB( GL_ARRAY_BUFFER, 2) glBufferDataARB( GL_ARRAY_BUFFER, 48000, 0x0, GL_STREAM_DRAW) glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glClear( GL_COLOR_BUFFER_BIT) glViewport( 0, 0, 800, 600) glMatrixMode( GL_PROJECTION) glLoadMatrixf( {0.0024999999, 0, 0, 0} {0, -0.0033333334, 0, 0} {0, 0, 1, 0} {-1, 1, 0, 1}) glUnmapBufferARB( GL_ARRAY_BUFFER) glGenTextures( 1, {0}) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: No preview available] glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0x0) [Context 1 - Texture 1: No preview available] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [Context 1 - Texture 1: ] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [Context 1 - Texture 1: ] glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 8448) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [Context 1 - Texture 1: ] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [Context 1 - Texture 1: ] glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_BGRA, GL_UNSIGNED_BYTE, 0x1F72A24) [Context 1 - Texture 1: ] glBindTexture( GL_TEXTURE_2D, 0) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glGenTextures( 1, {0}) glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: No preview available] glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 128, 128, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0x0) [Context 1 - Texture 2: No preview available] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) [Context 1 - Texture 2: ] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) [Context 1 - Texture 2: ] glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 8448) glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) [Context 1 - Texture 2: ] glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) [Context 1 - Texture 2: ] glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 128, 128, GL_BGRA, GL_UNSIGNED_BYTE, 0x1F72A24) [Context 1 - Texture 2: ] glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glFlush( ) wglSwapBuffers( 0x4B011F1D) glClear( GL_COLOR_BUFFER_BIT) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: ] glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glFlush( ) wglSwapBuffers( 0x4B011F1D) glClear( GL_COLOR_BUFFER_BIT) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glFlush( ) wglSwapBuffers( 0x4B011F1D) glClear( GL_COLOR_BUFFER_BIT) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: ] glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glFlush( ) wglSwapBuffers( 0x4B011F1D) glClear( GL_COLOR_BUFFER_BIT) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 1) [Context 1 - Texture 1: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindBufferARB( GL_ARRAY_BUFFER, 2) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glUnmapBufferARB( GL_ARRAY_BUFFER) glBindTexture( GL_TEXTURE_2D, 2) [Context 1 - Texture 2: ] glBindBufferARB( GL_ARRAY_BUFFER, 1) glMapBufferARB( GL_ARRAY_BUFFER, GL_WRITE_ONLY) glFlush( ) wglSwapBuffers( 0x4B011F1D)
Я думаю мапить в одном кадре и анмапить в другом это как минимум не красиво...
Код из демки eXngine:
ogl.Clear(True); glDisable( GL_DEPTH_TEST); glDisable( GL_LIGHTING); glEnable( GL_BLEND); glDisable( GL_ALPHA_TEST); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glAlphaFunc( GL_ALWAYS, 0); ogl.Set2D( 0, 0, wnd.Width, wnd.Height); tex.Enable( Texture); glBegin( GL_QUADS); Vertex := @QUADS; for i := 0 to 868*4-1 do with Vertex^ do begin glColor4ub( BGRA.R, BGRA.G, BGRA.B, BGRA.A); glTexCoord2fv( @Tx); glVertex3fv( @X); inc( Vertex); end; glEnd( ); // вывод FPS tex.Disable( ); glColor3f( 1, 0, 0); ogl.TextOut( 0, 8, 16, PChar( 'FPS: ' + IntToStr( ogl.FPS)));
Не вижу ничего общего...
Также нет ничего общего и по стейтам... Я хз как ты их сравнивал...
Executor
Текущая GL-версия со 100% не использованием буферов: [file=48229]
Собрал в Debug-режиме, если есть желание - можно посмотреть в AQTime или другом профилировщике
Тема в архиве.