ПрограммированиеФорумГрафика

Глубокое тестирование GL-приложений (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
17:11, 18 ноя 2009

Ну у меня не вылетает собственно... Лога нет...

#46
17:23, 18 ноя 2009

так проблему решили?
есть мнение что, нужно скомпилить релиз верисию и проверить =)) а лучше не использовать дельфи для разработки критических к времени исполнения приложений

#47
17:28, 18 ноя 2009

Executor
у тебя не Виндойус 7 ?

Kloun
есть мнение, что лучше не холиварить в ветке, где мучается заядлый дельфи-программист.

#48
17:50, 18 ноя 2009

DevilDevil
> у тебя не Виндойус 7 ?

Вин7, угу...

Вот например приложение на DX7:
http://www.codeguru.com/cpp/g-m/directx/article.php/c4357/
Работает нормально...

#49
19:14, 18 ноя 2009

>>а лучше не использовать дельфи для разработки критических к времени исполнения приложений
Какое отношение имеет потеря 10% производительности к разработке приложений, стабильно упирающихся в производительность видеокарты?
Вот шейдеры точно на дельфи писать не стоит.
а вызов
glDrawArray
что на С++, что на Delphi будет работать с одинаковой скоростью.

#50
21:13, 18 ноя 2009

@!!ex
> стабильно упирающихся в производительность видеокарты?
я полистал ветку, и чет не увидел, что выяснили причину тормозов.... может там матрицы умножаются в больших количествах?

просто для примера. мое приложение упирается в производительность видиокарты.
релиз - 100фпс
дебаг - 20 макс. уже точно не пмоню. но не больше. запускаю в исключительно редких случаях ;(

#51
0:29, 19 ноя 2009

Дома (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;
#52
0:49, 19 ноя 2009

DevilDevil
> GL_VBO : LockVertexBuffer() //моя функция
ты лочишь буфер в каждом кадре? буфер динамический? для DX проверял - вершинный буфер, обновляемый в каждом кадре, работает не быстрее чем скармливание GAPI массива вершин из системной памяти

#53
1:06, 19 ноя 2009

Поочерёдно используются 2 динамических буфера. Если GL без VBO, то выделяется один буфер в памяти

#54
1:45, 19 ноя 2009

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 при нескольких вызовах подряд :) Потом глюк пропал, вместе с обновлением драйверов.

#55
9:30, 19 ноя 2009

Andru, c AV уже разобрался


Соображния:

По поводу Intel:
- если инициализировать GL в свёрнутом режиме, то инициализируется SoftWare-ный режим; если инициализировать GL в нормальном режиме, то включается HardWare-ный режим, всё работает нормально.
- DX инициализируется в SoftWare-ном режиме (по праздникам в HardWare-ном), поэтому такой низкий FPS. Вероятно из-за плохих DX драйверов.

По поводу Athlon+GeFource4:
- оба рендера инициализируются в хардварном режиме, но какие-то флаги/манипуляции тормозят рендер при завершении сцены (glFinish/Device.EndScene).

По поводу DX в Windows 7:
- вполне возможно, что как раз эти флаги/манипуляции не позволяют драйверам в Windows 7 работать корректно.


  Какие идеи ?

#56
10:11, 19 ноя 2009

DevilDevil
Я тут посмотрел дебагером твой код и код хпрогера... Я хз как ты можешь сравнивать совершенно два разных кода по производительности...

#57
10:17, 19 ноя 2009

Executor,
недопонял. Распиши, пожалуйста по-подробнее.

#58
10:32, 19 ноя 2009

Твой код:

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)));

Не вижу ничего общего...
Также нет ничего общего и по стейтам... Я хз как ты их сравнивал...

#59
11:03, 19 ноя 2009

Executor

Текущая GL-версия со 100% не использованием буферов: [file=48229]
Собрал в Debug-режиме, если есть желание - можно посмотреть в AQTime или другом профилировщике

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.