SDL 2程序使用1.4 GB的内存?

时间:2014-07-29 22:48:56

标签: c++ memory sdl sdl-2

好吧,所以我一直在努力研究这个小小的弹跳DVD徽标,我正在慢慢占据越来越多的记忆。最终它最终耗费了1.4 GB然后减速并崩溃。这是代码,它导致它执行此操作有什么问题?

#include <iostream>
#include <stdlib.h>
#include <time.h>

#include <SDL2/SDL.h>
#include <SDL2_ttf/SDL_ttf.h>
#include <SDL2_image/SDL_image.h>
// This sets ups the display.
SDL_Window* window = SDL_CreateWindow("DVD Thingy", 100, 100,
                                        800, 600, SDL_WINDOW_SHOWN
                                        | SDL_RENDERER_ACCELERATED
                                        | SDL_RENDERER_PRESENTVSYNC);
SDL_Renderer* screen = SDL_CreateRenderer(window, -1, 0);

void drawText(char text[], int origX, int origY, SDL_Renderer* ren, TTF_Font* font, SDL_Color color) {
    SDL_Surface* surfaceMessage = TTF_RenderText_Blended(font, text, color);
    SDL_Texture* Message = SDL_CreateTextureFromSurface(ren, surfaceMessage);
    int w = surfaceMessage->w;
    int h = surfaceMessage->h;
    SDL_Rect messageRect = {origX, origY, w, h};
    SDL_RenderCopy(ren, Message, NULL, &messageRect);

    SDL_DestroyTexture(Message);
}

int main() {
    // This initializes the font class.
    srand(time(NULL));
   TTF_Init();
   int skyboxColor = 240;
   bool done = false;
   int dirX = 1, dirY = 1;
   TTF_Font* font = TTF_OpenFont("./Impact.ttf", 18);
   TTF_SetFontOutline(font, 1);
   int dvdX = rand() % 800, dvdY = rand() % 600-20;
   SDL_Color white = {255, 255, 255};
   SDL_Event event;
   while (!done) {
        while (SDL_PollEvent(&event)) {
            switch(event.type) {
                case SDL_QUIT:
                    SDL_Quit();
                    return 0;
                default:
                    break;
            }
        }
        dvdX += dirX;
        dvdY += dirY;
        if (dvdX > 770) {
            dirX = -1;
        }
        if (dvdX < 0) {
            dirX = 1;
        }
        if (dvdY < -3) {
            dirY = 1;
        }
        if (dvdY > 580) {
            dirY = -1;
        }
        SDL_SetRenderDrawColor( screen, 0, 0, 0, 255);
        SDL_RenderClear(screen);
        drawText("DVD", dvdX, dvdY, screen, font, white);
        SDL_RenderPresent(screen);
        SDL_Delay (1/1000 * 60);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:5)

drawText()函数中,您似乎是通过调用TTF_RenderText_Blended()来创建新的SDL_Surface。

你必须确保在完成它时释放这个表面,这似乎是在创建它的函数的末尾。你已经破坏了从表面创建的纹理,所以你只需要添加之后是一行:

SDL_DestroyTexture(Message);
SDL_FreeSurface(surfaceMessage);   <- Free the surface

由于drawText()在主while循环中被不断调用,因此SDL_Surfaces使内存膨胀。

还有一点,因为你似乎没有改变来自&#34; DVD&#34;你可以创建一次纹理,然后只需要在任何地方绘制它。这比创建,绘制然后销毁每个drame更有效。