相关疑难解决方法(0)

SDL_GL_SwapBuffers()间歇性地慢

我有一个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)

c++ opengl sdl

6
推荐指数
1
解决办法
3794
查看次数

wglGetProcAddress返回NULL

我试图使用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?

c++ opengl wgl

4
推荐指数
1
解决办法
4827
查看次数

如何在OpenGL中启用VSYNC

WGL_EXT_swap_control扩展允许在Windows上执行此操作,但我无法找到任何远程跨平台执行相同操作,即同步我的缓冲区交换与屏幕刷新.我的应用程序使用GLEW,所以提供的东西更可取.对Linux,Mac和Windows的跨平台支持是必要的,但如果无法设置同步,我的应用程序将不会中断(例如,用户已将其强制关闭在其图形驱动程序中).

我将接受程序代码在许多平台上使用GLEW作为有效答案.

c++ opengl vertical-sync vsync

3
推荐指数
1
解决办法
9225
查看次数

Cocoa OpenGL解锁帧率

我希望能够在没有锁定帧率的情况下运行我的游戏(目前为60 fps).我发现运行动画的唯一方法是使用NSTimer.有没有办法在Cocoa中拥有不受限制的帧率.如果是这样,链接或代码段将有很大帮助.

opengl macos performance cocoa frame-rate

2
推荐指数
2
解决办法
4970
查看次数

使用OpenGL中的过量使用vsync的麻烦

我拼命想让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函数的返回是真的,因此支持扩展.

c++ windows opengl freeglut vsync

1
推荐指数
1
解决办法
5748
查看次数

如何优化此功能?(几乎使用所有处理能力)

我正在编写一个小游戏来教我自己的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)

c opengl optimization sdl

0
推荐指数
1
解决办法
301
查看次数

标签 统计

opengl ×6

c++ ×4

sdl ×2

vsync ×2

c ×1

cocoa ×1

frame-rate ×1

freeglut ×1

macos ×1

optimization ×1

performance ×1

vertical-sync ×1

wgl ×1

windows ×1