Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么此SDL代码中的运动在窗口模式下会出现抖动_C++_Performance_Sdl_Frame Rate - Fatal编程技术网

C++ 为什么此SDL代码中的运动在窗口模式下会出现抖动

C++ 为什么此SDL代码中的运动在窗口模式下会出现抖动,c++,performance,sdl,frame-rate,C++,Performance,Sdl,Frame Rate,由于某些原因,当处于窗口模式时,正方形的运动看起来很颠簸。我很确定我没有正确地优化我的代码,这不是驱动程序的问题,因为我以前在窗口模式下玩过OpenGL+SDL游戏,一切都很好 以下是代码(已更新以包括与帧率无关的运动): #包括 #包括 const int width=1600; const int height=900; 常数int colordepth=32; void initVideo(){ SDL_表面*屏幕; SDL_Init(SDL_Init_视频); 屏幕=SDL_设置视频模式

由于某些原因,当处于窗口模式时,正方形的运动看起来很颠簸。我很确定我没有正确地优化我的代码,这不是驱动程序的问题,因为我以前在窗口模式下玩过OpenGL+SDL游戏,一切都很好

以下是代码(已更新以包括与帧率无关的运动):

#包括
#包括
const int width=1600;
const int height=900;
常数int colordepth=32;
void initVideo(){
SDL_表面*屏幕;
SDL_Init(SDL_Init_视频);
屏幕=SDL_设置视频模式(宽度、高度、颜色深度、SDL_OPENGL | SDL_GL |双缓冲区
|SDL_全屏//如果我对此进行评论,它会滞后
);
如果(!屏幕){
SDL_退出();
出口(1);
}
SDL_WM_SetCaption(“急动试验”);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(0,宽度,高度,0,1,-1);
glMatrixMode(GLU模型视图);
glEnable(GL_纹理_2D);
}
int main(int argc,字符**argv){
initVideo();
int x;
SDL_事件;
长时间=0;
while(true){
while(SDL_事件和事件)){
if(event.type==SDL\u KEYDOWN){
SDL_退出();
}
}
glClear(GLU颜色缓冲位);
glBegin(GL_QUADS);
glVertex2i(x425);
glVertex2i(x+50425);
glVertex2i(x+50475);
glVertex2i(x475);
格伦德();
long-elapsedTimeMilis=SDL_GetTicks()-lastTime;
x+=1*(elapsedtimimimilis/(1000/60));
lastTime=SDL_GetTicks();
SDL_GL_SwapBuffers();
}
}

您可以在每个帧中增加相同数量的x。但是,不能保证帧速率是恒定的。您更应该做的是测量经过的时间,根据经过的时间增加。这将意味着无论帧速率如何,正方形在同一时间移动相同的距离。

您可以在每帧中增加相同的x。但是,不能保证帧速率是恒定的。您更应该做的是测量经过的时间,根据经过的时间增加。这意味着无论帧速率如何,正方形都会在同一时间移动相同的距离。

但为什么全屏显示会影响这一点?这似乎不是造成它的原因。不确定,但如果是全屏模式,帧缓冲区就是屏幕缓冲区。在窗口模式下,帧缓冲区是一个屏幕外内存块。然后需要一个额外的阶段来将窗口与应用程序外部的屏幕元素组合在一起。我添加了一个计时器,并相应地改变了移动,但这似乎无法修复它。震动以固定的时间间隔发生。(每隔半秒它会停止移动几毫秒)。请尝试将while(SDL_PollEvent(&event))更改为if(SDL_PollEvent(&event))。您可能希望加入一些逻辑,将帧速率限制在最大60fps,但为什么全屏显示会影响这一点?这似乎不是造成它的原因。不确定,但如果是全屏模式,帧缓冲区就是屏幕缓冲区。在窗口模式下,帧缓冲区是一个屏幕外内存块。然后需要一个额外的阶段来将窗口与应用程序外部的屏幕元素组合在一起。我添加了一个计时器,并相应地改变了移动,但这似乎无法修复它。震动以固定的时间间隔发生。(每隔半秒它会停止移动几毫秒)。请尝试将while(SDL_PollEvent(&event))更改为if(SDL_PollEvent(&event))。您可能需要加入一些逻辑,将帧速率限制在最大60fps
#include <SDL/SDL.h>
#include <GL/gl.h>
const int width = 1600;
const int height = 900;
const int colourDepth = 32;
void initVideo(){
    SDL_Surface *screen;
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(width, height, colourDepth, SDL_OPENGL|SDL_GL_DOUBLEBUFFER
        |SDL_FULLSCREEN//if I comment this out it lags
        );
    if(!screen){
        SDL_Quit();
        exit(1);
    }
    SDL_WM_SetCaption("JERKINESS TEST", "");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
}
int main(int argc, char** argv){
    initVideo();
    int x;
    SDL_Event event;
    long lastTime = 0;
    while(true){
        while(SDL_PollEvent(&event)){
            if(event.type==SDL_KEYDOWN){
                SDL_Quit();
            }
        }
        glClear(GL_COLOR_BUFFER_BIT);

        glBegin(GL_QUADS);
            glVertex2i(x, 425);
            glVertex2i(x+50, 425);
            glVertex2i(x+50, 475);
            glVertex2i(x, 475);
        glEnd();
        long elapsedTimeMilis = SDL_GetTicks() - lastTime;
        x+= 1 * (elapsedTimeMilis/(1000/60));
        lastTime=SDL_GetTicks();
        SDL_GL_SwapBuffers();
    }
}