为什么glFlush()很慢很慢?

Cline 2011-07-11 01:13:18
OS: Win7 64Bit.
显卡:NVIDIA GeForce 9800GT

1.如果把驱动禁掉:Control Panel >Appearance Personalization>Display>Screen resolution>Advance Settings>Adapter>Adapter Type>Properties>Driver>Disable.

glFlush()很慢很慢!

Vendor = Microsoft Corporation
Extensions = GL_WIN_swap_hint
GL_EXT_bgra
GL_EXT_paletted_texture


2.如果驱动正常
glFlush()不慢!

Vendor = NVIDIA Corporation
Extensions = GL_ARB_blend_func_extended
GL_ARB_color_buffer_float
GL_ARB_compatibility
GL_ARB_copy_buffer
GL_ARB_depth_buffer_float
GL_ARB_depth_clamp
GL_ARB_depth_texture
GL_ARB_draw_buffers
GL_ARB_draw_elements_base_vertex
GL_ARB_draw_instanced
GL_ARB_ES2_compatibility
GL_ARB_explicit_attrib_location
GL_ARB_fragment_coord_conventions
GL_ARB_fragment_program
GL_ARB_fragment_program_shadow
GL_ARB_


请问为什么会慢呢?可以通过什么标志能判断一定会慢?谢谢!

代码:
//
// GLSAMPLE.CPP
// by Blaine Hodge
//

// Includes

#include <windows.h>
#include <gl/gl.h>

// Function Declarations

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);

// WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int iCmdShow)
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL quit = FALSE;
float theta = 0.0f;

// register window class
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "GLSample";
RegisterClass( &wc );

// create main window
hWnd = CreateWindow(
"GLSample", "OpenGL Sample",
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 856, 856,
NULL, NULL, hInstance, NULL );

// enable OpenGL for the window
EnableOpenGL( hWnd, &hDC, &hRC );

// program main loop
while ( !quit )
{

// check for messages
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{

// handle or dispatch messages
if ( msg.message == WM_QUIT )
{
quit = TRUE;
}
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}

}
else
{
const char* vendor = (const char*)::glGetString(GL_VENDOR);
const char* ext = (const char*)::glGetString(GL_EXTENSIONS);

// OpenGL animation code goes here
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClear( GL_COLOR_BUFFER_BIT );

glPushMatrix();
glRotatef( theta, 0.0f, 0.0f, 1.0f );
glBegin( GL_TRIANGLES );
glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
glEnd();
glPopMatrix();

glFlush();
glDrawBuffer(GL_FRONT);
glReadBuffer(GL_BACK);
glCopyPixels(0, 0, 856, 856, GL_COLOR);
glFlush();
glDrawBuffer(GL_BACK);
theta += 1.0f;
}

}

// shutdown OpenGL
DisableOpenGL( hWnd, hDC, hRC );

// destroy the window explicitly
DestroyWindow( hWnd );

return msg.wParam;

}

// Window Procedure

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{

case WM_CREATE:
return 0;

case WM_CLOSE:
PostQuitMessage( 0 );
return 0;

case WM_DESTROY:
return 0;

case WM_KEYDOWN:
switch ( wParam )
{

case VK_ESCAPE:
PostQuitMessage(0);
return 0;

}
return 0;

default:
return DefWindowProc( hWnd, message, wParam, lParam );

}

}

// Enable OpenGL

void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)
{
// get the device context (DC)
*hDC = GetDC( hWnd );


PIXELFORMATDESCRIPTOR pfd, *ppfd = &pfd;

ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER ;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_RGBA;
ppfd->cColorBits = 8;
ppfd->cDepthBits = 24;
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;

int pixelformat = ChoosePixelFormat(*hDC, ppfd);

if ((pixelformat = ChoosePixelFormat(*hDC, ppfd)) == 0) {

return ;
}

if (SetPixelFormat(*hDC, pixelformat, ppfd) == FALSE) {
return ;
}

// create and enable the render context (RC)
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );

}

// Disable OpenGL

void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
}
...全文
215 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
快乐鹦鹉 2011-07-12
  • 打赏
  • 举报
回复
Cline 2011-07-12
  • 打赏
  • 举报
回复
How to detect software renderer:

http://www.gamedev.net/topic/136233-pixel-formats-ogl/
Cline 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dizuo 的回复:]
只是读取帧缓存,应该不适于啊。
我的显卡跟你一样,只不过是32位机没遇到这张问题。。。
你去下一个gdebugger看一下 哪里最好资源。
http://www.gremedy.com/
[/Quote]

非常感谢!

发现错误:AP_USING_SOFTWARE_RENDERER_ERROR

Context 1 is rendered using a software renderer (Vendor: , Renderer: )
ryfdizuo 2011-07-11
  • 打赏
  • 举报
回复
http://www.codesampler.com/oglsrc.htm
你也可以使用一个正常的ogl程序看是不是 机子设置的问题。
ryfdizuo 2011-07-11
  • 打赏
  • 举报
回复
只是读取帧缓存,应该不适于啊。
我的显卡跟你一样,只不过是32位机没遇到这张问题。。。
你去下一个gdebugger看一下 哪里最好资源。
http://www.gremedy.com/
ouyh12345 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cline 的回复:]

那有什么方法可以知道当前显卡驱动不适合, 或导致glFlush()很慢?
[/Quote]

做个安装说明,提示先更新驱动
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
这个,这个,俺没办法
Cline 2011-07-11
  • 打赏
  • 举报
回复
那有什么方法可以知道当前显卡驱动不适合, 或导致glFlush()很慢?
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
三维画图,没有显卡驱动,本来就快不起来吧
Cline 2011-07-11
  • 打赏
  • 举报
回复
就是显卡NVIDIA GeForce 9800 GT的。

Driver Provider: NVIDIA
Driver Version: 8.17.12.7533

因为我们的程序在有些PC上,刷新速度太慢,找不到原因。

已前在这台机器上也很慢,更新驱动后好了。但把驱动禁掉,系统会微软的,刷新速度太慢可重现。

所以想找到什么原因导致刷新速度太慢。
kyotrue 2011-07-11
  • 打赏
  • 举报
回复
好专业的问题。。。
Eleven 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happyparrot 的回复:]
你把什么驱动禁掉了阿,为什么禁掉?
[/Quote]
同问,干嘛吧驱动禁掉?禁止图形加速?
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
你把什么驱动禁掉了阿,为什么禁掉?
Cline 2011-07-11
  • 打赏
  • 举报
回复
可以,木有
快乐鹦鹉 2011-07-11
  • 打赏
  • 举报
回复
我很想问问,32位的程序在64位计算机上运行,会有什么风险?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧