C++ 为什么渲染的方块会重复?

C++ 为什么渲染的方块会重复?,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我的问题是,当我运行程序时,它会正常运行约10-20秒,然后出现故障。你可以在视频中看到更多发生的事情 这个错误困扰了我一个多月,首先我认为这是在缩短渲染函数时的错误。但不是。 你可以在这里看到 void Render(char * image_place, int object_x, int object_y) { SDL_Surface * object_image = IMG_Load(image_place); SDL_Rect object_position;

我的问题是,当我运行程序时,它会正常运行约10-20秒,然后出现故障。你可以在视频中看到更多发生的事情

这个错误困扰了我一个多月,首先我认为这是在缩短渲染函数时的错误。但不是。 你可以在这里看到

void Render(char * image_place, int object_x, int object_y)
{
    SDL_Surface * object_image = IMG_Load(image_place);
    SDL_Rect object_position;
    object_position.x=object_x;
    object_position.y=object_y;
    SDL_BlitSurface(object_image, NULL, ekran, &object_position);

}
但当我开始更多地“研究”这个话题时,我发现即使不使用这个函数,它也会发生

以下是视频中的代码:

#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
#include <windows.h>
#include <time.h>

using namespace std;

//SDL
SDL_Window * okno;
SDL_Surface * ekran;
SDL_Rect pozycja_obramowki;
SDL_Event zdarzenie;
SDL_Rect tlo_pos;

//zmienne
int x_obraz=0;
int y_obraz=0;

int main(int argc, char*args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    okno = SDL_CreateWindow("LevelEditor",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, 1280, 720, NULL);
    ekran = SDL_GetWindowSurface(okno);

    while(true)
    {
        {//render
            SDL_Surface * tlo = IMG_Load("biel.png");
            tlo_pos.x=0;
            tlo_pos.y=0;
            SDL_BlitSurface(tlo,NULL, ekran, &tlo_pos);

            SDL_Surface * obramowka = IMG_Load("obramowka.png");
            pozycja_obramowki.x=x_obraz;
            pozycja_obramowki.y=y_obraz;
            SDL_BlitSurface(obramowka,NULL, ekran, &pozycja_obramowki);
        }
        {//zdarzenia
            if(SDL_PollEvent(&zdarzenie))
            {
                if(zdarzenie.type==SDL_QUIT)
                {
                    return 0;
                }
            }


        }
        {//sterowanie
            if(GetAsyncKeyState(VK_RIGHT)) {x_obraz=x_obraz+5;}
            if(GetAsyncKeyState(VK_LEFT)) {x_obraz=x_obraz-5;}
            if(GetAsyncKeyState(VK_UP)) {y_obraz=y_obraz-5;}
            if(GetAsyncKeyState(VK_DOWN)) {y_obraz=y_obraz+5;}

        }
        {//fps end & odswiezanie ekranu
            SDL_UpdateWindowSurface(okno);

        }
    }

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
//SDL
SDL_窗口*okno;
SDL_表面*ekran;
pozycja_obramowki博士;
SDL_活动zdarzenie;
SDL_Rect tlo_pos;
//兹米安
int x_obraz=0;
int y_obraz=0;
int main(int argc,char*args[]
{
SDL_Init(SDL_Init_EVERYTHING);
okno=SDL_CreateWindow(“LevelEditor”,SDL_WINDOWPOS_居中,SDL_WINDOWPOS_居中,1280720,NULL);
ekran=SDL_GetWindowSurface(okno);
while(true)
{
{//render
SDL_表面*tlo=IMG_荷载(“biel.png”);
tlo_位置x=0;
tlo_位置y=0;
SDL_BlitSurface(tlo、NULL、ekran和tlo_位置);
SDL_表面*obramowka=IMG_载荷(“obramowka.png”);
pozycja_obramowki.x=x_obraz;
pozycja_obramowki.y=y_obraz;
SDL_BlitSurface(obramowka、NULL、ekran和pozycja_obramowki);
}
{//zdarzenia
if(SDL_PollEvent(&zdarzenie))
{
if(zdarzenie.type==SDL\u QUIT)
{
返回0;
}
}
}
{//sterowanie
if(GetAsyncKeyState(VK_RIGHT)){x_obraz=x_obraz+5;}
if(GetAsyncKeyState(VK_左)){x_obraz=x_obraz-5;}
if(GetAsyncKeyState(VK_UP)){y_obraz=y_obraz-5;}
if(GetAsyncKeyState(VK_DOWN)){y_obraz=y_obraz+5;}
}
{//fps end&odswiezanie ekranu
SDL_更新内表面(okno);
}
}
}

如果我写错了什么或解释错了什么,请随意评论这篇文章。任何帮助都会很有用,谢谢;)

您不应该重复调用
IMG\u Load
。(我怀疑您的内存很快就用完了。)

在启动时加载所有图像,并存储指向结果曲面的指针

// Moved out of the loop
SDL_Surface * tlo = IMG_Load("biel.png");
SDL_Surface * obramowka = IMG_Load("obramowka.png");

while(true)
{
    // As before, but without declaring the variables mentioned above.
}

您不应该重复调用
IMG\u Load
。(我怀疑您的内存很快就用完了。)

在启动时加载所有图像,并存储指向结果曲面的指针

// Moved out of the loop
SDL_Surface * tlo = IMG_Load("biel.png");
SDL_Surface * obramowka = IMG_Load("obramowka.png");

while(true)
{
    // As before, but without declaring the variables mentioned above.
}

谢谢,成功了!:汉克斯,这很有效D