Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Самописаная игра постепенно смачно отжирает все ОЗУ

#cpp #sdl


Помогите плиз, этот код после запуска постепенно отжирает все ОЗУ.

Что может быть не так?

        #include "stdafx.h"
        #include 
        #include 
        #include 
        #include 

      int state = 0;
      bool showToBeDone = false;

      void action(int i) {
        if (i == 0) {
            state = 3;
        }
        else if (i == 1) {
            showToBeDone = true;
        }
        else {
            state = 4;
        }
    }
    bool XYInRect(const SDL_Rect& rect, int x, int y)
    {
        return ((x >= rect.x && x <= rect.x + rect.w) && (y >= rect.y && y <= rect.y
+ rect.h));
    }
    int main(int argc, char *argv[])
    {
        SDL_Rect prect;
        std::string input = "";
        const char* username = "Pavel";
        prect.x = 300;
        prect.y = 50;

        bool isRunning = true;
        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();
        int active = 0;

        SDL_Window* window = SDL_CreateWindow("Beeries 3", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
        SDL_Surface* screen = SDL_GetWindowSurface(window);

        while (isRunning == true) {
            SDL_FillRect(screen, NULL, 0x000000);
            /*if (state == 0) {
            SDL_Surface* hello = SDL_LoadBMP("startup.bmp");
            SDL_BlitSurface(hello, NULL, screen, NULL);
            SDL_UpdateWindowSurface(window);
            SDL_Delay(1000);
            SDL_FreeSurface(hello);
            hello = NULL;
            state = 3;
            }
            else if (state == 3) {*/
            SDL_Surface* fon = SDL_LoadBMP("fon.bmp");

            SDL_BlitSurface(fon, NULL, screen, NULL);

            int size = 0;
            SDL_Surface* pivo = NULL;

            TTF_Font* Sans = TTF_OpenFont("Roboto-Light.ttf", 24);
            SDL_Color wht = { 0,0,0,0 };


            SDL_Rect usernameRect;
            SDL_Surface* usernamed = NULL;
            pivo = SDL_LoadBMP("pivo.bmp");
            // usernamed = TTF_RenderUTF8_Solid(Sans, username, wht);



            usernameRect.x = prect.x;
            usernameRect.y = prect.y + 150;

            SDL_Surface* chat = SDL_LoadBMP("chat.bmp");
            SDL_Surface* txt = NULL;
            SDL_Rect chatRect;
            chatRect.x = 50;
            chatRect.y = 500;

            SDL_Rect msgRect;
            msgRect.x = 70;
            msgRect.y = 550;
            SDL_BlitSurface(chat, NULL, screen, &chatRect);
            const char* etext = input.c_str();
            txt = TTF_RenderText_Solid(Sans, etext, wht);
            SDL_BlitSurface(txt, NULL, screen, &msgRect);
            SDL_Event e;

            while (SDL_PollEvent(&e)) {
                if (e.type == SDL_MOUSEBUTTONDOWN) {
                    int x;
                    int y;

                    SDL_GetMouseState(&x, &y);

                    if (y <= 200) {}
                    else if (XYInRect(chatRect, x, y)) {

                    }
                    else {
                        prect.x = x - 100;
                        prect.y = y - 100;

                        SDL_BlitSurface(pivo, NULL, screen, &prect);
                        SDL_UpdateWindowSurface(window);
                    }
                }
                else if (e.type == SDL_KEYDOWN) {
                    if (e.key.keysym.scancode != 21 && e.key.keysym.scancode != 42
&& input.length() < 29) {
                        input += SDL_GetScancodeName(e.key.keysym.scancode);
                        std::cout << input << std::endl;

                    }
                    else if (e.key.keysym.scancode == 42) {
                        input = input.substr(0, input.size() - 1);
                        std::cout << input << std::endl;
                    }
                    else {
                        /* menu here */
                    }
                }
            }



            SDL_BlitSurface(pivo, NULL, screen, &prect);
              SDL_BlitSurface(usernamed, NULL, screen, &usernameRect);
              SDL_UpdateWindowSurface(window);

              /*}
              else {
              isRunning = false;
              }
              */
          }
          SDL_Quit();
          return 0;
      }

    


Ответы

Ответ 1



Не знаю как у вас устроен код, но должно быть хотяб так для начала. SDL_Surface* fon = SDL_LoadBMP("fon.bmp"); SDL_Surface* pivo = SDL_LoadBMP("pivo.bmp"); SDL_Surface* usernamed = TTF_RenderUTF8_Solid(Sans, username, wht); SDL_Surface* chat = SDL_LoadBMP("chat.bmp"); SDL_Surface* txt = NULL; TTF_Font* Sans = TTF_OpenFont("Roboto-Light.ttf", 24); int size = 0; SDL_Color wht = { 0,0,0,0 }; SDL_Rect usernameRect; while (isRunning == true) { SDL_FillRect(screen, NULL, 0x000000); SDL_BlitSurface(fon, NULL, screen, NULL); size = 0; //wht = { 0,0,0,0 }; usernameRect.x = prect.x; usernameRect.y = prect.y + 150; txt = NULL; } Также вам придётся освобождать память (думаю в конце функции main для вашего кода и до SDL_Quit();) при помощи: SDL_FreeSurface(fon); SDL_FreeSurface(pivo); SDL_FreeSurface(usernamed); SDL_FreeSurface(chat); SDL_FreeSurface(txt); TTF_CloseFont(Sans); // и ещё шрифт выгрузить. SDL_Quit(); // выгрузить библиотеку

Ответ 2



Вы не освобождаете ресурсы, которые получаете. К тому-же переопределяя в цикле указатели на ресурсы, которые не освобождены (fon, Sans и др.), Вы теряете возможность их освободить. Смотрите функции SDL_FreeSurface, TTF_CloseFont, SDL_DestroyWindow. И внимательно читайте документацию по библиотеке, которую Вы используете.

Комментариев нет:

Отправить комментарий