5

ええと、知りたいです..多分他の人も。

プログラミング、特に C または C++ によって、画面上の各ピクセルを個別に制御することは可能ですか?

現在の画面のドライバを特別に制御する必要がありますか? ピクセルを変更できるオペレーティング システムはありますか (たとえば、すべての上にメッセージ/オーバーレイを描画するなど)。

それとも、WindowsはおそらくWinApiでこれをサポートしていますか?

編集:

ゲーム中にプロセッサが過熱したときにコンピュータに警告を表示させたいので、この質問をしています。私は主に Windows を使用していますが、デュアル ブートの ubuntu ディストリビューションを使用しています。

4

3 に答える 3

5

あなたが下に行くほど、あなたはより多くの面倒に遭遇するでしょう。

生のピクセル操作が必要な場合は、 http://www.libsdl.org/をチェックしてください。これは、サーフェス/ウィンドウなどの作成の手間を軽減するのに役立ちます。

Linuxには、必要に応じてさらに低くするためのいくつかの手段があります(つまり、「windows」や「xwindows」などはなく、生の画面だけです)。興味がある場合は、Linuxフレームバッファを調べてください。

さらに深く掘り下げると(独自のOSで何かを行うなど)、BIOSを使用すると、特定のビデオモードに入ることができます。これは、OSインストーラーが使用する傾向があるものです(少なくとも、以前は使用していましたが、一部のより洗練されたものは使用しなくなりました) 。これは物事を行うための最速の方法ではありませんが、いくつかの組み立て手順でピクセルを表示する領域に入ることができます。

そしてもちろん、独自のOSを実行してビデオカードを利用したい場合(BIOSをバイパスする)、ビデオドライバなどを作成することについて話していることになります。これは明らかにかなりの作業量です:)


画面上にメッセージをオーバーレイするなど、Windowsはそのようなものをサポートしているので、WinAPIを使用してそれを実行できると確信していますが、それを簡単にするライブラリが存在する可能性があります。しかし、そのようなことをするために深く掘り下げる必要はないことを私は知っています。

于 2012-12-28T16:07:37.140 に答える
3

一度に各ビットを見てみましょう。

プログラミング、特に C または C++ によって、画面上の各ピクセルを個別に制御することは可能ですか?

おそらく。これは実際にはグラフィックス アーキテクチャに依存し、多くの最新のシステムでは、実際の画面の表面 (つまり、「画面に表示されるピクセルの集まり」) は直接ソフトウェアの制御下にあるわけではありません。少なくとも「ユーザーモード」からではありません (つまり、あなたまたは私が作成できるアプリケーションから - ドライバー コードを作成する必要があり、既存のグラフィックス ドライバーと十分に連携する必要があります)。

データをオフスクリーン バッファに描画し、BitBlt [BitBlockTransfer] 関数を使用してコンテンツを画面にコピーすることが、この種のことを行うための好ましい方法であると一般に認められています。

したがって、実際には、画面上の各ピクセルを操作することはおそらくできませんが、そうであるように見せることはできます。

現在の画面のドライバを特別に制御する必要がありますか?

画面メモリに直接アクセスできると仮定すると、コードは確かにドライバーと協力する必要があります-そうでなければ、画面に表示したいものが他の何かによって上書きされないと誰が言いますか[たとえば、完全にしたい]画面へのアクセス、およびクロックアップデーターは、描画したものに加えて、1分ごとに画面上の時間を更新します]。

大きな「フレームバッファ」として画面メモリにアクセスできる「穴」があるモードにドライバを設定できる場合があります。Windowsでこれを行う簡単な方法はないと思います。2003 年から 2005 年にかけてグラフィックス ドライバーを書いて生計を立てていたときのことを覚えていません。

ピクセルを変更できるオペレーティング システムはありますか (たとえば、すべての上にメッセージ/オーバーレイを描画します)。

最新のグラフィックス カードのハードウェアでオーバーレイ レイヤーを作成することは絶対に可能です。これが一般的なビデオ再生のしくみです。ビデオは、他のグラフィックスの上にオーバーレイされるフレームバッファ メモリの一部に再生されます。ドライバーの助けが必要です。これは、私が覚えている限り、DirectX を介して Windows API で確実に利用できます。

それとも、WindowsはおそらくWinApiでこれをサポートしていますか?

おそらくですが、正確に答えるには、あなたが何をしようとしているのかをよりよく理解する必要があります.

編集:あなたの特定のユースケースでは、音を鳴らしたり、CD / DVDドライブを取り出したりする方が適切なオプションかもしれないと思っていたでしょう。ゲームで描画されたグラフィックスの上に何かを重ねるのは難しい場合があります。ゲームは、利用可能なグラフィックス リソースをできるだけ多く使用しようとすることが多いためです。単純なユースケース - 異なる描画/エンジン/グラフィックス ライブラリを使用する複数の異なるカテゴリのゲームで機能するものは気にしないでください。最近のCPUは過熱にかなり耐性があるため、過度に心配する必要があるかどうかも完全にはわかりません。そのため、CPUは遅くなり、停止する可能性がありますが、ヒートシンクを取り外しても壊れません。 、うまくいきません [いいえ、これを試すことはお勧めしません!]

于 2012-12-28T16:38:35.307 に答える
1

すべてのプラットフォームは、効率的な生のピクセル ブロック転送「別名 BitBlt()」をサポートしているため、本当にフレーム バッファ レベルに移動したい場合は、ビットマップを割り当て、ポインタを使用してその内容を直接設定し、1 行のコードでこのメモリ チャンクを効率的にフリップできます。ビデオRAMバッファに。もちろん、PCI フレームバッファを直接操作するほど効率的ではありませんが、一方で、このアプローチ (BitBlt) は Win95 の時代でさえ、Wolfenstein 3d を Pentium CPU に移植するのに WinG を使用せずに十分高速でした。

ただし、このビットマップを作成する際には、フォーマット (つまり、RGB 16 ビットまたは 32 ビットなど) をデバイスの実際のモードと一致させるように注意する必要があります。これはあなたのスピードを完全に殺します。

したがって、目標にもよりますが、3D ゲームが必要な場合、このアプローチではパフォーマンスが低下します。いくつかの形状をレンダリングするだけで、10 ~ 15 fps 以上を必要としない場合、これはデバイス ドライバー レベルに飛び込まなくても機能します。

Windows でのオーバーレイに関するいくつかのヒントを次に示します。

hdc = GetDC(0);//returns hdc for the whole screen and is VERY fast

画面に HDC を使用し、BItBlt(hdc, ..... SRCCOPY) を実行して、ラスターのブロックを効率的に反転できます。デスクトップ用の事前定義された Windows ハンドルもありますが、正確なメカニズムは思い出せませんが、複数のモニターを使用している場合は、デスクトップごとに HDC を取得できます。「GetDesktopWindow」、「GetDC」などを見てください...

于 2012-12-28T16:22:34.370 に答える