Search code examples
c++sdlsdl-2

Why the rendered squares duplicate?


My problem is that when i run programm it runs normally for around 10-20 seconds, and then it glitch out. You can see further what's happening on the video.

https://youtu.be/YOlhjQFTzZc

This error is hunting me for over a month, First i thought this was some mistake in making shorter Render function. But not. You can see it here.

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);

}

But when i started "researching" on this topic more, i discovered that it happen even without using this function!

Here is code from the video:

#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);

        }
    }

}

If i wrote something wrong or explained anything wrong, feel free to comment on this post. Any help will be useful, thanks ; )


Solution

  • You shouldn't call IMG_Load repeatedly. (I suspect that you're running out of memory pretty quickly.)

    Load all images at startup and store pointers to the resulting surfaces.

    // 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.
    }