2016-07-07 52 views
0

我正在用SDL2製作一款遊戲,並且在遊戲中不久就要花費太多RAM才能關閉。我剝離了代碼,發現即使這個毫無意義,一個文件程序使用我的CPU和一個RAM的演出。SDL_Renderer使用100%的CPU和一盤RAM不做任何事

#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和循環外,該程序沒有其他問題,但它佔用了我CPU的100%以及超過1 GB的RAM。再增加一點讓程序完全停下來。我在兩臺電腦上測試過它,一臺使用i7處理器。這個簡單的程序不應該有這種影響,我想知道它爲什麼這樣做。 – cp420

回答

1

您正在運行儘可能快的程序,因此它正在使用它可以獲得的所有資源。

嘗試限制FPS。

+0

是的,測試它,它運行超過410,000幀每秒lol。我很努力地在60分上限,並解決了這個問題。感謝您和user3684240的幫助。 – cp420

+0

我聽說星際爭霸2在菜單中有同樣的錯誤。雖然與SDL無關。 –

0

使用斷言可以使用大量的RAM,也許你應該考慮不使用這些。試試簡單的如果測試你的初始化。

編輯:這似乎是RAM的問題不是從那裏來的。對不起,我的答案是

+1

這聽起來很可疑。你有參考嗎? – Quentin

+0

我沒有參考,但我曾經使用assert()來檢查初始化我的SDL2訓練[遊戲](https://github.com/Paingouin/Roguelike-SDL2-train),它需要很多內存運行它(〜380mo)...我已經用簡單的「if == NULL」條件替換了assert()(我知道這不是完全錯誤檢查,但它適用於大多數重大問題),我的編程現在需要7.8mo「只有「...如果有人可以解釋爲什麼... – Paingouin

+0

我已經重試了再次使用斷言和我的前衛工作正常(不再380mo)...我無法解釋爲什麼...對不起, 。我雖然是這樣。 – Paingouin

1

正如Ivan已經提到的,你應該嘗試限制你的程序的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。