2016-02-26 104 views
0

我正在爲需要計劃C++遊戲項目的課程做一個報告。計劃的一部分是估計程序需要多少內存。我真的不確定如何去解決這個問題。計算一個程序(計劃中)需要多少內存

我是否應該估計變量的數量及其類型,類別的數量,功能的數量,用於該項目的文件,例如,位圖文件等...並加上多少內存所有這些組合將使用?我是以完全錯誤的方式來看這個和/或是愚蠢的嗎?隨意說!

任何幫助都將不勝感激。

在此先感謝。

+0

由於這是當然,我猜你需要做到這一點。不過,我會考慮尋找http://store.steampowered.com/hwsurvey,如果你的估計都遠不及平均平臺(一個或多個)。然後繼續前進並發展。 –

回答

3

我應該估計變量及其類型

那些只需要很小的空間的數量。對於什麼值得你設置這個數字等於零(或一個小常量)。

類和結構是邏輯的類的數量,它們不佔用實際空間中的後面的程序(除了運行時類型信息,反射和這樣,這是negligble)。類和結構是程序員用來構造數據的。但是,一旦編譯器與他們完成,它就像其他任何東西一樣是平坦的數據。

的功能

不相干的數量,因爲用作所謂的節目圖像的一部分中不是變量和緩衝液以不同的方式佔用存儲器。在典型的PC上,他們將在RAM中執行,是的。但是,如果您正在爲微控制器開發遊戲,那麼這些功能將位於只讀閃存中,並且根本不消耗任何RAM。

用於項目例如文件位圖文件等...

這是更喜歡它。但是您也必須查看運行時動態創建的所有信息。

那麼你確實有看就是,有多少信息將您的遊戲發生在緩衝區;無論是從文件讀取或程序生成。例如,它是非常簡單的寫一個球體上創建點的程序:

struct v3 { 
    double x, y, z; 
    v3(double x_, double y_, double z_) : x(x_),y(y_),z(z_) 
}; 
std::vector<v3> sphere; 
for(int i_phi = 0; i_phi < n_phi; ++i_phi) 
for(int i_theta = 0; i_theta < n_theta; ++i_theta) { 
    double phi = 2*M_PI * (double)i_phi/n_phi; 
    double theta = M_PI * (double)i_theta/n_theta; 

    sphere.push_back(v3(
     cos(phi) * sin(theta), 
     sin(phi) * sin(theta), 
     sin(-M_PI_2 + theta) 
    )); 
} 

這個程序很容易編譯成只有幾百字節的代碼。不過說我選擇n_phi = 10000,n_theta = 10000則需要的內存將是(假設sizeof(double)=8

sizeof(v3) = sizeof(double)*3 = 24 bytes 
sizeof(v3) * 10000 * 10000 = 24 * 100 000 000 = 2.4*10^9 bytes 

即超過2GiB。這就是你應該如何解決這個問題的方法:遵循你的程序正在做的事情,估計產生的數據量。

+0

太棒了!非常感謝你! – CoconutDug

0

如果您正在使用Visual Studio,請嘗試探索診斷工具中的內存管理。否則,你可以手動通過計算圖像,變量,數組的大小等估計它

0

你的程序有可能會從

  1. 圖書館使用內存:全部加載到內存中,如果不是已經在內存中。
  2. 靜態存儲:陣列等
  3. 函數,誤用的內聯函數將極大地增加內存使用量,以及那些聲明巨大常量數組的函數。

通過緩存數據進出文件或通過網絡緩存數據(以性能爲代價或需要偶爾進行緩衝),可以減輕很多數據量。

您包含的任何庫最終都會從靜態庫的程序啓動或動態庫的需求中加載它們的功能。即使不使用額外的庫,所有這些C++/C函數,許多抽象,vtables都必須存儲在內存中,並且它們需要存儲在內存中的內容越多,則將使用的內存越多。

內存泄漏也會增加您的內存使用量,因爲內存不能再被訪問。

除了理論,您需要研究哪些分析器適合您,並學習如何有效地使用它們來測量您需要的信息(例如內存使用情況)。

與測量結果相比,完全錯誤地預期程序需要多少內存並不罕見。除非您習慣了大部分情況,否則我會偶爾會經常感到驚訝。

還有其他的方法,但很難徹底地超過它。

+0

謝謝你的回答。這有幫助。 – CoconutDug