問題タブ [video-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - UIImageView & ビデオメモリ
UiimageViews に興味深い問題があります。画面にたくさんの画像をロードするアプリケーション (2 つの家を持つゲーム) があります (UIIMageView を使用しています)。ios4.3 では正常に動作しますが、ios5 では多くのクラッシュが発生します (spc プログラムの空きメモリを調べたところ、違いは約 40 ~ 50 MB です!)。
@2x イメージ (Retina デバイス用) を可能な限りすべて削除しましたが、クラッシュは多少少なくなりましたが、まだ存在しています。
私が分析したところ、すべてのクラッシュがviewWillAppearとviewDidAppearの間で発生することがわかりました。画像がビデオ メモリにロードされたときのように見えます。
ゲームには 2 つの家があり、最初に家をロードしてから、家をアンロードできます (もちろん、計器は漏れがないことを示しています)。セカンドハウスを読み込もうとすると、クラッシュします。画像がビデオメモリからアンロードされていないようです。出来ますか ?
@2x 画像を削除すると、より多くの家をロードできますが、viewWillAppear と viewDidAppear の間で再びクラッシュすることがあります。
ありがとう、
iphone - CALayer OpenGL(-ES) テクスチャ メモリ使用量
テクスチャ メモリを大量に使用する iPhone アプリがあります。アプリのどの CALayers がテクスチャ メモリを使いすぎているかを把握しようとしています。
残念ながら、特定の CALayer が使用しているテクスチャ メモリの量を把握できません。
私が使用できる良いトリックはありますか?
opengl - OpenGLプログラミングを介してビデオメモリ全体にアクセスする
OpenGLプログラミングを介してグラフィックカードのビデオメモリにアクセスするには、具体的には、ビデオメモリのすべてのコンテンツを取得するにはどうすればよいですか?
次の2つの方法を試しましたが、失敗しました。それらを添付することで、私のプログラムまたはビデオメモリの構造の理解におけるエラーを指摘していただければ幸いです。前もって感謝します!
私の基本的な考え方は、ビデオメモリのすべての内容を調べるまで、ビデオメモリに初期化されていない領域を割り当て続けることです。
(1)main関数で、ダブルバッファーを使用してウィンドウを作成します(次のコードを参照)。
次に、「myDisplay」関数で、最初にglReadPixels()関数を呼び出して、バックフレームバッファーから指定されたサイズのピクセルの長方形を読み取り、これらのピクセル情報を配列「PixelData」に保存し、最後にそれらのピクセル情報をに表示します。 glDrawPixels()関数を呼び出して画面を表示します。このプログラムを実行すると、黒いウィンドウのみが表示されます。デフォルトの色は黒です。つまり、ウィンドウには何も含まれていません。次に、バックフレームバッファから他の領域を読み取ろうとしましたが、すべてに何も含まれていません。
上記の結論は、バックフレームバッファには何も含まれていないということです。ただし、フロントバッファには現在の画面コンテンツ/ウィンドウのみが含まれている必要があるため、これは不合理です。したがって、画面の下部で開いて最小化された他のウィンドウのコンテンツはバックフレームバッファに含まれている必要がありますが、バックフレームバッファは空です。では、それらのウィンドウ(下部にある私が開いて最小化したもの)はどこに保存されますか?
私のプログラムに割り当てられたフレームバッファ(背面と前面)は、ビデオメモリ全体のごく一部しか占めていないと思います。したがって、これらの最小化されたWindowsコンテンツは、ビデオメモリの他の場所に保存する必要があります。
しばらくして、OpenGL frameBufferオブジェクト(FBO)の概要を読みましたが、次のような文があります。デフォルトでは、OpenGLは、ウィンドウシステムによって完全に作成および管理されるレンダリング先としてフレームバッファーを使用します。このデフォルトのフレームバッファは、ウィンドウシステムが提供するフレームバッファと呼ばれます。これは私の上記の推測を検証しているようです。
(2)次に、FBOがビデオメモリコンテンツ全体の調査に役立つことを期待して、FBOの作業を開始します。
以下のメイン関数では、FBOと7つのrenderbufferオブジェクト(RBO)を作成し、これらの7つのRBOをカラーアタッチメントポイントを介してこのFBOにアタッチします。
以下は、私のdisplayコールバック関数の主要部分です。その機能は、スペースキーを使用して、読み取るrenderBufferオブジェクトを制御し、そのコンテンツを画面に表示することです。
最終的な結果は残念です。すべてのrenderBufferオブジェクトの内容は空です。これらのRBOはすべて初期化されておらず、残りのコンテンツが含まれているはずだと思ったので、原因はわかりません。
c# - ビデオバッファへの直接アクセス
ビデオカードを使用して画面上で物事をレンダリングする場合、正しく理解していれば、3つのオプションしか利用できません。これらは
- DirectX(またはXNA)
- OpenGL
- WindowsDriverKitとグラフィックスドライバーの最小限の実装の作成
DirectXまたはOpenGLの経験はほとんどありませんが、私が知っていることから、レンダリングパイプラインに各ピクセルをどう処理するかを指示するピクセルシェーダープログラムを作成する必要があります。これらのシェーダーはHLSLでプログラムされています。しかし、私が知る限り、DirectXもOpenGLもbyte[]
、C#プログラムからバッファーを書き込んでレンダリングできるメモリへのポインターを返すことはできません。それとも私はここで間違っていますか?
RGBデータを書き込むことができるメモリへのポインタを返すだけのグラフィックスドライバの最小限の実装を実装することが可能であるため、WDKの方が適している可能性があります。したがって、一方ではDirectXまたはOpenGLが提供する(そして私は必要としない)すべての抽象化を取り除くことができましたが、他方ではドライバー開発の複雑さは正確に時間の節約にはなりません。
また、これに関する詳細情報を検索しているときに見つけたものから、DOSの昔は、開発者が画面バッファに直接描画できるアドレス0B00などがありました。もちろんなくなり、使用できなくなったと思いますが、互換性の理由から、このメモリスペースはまだ予約されています。どういうわけかこれを利用することは可能ですか?
画面に直接書き込むことができるように、C#からビデオメモリにアクセスする最も簡単な方法は何ですか?DirectXまたはOpenGLは、バイトの配列をどこかに直接コピーして配列し、レンダリングできるような機能を提供しますか?
assembly - ビデオ マップド メモリを使用して x86 アセンブリでカーソルの下に書き込む
ビデオ マップ メモリ (アドレス 0B800 から開始) を使用しようとする単純なアプリケーションを作成しています。ほとんどの場合、そのメモリに直接書き込むことができ、文字はすぐに画面に表示されますが、カーソルの下に直接書き込もうとすると、書き込もうとしたものがくっつかないことがわかります。これを回避する方法はありますか?カーソルの直下に書くにはどうすればよいですか?
現在、次のようなものを使用してメモリに書き込みます:
ここで、BX には属性と書きたい文字があります。
language-agnostic - コマンドをビデオ メモリに保存するか、PCIe 経由でコマンドにアクセスするか
私は現在、Fabian "ryg" Giesen による" A trip through the Graphics Pipeline " ブログ シリーズのパート 2を読んでいます。
この特定の部分で、彼は 1 つの興味深い点について話します。GPU が処理するコマンドは、GPU に常駐するビデオ メモリから、または PCI Express バス経由で CPU 側から読み取ることができます。
いくつかの長所と短所を暗黙のうちに理解しました。しかし、私はそれらについてかなりぼんやりしています。トレードオフを完全に理解しているとは言えません。とにかく、自分の考えを首尾一貫して提示しようとします。
ビデオメモリへのデータの保存:
- 間違いなく速い。
- ただし、メモリのオーバーヘッドがあります (帯域幅についてはわかりません)。
CPU からの読み取り:
- ビデオ メモリにデータを保存するのが無駄な場合 (おそらく、二度と使用されないため?) には、より良い方法である可能性があります。
- ビデオメモリにデータを保存すると、PCIe バスの帯域幅が節約されるため、そのデータを再利用するときに役立つと思います。
- ただし、この通信は、ビデオ メモリから直接読み取るよりも遅くなります。
この 2 つの間には、さらに多くの複雑さとトレードオフがあると感じています。また、上で述べたことが真実であるかどうかは完全にはわかりません。誰かに次のことをしてもらいたい:
- 私の理解を深めるために、いくつかの重要なトレードオフと、おそらく他の複雑さを説明してください。
- 私が上で言ったことは本当かどうかを確認してください! (これについてはまだよくわかっていません。)