2016-07-07 3 views
0

Я делал игру с SDL2, и вскоре в игре было слишком много ОЗУ, чтобы даже закрыть. Я удалил код и обнаружил, что даже эта бессмысленная файловая программа использует 100% моего процессора и гигабайт ОЗУ.SDL_Renderer использует 100% процессор и гигабайт оперативной памяти ничего не делать

#include "SDL.h" 
#include "SDL_image.h" 
#include <cassert> 

const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

SDL_Renderer* gRenderer; 
SDL_Window* gWindow; 

void init(); 
void close(); 

int main() 
{ 
    init(); 
    SDL_Event e; 
    bool quit; 

    while(!quit) 
    { 
     while(SDL_PollEvent(&e) != 0) 
     { 
       if(e.type == SDL_QUIT) 
        quit = true; 
     } 
    } 
    close(); 
} 

void init() 
{ 
    assert(SDL_Init(SDL_INIT_EVERYTHING) >= 0); 
    gWindow = SDL_CreateWindow("Space", SDL_WINDOWPOS_UNDEFINED, 
        SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, 
        SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 
    assert(gWindow); 

    gRenderer = SDL_CreateRenderer(gWindow, -1, SDL_RENDERER_ACCELERATED); 
    assert(gRenderer); 

    int imgFlags = IMG_INIT_PNG; 
    assert(IMG_Init(imgFlags) & imgFlags); 

    SDL_SetRenderDrawColor(gRenderer, 0xFF, 0xFF, 0xFF, 0xFF); 
} 

void close() 
{ 
    SDL_DestroyRenderer(gRenderer); 
    SDL_DestroyWindow(gWindow); 

    IMG_Quit(); 
    SDL_Quit(); 
} 
+0

Это рекомендуемый способ использования SDL. – cp420

+0

Что именно происходит, чего вы не ожидаете? Не просто перечислите все, что вы наблюдаете: скажите, что вы ожидаете *, а потом спросите, почему это не так, как вы ожидаете. ** В вышеупомянутом «вопросе» нет вопроса ** – Yakk

+0

Хорошо, эта программа буквально ничего не делает, кроме запуска SDL и цикла, но это занимает 100% моего процессора и более гигабайта оперативной памяти. Добавление немного больше к этому делает программу полностью остановленной. Я тестировал его на двух компьютерах, один с процессором i7. Эта простая программа не должна иметь такого влияния, и я хочу знать, почему это происходит. – cp420

ответ

1

Вы запускаете программу как можно быстрее, поэтому она использует все ресурсы, которые она может получить.

Попробуйте ограничить FPS.

+0

Да, протестировал его, и он работал на 410 000 кадров в секунду. Я удержал его в 60 раз, и это решило проблему. Спасибо и user3684240 за помощь. – cp420

+0

Я слышал, что у Starcraft 2 была такая же ошибка в меню. Хотя это не связано с SDL. –

0

Использование assert может использовать много оперативной памяти, возможно, вам стоит не использовать их. Попробуйте просто, если проверить свои инициализации.

Редактировать: похоже, проблема с ОЗУ не исходила из этого. Извините за плохой ответ

+1

Это звучит очень сомнительно, как лучше. У вас есть ссылки? – Quentin

+0

У меня нет ссылок, но я использовал assert() для проверки инициализации моей тренировки SDL2 [игры] (https://github.com/Paingouin/Roguelike-SDL2-train), и для этого требуется много баранов запустите его (~ 380mo) ... Я заменил assert() на простые условия «if == NULL» (я знаю, что это не полная проверка ошибок, но это работает для большинства основных проблем), а моя прога теперь 7.8mo " только "... Если кто-то может объяснить, почему ... – Paingouin

+0

Я пытаюсь повторно использовать assert, и моя работа работает правильно (не более 380mo) ... Я не могу объяснить, почему ... Извините за плохой ответ , Хотя это было так. – Paingouin

1

Как уже упоминал Иван, вы должны попытаться ограничить FPS своей программы. Один из способов сделать это - использовать SDL_GetTicks для измерения продолжительности, а затем использовать SDL_Delay, если он достаточно быстр. Таким образом, современный компьютер будет спать большую часть времени в то время как плохой будет по-прежнему получать хорошие частоты кадров:

while(running) { 
    auto time = SDL_GetTicks(); 
    // Rendering and event handling 
    if ((SDL_GetTicks() - time) < 10) { 
    SDL_Delay(10); 
    } 
} 

Вы должны играть немного с числами (10 и 10 в примере), чтобы увидеть, как много FPS ваша программа нуждается.