首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >限制不同计算机上的游戏速度

限制不同计算机上的游戏速度
EN

Stack Overflow用户
提问于 2010-02-21 03:49:11
回答 3查看 1.3K关注 0票数 3

我正在使用OpenGL和C++创建一个2D游戏。

我想让游戏在不同的计算机上以相同的速度运行,目前我的游戏在我的台式机上运行得比我的笔记本电脑快(即我的玩家在我的台式机上移动得更快)

有人告诉我QueryPerformanceCounter(),但我不知道如何使用它。

我该如何使用它,或者是否有更好/更简单的方法?

我的显示功能

代码语言:javascript
复制
void display()                                  
{
static long timestamp = clock();
// First frame will have zero delta, but this is just an example.
float delta = (float)(clock() - timestamp) / CLOCKS_PER_SEC;

glClear(GL_COLOR_BUFFER_BIT);

glLoadIdentity();

createBackground();

int curSpeed = (player.getVelocity()/player.getMaxSpeed())*100;

glColor3f(1.0,0.0,0.0);
glRasterPos2i(-screenWidth+20,screenHeight-50);
glPrint("Speed: %i",curSpeed);

glRasterPos2i(screenWidth-200,screenHeight-50);
glPrint("Lives: %i",lives);

glRasterPos2i(screenWidth-800,screenHeight-50);
glPrint("Heading: %f",player.getHeading());

for(int i = 0;i<90;i++){
    if (numBullets[i].fireStatus == true){
        numBullets[i].updatePosition(player);
        if (numBullets[i].getXPos() > screenWidth || numBullets[i].getXPos() < -screenWidth || numBullets[i].getYPos() > screenHeight || numBullets[i].getYPos() < -screenHeight ){
            numBullets[i].fireStatus = false;
            numBullets[i].reset(player);
            numBullets[i].~Bullet();
        }
    }
}

player.updatePosition(playerTex,delta);

glFlush();

timestamp = clock();

}

我的Update positiom方法

代码语言:javascript
复制
void Player::updatePosition(GLuint playerTex, float factor){
//draw triangle
glPushMatrix();

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, playerTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glTranslatef(factor*XPos, factor*YPos, 0.0);
glRotatef(heading, 0,0,1);
glColor3f(1.0,0.0,0.0);
    glBegin(GL_POLYGON);
        glTexCoord2f(0.0, 1.0); glVertex2f(-40,40);
        glTexCoord2f(0.0, 0.0); glVertex2f(-40,-40);
        glTexCoord2f(1.0, 0.0); glVertex2f(40,-40);
        glTexCoord2f(1.0, 1.0); glVertex2f(40,40);
    glEnd();

glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
glPopMatrix();

XPos += speed*cos((90+heading)*(PI/180.0f));
YPos += speed*sin((90+heading)*(PI/180.0f));
}
EN

Stack Overflow用户

发布于 2010-02-23 21:53:10

问题的最佳解决方案是每10毫秒(或类似的情况)仅更新一次对象的位置,但应尽可能频繁地渲染对象。这就是所谓的“固定时间步长”,因为你只能以固定的时间间隔更新游戏状态。这要求您将呈现代码与更新代码解耦(这无论如何都是一个好主意)。

基本上(在psudoe代码中),你会这样做:

代码语言:javascript
复制
accumulatedTimeSinceLastUpdate = 0;
while(gameIsRunning)
{
  accumulatedTimeSinceLastUpdate += timeSinceLastFrame();
  while(accumulatedTimeSinceLastUpdate >= 10) // or another value
  {
    updatePositions();
    accumulatedTimeSinceLastUpdate -= 10;
  }
  display();
}

这意味着,如果您的计算机正在运行超级复制程序,快速显示()将被调用很多次,并且会时不时地调用updatePositions()。如果您的计算机速度极慢,则每次调用display()时,可能会多次调用updatePositions。

这是另一个很好的读物(除了Mason Blier的):

  • http://gafferongames.com/game-physics/fix-your-timestep/
票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2303440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档