每一轮循环逐渐减慢我的SDL游戏

时间:2017-06-09 19:24:23

标签: c sdl

我正在使用SDL 1.2库开展一个小sokoban游戏。这个程序最有趣的可能性是在地图上移动一个角色。但是,我面临一些奇怪的减速问题,我找不到原因。

我简化了代码,因此它不会太长。

这是让角色移动的循环:

以下对应于游戏的块(地图的每个案例)及其在屏幕上的位置。例如,bloc[3]是指向与第4个地图相对应的曲面的指针。

SDL_Surface *bloc[256] = {NULL};
SDL_Rect pos_bloc[256];
while (on == 1)
    {
        SDL_WaitEvent(&event);
        switch (event.type)
        {
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        on = game_menu(screen);
                        refresh_screen(screen, bloc, pos_bloc, zone);
                        break;
                    case SDLK_UP:
                        if (zone[m - 16] == ' ') // m is the position of the character on
                                                 // the map. As the map is 16 blocks large,
                                                 // and the position in the map is registered
                                                 // in a string, m - 16 means: 1 case up.
                                                 // m + 16 means: 1 case down.
                            m = swap_2blocs(screen, bloc, pos_bloc, zone, m, -16, "up.bmp");
                        break;
                    case SDLK_DOWN:
                        if (zone[m + 16] == ' ')
                            m = swap_2blocs(screen, bloc, pos_bloc, zone, m, 16, "down.bmp");
                        break;
                    default:;
                }
            default:;
        }
        SDL_Flip(screen);
    }

无论何时按下向上或向下键,它都会调用一个交换2个表面的函数:它释放所有相关的SDL_Surface指针,然后为另一个表面重新分配一些内存:

int     swap_2blocs(SDL_Surface *screen, SDL_Surface *bloc[256], SDL_Rect pos_bloc[256], char zone[257], int m, int n, char *character)
{
    SDL_FreeSurface(bloc[m]); // The surface pointed to by `bloc[m]` is freed
    bloc[m] = SDL_LoadBMP("empty_space.bmp"); // `bloc[m]` now points to another surface
    SDL_BlitSurface(bloc[m], NULL, screen, &pos_bloc[m]);
    zone[m] = ' '; // zone is the string that contains informations about each map block
                   // ' ' stands for an empty space, 'M' stands for the character
    m += n;
    zone[m] = 'M';
    SDL_FreeSurface(bloc[m]); // The surface pointed to by `bloc[m]` is freed
    bloc[m] = SDL_LoadBMP(character); // `bloc[m]` now points to another surface
    SDL_BlitSurface(bloc[m], NULL, screen, &pos_bloc[m]);
    return m;
}

有几件事要知道:

  1. 问题随机出现3次中有1次。
  2. 在15-25事件(按键或按键)后,开始感觉到减速效果。在30次事件之后,它开始变得很慢(按下按键的时刻和角色在屏幕上移动的时刻之间大约有300ms)。
  3. 它的速度比这些近似的300毫秒慢。
  4. 当出现问题时,返回主菜单(这意味着释放bloc中包含的每个指针所指向的所有表面)并开始新游戏并不会重置速度。游戏。要重置它,必须退出程序然后重新启动。
  5. 我想了解这种神秘的行为:它来自哪里?发生了什么事?

0 个答案:

没有答案