我有一个sdl/opengl游戏我正在努力工作.我平均得到了一个不错的fps,但是运动真的很不稳定,因为SDL_GL_SwapBuffers()会随机地花费很长时间来处理.加载纹理并将其写入缓冲区有时需要超过100毫秒!我删掉了很多代码,试图弄清楚是不是我做错了但是运气不好.当我运行这个裸骨程序时,它有时会阻塞长达70毫秒.
主要:
// Don't forget to link to opengl32, glu32, SDL_image.lib
// includes
#include <stdio.h>
// SDL
#include <cstdlib>
#include <SDL/SDL.h>
// Video
#include "videoengine.h"
int main(int argc, char *argv[])
{
// begin SDL
if ( SDL_Init(SDL_INIT_VIDEO) != 0 )
{
printf("Unable to initialize SDL: %s\n", SDL_GetError());
}
// begin video class
VideoEngine videoEngine;
// BEGIN MAIN LOOP
bool done = false;
while (!done)
{
int loopStart = SDL_GetTicks();
printf("STARTING SWAP BUFFER : %d\n", SDL_GetTicks() - loopStart);
SDL_GL_SwapBuffers();
int total …Run Code Online (Sandbox Code Playgroud) 我试图使用WGL_ARB_pbuffer进行OpenGL的屏幕外渲染,
但我在初始化期间失败了. 这是我的代码.wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");
if(!wglGetExtensionsStringARB) return;
const GLubyte* extensions = (const GLubyte*) wglGetExtensionsStringARB(wglGetCurrentDC());
Run Code Online (Sandbox Code Playgroud)
实际上这结束于第二行,因为wglGetExtensionsStringARB得到NULL.
我不知道为什么wglGetProcAddress不起作用. 我包括"wglext.h",我也在标题中定义如下.PFNWGLGETEXTENSIONSSTRINGARBPROC pwglGetExtensionsStringARB = 0;
#define wglGetExtensionsStringARB pwglGetExtensionsStringARB
Run Code Online (Sandbox Code Playgroud)
为什么我不能像我想的那样使用wglGetProcAddress? WGL_EXT_swap_control扩展允许在Windows上执行此操作,但我无法找到任何远程跨平台执行相同操作,即同步我的缓冲区交换与屏幕刷新.我的应用程序使用GLEW,所以提供的东西更可取.对Linux,Mac和Windows的跨平台支持是必要的,但如果无法设置同步,我的应用程序将不会中断(例如,用户已将其强制关闭在其图形驱动程序中).
我将接受程序代码在许多平台上使用GLEW作为有效答案.
我希望能够在没有锁定帧率的情况下运行我的游戏(目前为60 fps).我发现运行动画的唯一方法是使用NSTimer.有没有办法在Cocoa中拥有不受限制的帧率.如果是这样,链接或代码段将有很大帮助.
我拼命想让Vsync在我的OpenGL应用程序中运行.这是至关重要的统计数据:
我正在使用Windows,在C++ OpenGL中编码,我正在使用FreeGLUT进行OpenGL上下文(双缓冲).我知道要让交换缓冲区在Windows中等待垂直同步,你需要调用wglSwapIntervalEXT().
我的代码确实称之为(正如您将在下面看到的那样),但我仍然在进行垂直撕裂.我设法阻止它的唯一方法是调用glFinish(),这当然会带来与之相关的显着性能损失.
main()函数的相关部分如下所示:
//Initiating glut window
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize (initial_window_width, initial_window_height);
glutInitWindowPosition (100, 100);
int glut_window_hWnd = glutCreateWindow(window_title.c_str());
//Setting up swap intervals
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
// Extension is supported, init pointers.
wglSwapIntervalEXT = PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
// this is another function from WGL_EXT_swap_control extension
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)wglGetProcAddress("wglGetSwapIntervalEXT");
}
wglSwapIntervalEXT (1)
init ();
glutMainLoop(); ///Starting the glut loop
return(0);
Run Code Online (Sandbox Code Playgroud)
我应该指出wglInitSwapControlARB函数的返回是真的,因此支持扩展.
我正在编写一个小游戏来教我自己的OpenGL渲染,因为它是我尚未解决的问题之一.我之前使用过SDL,同样的功能,虽然仍然表现不佳,但并没有像现在那样超越顶级.
基本上,我的游戏还没有太多进展,只是一些基本的动作和背景绘图.当我切换到OpenGL,它看起来好像是这样太快了.我的每秒帧数超过2000,此功能耗尽了大部分处理能力.
有趣的是,它的SDL版本中的程序使用了100%的CPU但运行顺畅,而OpenGL版本只使用了大约40% - 60%的CPU,但似乎对我的显卡征税,使我的整个桌面变得无法响应.坏.
它不是一个太复杂的功能,它根据玩家的X和Y坐标呈现1024x1024背景图块,以给出运动的印象,同时玩家图形本身保持锁定在中心.因为它是用于更大屏幕的小瓷砖,所以我必须多次渲染它以将瓷砖拼接在一起以获得完整的背景.下面代码中的两个for循环迭代12次,合并,所以我可以看到为什么当每秒调用2000次时这是无效的.
所以为了达到目的,这是邪恶的行为者:
void render_background(game_t *game)
{
int bgw;
int bgh;
int x, y;
glBindTexture(GL_TEXTURE_2D, game->art_background);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &bgw);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &bgh);
glBegin(GL_QUADS);
/*
* Start one background tile too early and end one too late
* so the player can not outrun the background
*/
for (x = -bgw; x < root->w + bgw; x += bgw)
{
for (y = -bgh; y < root->h + bgh; y += bgh)
{ …Run Code Online (Sandbox Code Playgroud) opengl ×6
c++ ×4
sdl ×2
vsync ×2
c ×1
cocoa ×1
frame-rate ×1
freeglut ×1
macos ×1
optimization ×1
performance ×1
wgl ×1
windows ×1