2013-08-30 11 views
8

私はOpenGLGlewFreeglutで練習し始めました。フリーグルート、OpenGLとメモリ

私のアプリケーションに関する質問があり、誰かが同じ問題に遭遇したかどうか疑問に思っていましたか?

最初にアプリケーションを実行すると、使用されるメモリは約22,000 KBです。ウィンドウを最小化して最大化した後は、2900-3,300 KBのメモリしか必要とせず、ウィンドウを最小化し最大化した後でも、ウィンドウがフォーカスされている間にマウスとキーボードの入力を実行しても引き続き行います。

これはなぜそうなのですか?私はFreeGlutについてあまりよく知らないので、FreeGlutでウィンドウを最小化/最大化するときに他の誰かがこの動作に気付いているのか疑問に思っています。または、これはOS-specificのものでしょうか?

前にそれを言及していないため申し訳ありませんが、私は、Windows XP SP3を使用していると私は、次のコード行でOpenGLコンテキストを設定してい:

glutInit(&argc, argv); 
glutInitContextVersion(3, 3); 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
glutInitWindowPosition(30, 30); 
glutInitWindowSize(1000, 562); 
glutCreateWindow("Testing"); 

glewExperimental = GL_TRUE; 
glewInit(); 
+0

使用しているOSはどれですか?GLコンテキストをどのように設定しますか(つまり、FreeGLUTに何を渡しますか)。 – thokra

+0

すべての私のGLアプリにそれを行うためのスクリプトを作成してください!自動化された最小化(意図しない)は、オペレーティングシステム間で共通の機能になるはずですか?しかし、すべての正直なところ(「ジョーク・アズ・サイド」、SigTerm)は、メモリをページアウトしてから、ウィンドウを復元した後で再度必要なくなるでしょうか? – jozxyqk

+0

どのようにメモリ使用量を測定し、それについて心配していますか?現代のシステムでは少なくとも2GBのRAMが必要です。私の8GBマシンでは、22000 KBは全メモリ使用量の0.27%です。あなたは単にそれを無視することができます。 – SigTerm

答えて

4

これは非常にOSに依存し、また依存どのようにメモリ使用量を測定するかについて、私はあなたに、なぜこれがMicrosoft Windows上で起こっているのかについての少しの洞察を与えることができます。マイクロソフトでは、WDDMベースのドライバを使用するアプリケーションでのユーザーモードのメモリ使用について、次のように述べています。

既存のゲームやその他のグラフィックアプリケーションでは、アプリケーションのビデオメモリリソース使用する。ビデオメモリの内容が失われた場合、アプリケーションはこのコピーを使用してディスプレイをすばやく復元します。たとえば、ユーザーがAlt + Tabキーを押すか、ユーザーがコンピュータをスタンバイ状態にすると、アプリケーションはこのコピーを使用します。通常、DirectXの実行時は、アプリケーションが管理対象リソースを作成するときに、アプリケーションの代わりにコピーを管理します。ただし、アプリケーションはコピー自体を管理することもできます。コピーが使用する仮想メモリは、アプリケーションが割り当てるビデオメモリリソースに正比例します。

ここでMicrosoftはDirectXの問題について説明していますが、実際にはOpenGLにも当てはまります。 OpenGLは通常、「デバイスが失われた」イベントを完全に透過的に処理します(これはOpenGL自体の一部ではなく、この場合はWGLです)。 OpenGL 4.xのソフトウェアで実際にこれらのイベントを受け取ることはできますが、存在しないようなふりをしたいロバストネス拡張機能の1つを使用してください。いずれにしても、私はこれが責任であると思われます。

割り当てられた仮想メモリページ数(仮想サイズ)、または実際の常駐ページ(作業/常駐セット)の単純なカウントであっても、アプリケーションのメモリ消費量の測定方法によってメモリ消費量は大きく異なります。 Windowsでは、通常はワーキングセットの尺度であるメモリ消費量でタスクマネージャを調べます。ワーキングセットは非常に曖昧な概念であり、通常、「最近」参照されたページの数を参照します。正確な瞬時に実際にどのくらいのメモリが常駐しているかに関係なく、サンプリングされるタイミングに応じて拡大/縮小することができます。私はこれを通常のドライバの振る舞いに分け、このメモリが恐らく何かに深刻な影響を与えることはないと考えています。

現代のデスクトップ64ビットプラットフォーム(x86-64)上で実行している場合は、実際には48ビットのハードウェアアドレス空間(256 TiB)があり、OSはこれを分けます(8 TiBはオンになります) Windows)を使用しているため、22,000 KiBは完全に重要ではありません(実際にソフトウェアを64ビットとしてコンパイルした場合)。