2011-01-11 15 views
2

私はネイティブのAndroidアプリケーションでテクスチャのメモリ消費を最適化しようとしています。最初に呼ばれるたびにTexImageをインクリメントいる私自身です:テクスチャ場合OpenGL ESテクスチャメモリ

g_cbTextureMemory += ImageLineBytes(Format, width) * height; 

あなたは、現在の画像サイズの減少は、新規に追加するよりも、そこにある私の実際のコードでは、TexImageはテクスチャに1回呼び出さことを前提としていて私は2つのカウンタを持っています再割り当てされますが、実際には再割り当ては行われません。

第二には、システムから次のとおりです。

adb shell dumpsys meminfo my.app.name 

それはこのような何か与える:私は次のようにします。その後

** MEMINFO in pid 3269 [my.app.name] ** 
        native dalvik other total 
      size: 39320[*] 6663  N/A 45983 
     allocated: 21453  3945  N/A 25398 
      free:  34  2718  N/A  2752 
      (Pss):  6281  3078 40643 50002 
    (shared dirty):  2240  4968 12108 19316 
    (priv dirty):  6232  2684 17948 26864 

を:私はダミーの1x1を送信することにより、(1×1ですべてのテクスチャを置き換えますimageからglTexImageへ)。私はmeminfoが別の結果をもたらし、22Mbでセル[*]の違いが変わったことを知っています。しかし私のカウンターは25Mbのテクスチャを持っていることを示しているので、25Mbを期待しています。

ダンプテクスチャメモリの消費量が隠されていますか?クリアするには、1x1のテクスチャダンプは

** MEMINFO in pid 3269 [my.app.name] ** 
        native dalvik other total 
      size: 16892  5575  N/A 22467 
     allocated: 13211  3574  N/A 16785 
      free:  208  2001  N/A  2209 
      (Pss):  6273  3122 17016 26411 
    (shared dirty):  2252  5032 10756 18040 
    (priv dirty):  6224  2588  5848 14660 

私は25Mbを得られませんでしたか?は統計的な誤差ですか?ネイティブヒープにはテクスチャメモリが含まれていますか?あるいは、Androidの内部フォーマットがいくつかのフォーマットに異なる場合がありますか?例えば、R8G8B8はもっと最適なものに変換されました(それはそうではないようです)?それはすべて大丈夫、合理的な説明がありますか?

答えて

2

ここにいくつかの問題があります。

「サイズ」の行を比較すると22MBの差があるとします。これは、プロセスが合計で要求したメモリ量です。この値に寄与する要因は2つあります。

1つは、その領域内の多くの仮想ページが物理メモリに割り当てられていない可能性があります。物理的な割り当ては、プロセスが実際には未使用の仮想ページを参照している場合にのみ発生します。その場合、MMUによってCPUがカーネルにトラップされ、カーネルは物理ページを見つけて割り当て、仮想ページをバックアップします。したがって、スワップスペースを持たないポータブルなAndroid搭載デバイスであっても、ほとんどのページが参照されない限り、利用可能な物理RAMをはるかに超えたサイズのプロセスが存在する可能性があります。

プロセスのサイズに影響を与える第2の要因は、Cライブラリ(またはDalvik VM、または任意のユーザー空間のメモリ管理)が、アプリケーションが要求するよりも大きなチャンクでメモリを要求することです。これは、システムコールを行わずに小さなバッファを頻繁に割り当てる/割り当てを解除することができるため、パフォーマンス上の理由から実行されます。したがって、プロセスによって使用される実際のメモリは、上記のsizeパラメータによってうまく表示されません。粗い上限としてのみ機能します。実際に参照されたページを追跡するので、アプリケーションによって使用されている最大メモリを「割り当て済み」の行にするとよいでしょう。

いずれにせよ、私が理解する限り、glTexImage経由でOpenGLに送信するテクスチャは、別のメモリ領域にコピーされます。これは、グラフィックハードウェア自体に存在していても、カーネル空間のカーネルビデオドライバの一部として存在していてもかまいません。どちらの方法でも、使用するテクスチャメモリはアプリケーションに反映されません。

希望に役立ちます。