VisualC++6.0とDirectX7.0を使って、RPGを作っています。
 マップチップ等のグラフィックデータを、実行時にビットマップファイルから読み込んでいるんですが、ここで疑問がわきました。
 プライマリサーフェスのビット深度は16(HighColor相当)に設定しているんですが、ビットマップファイル中のデータはビット深度8(256色)で作成しています。
 元データのデータ量を小さくするためにそうしているんですが、これってプログラムを走らせたときのメモリ使用量や実行速度に影響があるんでしょうか。
 ちなみにビットマップファイルからオフスクリーンサーフェスへの読み込みには、API(GetDC)を使ってDCを取得した後、同じ大きさで作ったオフスクリーンサーフェスにブリット転送する方法をとっています(一般的な方法だと思うんですが...)。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

OpenGLユーザですが僭越ながら。



ご質問の内容は、「ファイルからCPUメモリにビットマップデータを
読み込んで、ビデオメモリに転送する。そのときに、ファイルとCPU
メモリでは8BitPerPixelだけど、ビデオメモリは16bppである。メモリ
使用量と処理速度への影響は?」ということですよね。

つまらない回答ですが、コードと環境に依存する、としか言えないような
気がしますが…。

明らかにCPUメモリからビデオメモリに転送する際にデータ形式が異なって
(8bppと16bpp)いれば、変換作業が必要になり、原理的に速度は低下します
よね。(手もとのOpenGLハンドブックでピクセル転送を最適化する方法の
一つに、データ変換が無いようにするというのがあります)

しかし、当然データ量が増えればCPUメモリからビデオメモリへの転送に
時間がかかり、また、ファイルからCPUメモリへの読み込みにも時間が
かかります。当たり前ですが。その辺の速度とデータサイズ、読み込み・転送の
発生頻度を勘案して、適当な方法を考える、としか言えないと思います。

私は、毎秒20フレームくらいの頻度でレンダリングを行い、800x1000程度
の大きさの24bppのレンダリング領域を同じフレームレートででCPUメモリに
取りこみ、レンダリングを行なっていないときを見計らってディスクに書きこむ、
その後、書きこんだファイルを読み込みながら、20フレーム/秒の
レンダリングの過程をそのまま再生するという、CPUとグラフィックボードに
頼りきりの力業のプログラムを先日書きましたが、そのときは、

・ファイルへの書きこみはレンダリングが暇なときに行なうので、
 ある程度時間が掛かっても良いだろう = ファイルサイズが大きくても良い
・ビデオメモリからCPUメモリへの転送は、レンダリング終了
 直後に行なうので、できるだけ速い方が良い

という理由から、24bppをそのままCPUメモリへ転送し、ファイルへ書き出す
という方法を取りました。しかし、それが本当に良かったのかは分りません。
取り敢えずは動いたため、他のデータ形式をためさなかったんで。
    • good
    • 0
この回答へのお礼

丁寧な解説ありがとうございます。
やっぱり基本的には
 元データが小さい→メモリ使用量が減る
 データ変換が必要ない→転送速度が上がる
という均衡関係にある、ということなんですね。

お礼日時:2001/06/08 00:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qビットマップハンドルからビットマップボタンを作りたいです

MFC初心者です。どうかよろしくお願いいたします。
環境はVC++6.0 MFC ダイアログベースです。

HBITMAP hBitmap;

hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), (LPCTSTR)sSaveFile,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE);

を使ってビットマップハンドルを取得しました。

ここからボタンに貼り付ける方法がわかりません。
リソースにボタンを作った後、どのようにすれば良いでしょうか?

あと、ボタンの好きな位置にビットマップを貼り付ける方法も教えていただけると幸いです。

Aベストアンサー

あら惜しいとこまで……。

クラスウィザードでボタンのメンバ変数を追加しましょう。タイプはCButtonで。

ほいで OnInitDialog あたりで CButton::SetBitmap メソッドなんかを呼び出すのが手っ取り早い方法です。
(ボタンにはBS_BITMAPスタイルを忘れずに)

あと、表示を細かく調整したいならオーナードローになるかと。

Qビットマップ画像を読み込むプログラムがうまく行きません。困ってます…。

こんにちは。大学4年のyu-tinと申します。
現在、大学の研究で使用するためのプログラムとして、以下の機能を持ったプログラム作りに取り込んでいます。

1)ビットマップ画像(グレースケール、縦480×横640pixel)を読み込み、
 その画像の1つ1つの画素の輝度値を表示させる
2)読み込んだビットマップ画像を出力させる

しかし、作成したプログラムがうまく行きません。以下の3つの問題が発生しています。

a)0行0列~1行383列までの画素値がおかしい。
 (0,0,0,0,1,1,1,0,2,2,2,0,3,3,3,0,…,254,0,255,255,255,0 となっている)
b)出力した画像の最上部2行程度に、細くて黒い線が表示される。
 (読み込んだ画像と全く同じ画像を出力させたい)
c)出力した画像が、”ディスクエラー”によりPhotoshopで開けない。
 (ペイントでは開ける)

その問題のプログラムは、以下の通りです。
しかし、このプログラムは、他人のプログラムに改良を加えて作成したものです。なので、このプログラム自体、私自身が完璧に理解できていない状況です。

私は、プログラミングに関しては初心者に近いので、丁寧に教えて頂けると大変助かります。
研究が先に進まず、大変困っています…。みなさま、本当に、本当によろしくお願い致します。



//ビットマップ画像に関するプログラム。
//画像の表示と輝度値の表示を行う。

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>

#define X_SIZE 640  //画像の横幅(ピクセル数)
#define Y_SIZE 480  //画像の縦幅(ピクセル数)
#define Z_SIZE 1    //1つの画素に含まれる色の数

void *malloc(size_t size);

void main(void)
{
 int i, j, k;   //ループ用変数 i…縦の画素用, j…横の画素用, k…色数用
 int x=0;    //画像の横幅(ピクセル数)*/
 int y=0;     //画像の縦幅(ピクセル数)
 FILE *fp;

/***********元画像データのメモリ確保*********/
 BYTE ***mae;
 mae=(BYTE ***)malloc(sizeof(BYTE **)*Y_SIZE);
 for(i = 0; i < Y_SIZE; i++){
  mae[i]=(BYTE **)malloc(sizeof(BYTE *)*X_SIZE);
 }
 for(i = 0; i < Y_SIZE; i++){
  for(j = 0; j < X_SIZE; j++){
   mae[i][j]=(BYTE *)malloc(sizeof(BYTE)*Z_SIZE);
  }
 }

/*******画像の読み込み・輝度値の表示*******/
 fp=fopen("sample1.bmp","rb");   //画像”sample1”を開く

 BITMAPFILEHEADER bmfh;
 BITMAPINFOHEADER bmih;

 fread(&bmfh,sizeof(bmfh),1,fp);
 fread(&bmih,sizeof(bmih),1,fp);

 x=bmih.biWidth;  //インフォヘッダに含まれる画像の幅情報をxに代入
 y=bmih.biHeight;  //インフォヘッダに含まれる画像の高さ情報をyに代入

 for(i = 0; i < y ;i++){
  for(j = 0; j < x; j++){
   fread(&mae[i][j][0],sizeof(BYTE),1,fp);
   if(i<640 && j<480)printf("%d, %d, %d\n",i, j, mae[i][j][0]);   //輝度値を表示
  }
 }
 fclose(fp);

/**************画像の表示*************/
 //画像”sample1”を”sample2”という名前で出力する
 fp = fopen("sample2.bmp" ,"wb");

 //ヘッダの書き込み
 fwrite(&bmfh,sizeof(bmfh),1,fp);
 fwrite(&bmih,sizeof(bmih),1,fp);

 for(i = 0; i < bmih.biHeight; i++){
  for(j = 0; j < bmih.biWidth; j++){
   fwrite(&mae[i][j][0],sizeof(BYTE),1,fp);
  }
 }
 fclose(fp);  //ファイルをクローズ

}

こんにちは。大学4年のyu-tinと申します。
現在、大学の研究で使用するためのプログラムとして、以下の機能を持ったプログラム作りに取り込んでいます。

1)ビットマップ画像(グレースケール、縦480×横640pixel)を読み込み、
 その画像の1つ1つの画素の輝度値を表示させる
2)読み込んだビットマップ画像を出力させる

しかし、作成したプログラムがうまく行きません。以下の3つの問題が発生しています。

a)0行0列~1行383列までの画素値がおかしい。
 (0,0,0,0,1,1,1,0,2,2,2,0,3...続きを読む

Aベストアンサー

ビットマップファイルにはビット深度が24ビット未満の場合
このファイルで使用されるパレットが登録されています
BITMAPINFOHEADER と 実際のビットイメージの間に
RGBA*何色といったパレットが存在します
グレースケールの8bitなら256個です
何個あるかは BITMAPINFOHEADERのbiClrUsedがそれに当ります
これが0ならbiBitCountをビットシフトして求めます
1 << biBitCountが個数になります
実際のバイトデータとしては
(1 << biBitCount) * sizeof(RGBQ) バイト存在します

したがって
BYTE* pPalette = (BYTE*)calloc( sizeof(RGBQ), (1 << biBitCount) );
とバッファを宣言して

fread(&bmih,sizeof(bmih),1,fp);
の後で
fread( pPalette, sizeof(RGBQ), (1 << biBitCount), fp );
を実行してから
色情報を取得しましょう

書き出すときも同じように
fwrite(&bmih,sizeof(bmih),1,fp);
の後で
fwrite( pPalette, sizeof(RGBQ), (1 << biBitCount), fp );
を実行します

あと動的に確保したバッファは使い終わったら free()で開放しましょう

return 0;の前に
 free( pPalette );
 for(i = 0; i < Y_SIZE; i++){
  for(j = 0; j < X_SIZE; j++){
   free(mae[i][j]);
  }
 }
 for(i = 0; i < Y_SIZE; i++){
  free(mae[i]);
 }
 free(mae);
といった具合に 逆順に開放していきます

ビットマップファイルにはビット深度が24ビット未満の場合
このファイルで使用されるパレットが登録されています
BITMAPINFOHEADER と 実際のビットイメージの間に
RGBA*何色といったパレットが存在します
グレースケールの8bitなら256個です
何個あるかは BITMAPINFOHEADERのbiClrUsedがそれに当ります
これが0ならbiBitCountをビットシフトして求めます
1 << biBitCountが個数になります
実際のバイトデータとしては
(1 << biBitCount) * sizeof(RGBQ) バイト存在します

したがって
BYTE* pPalette...続きを読む

QhDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWn

hDC=::GetDC(m_hWnd)とhDC=GetDC(m_hWnd)の違いについて

表題について,お伺いします。
ビットマップをダイアログに表示するソースコードを
書いてますが,参考書やさまざまなHPでは,
ウィンドウハンドルをゲットする際に

hDC=::GetDC(m_hWnd) ○
↑と書かれております。

hDC=GetDC(m_hWnd)  ×
↑はなぜだめなのでしょう。

 ●このスコープ演算子::は何の為につけているのですか?

::が無いとエラーになるので必要みたいですが・・

Aベストアンサー

どういうエラー(リンクエラー、コンパイルエラー)なのかがわからないので、
あくまで憶測ですが、
Windows.hで定義されているGetDC()の他に、
別のスコープに(例えばクラスのメソッドとして)、
GetDC()が定義されているのではないでしょうか?

上記の状態でスコープ演算子がないときには、
同じクラス(スコープ)にあるGetDC()を先に呼ぶことになるので、
目的のWindows.hのGetDC()を呼ぶことができないのだと思います。

参考URL:http://wisdom.sakura.ne.jp/programming/cpp/cpp7.html

Q32ビットのアプリで、64ビットOSのシステムフォルダ先のiniファイルを読み込むには

お世話になります。
C#2005で開発しております。

WinXPで作成したexeで、C:\Windows\System32の下のiniファイルを読み込んでおります。
このexeを64bit版Win2008Serverで実行したいのですが、
C:\Windows\SysWOW64にインストーラーで作成されたiniファイルを以下のコードで読み込むことが出来ません。

string strIniFilePath = Environment.SystemDirectory + "\\****.INI";

64bit版で32ビットのものを実行する場合は、C:\Windows\SysWOW64に読み込みをしなければならないと認識しております。
また、64bit版Win2008Serverのsystem32フォルダに置くと、読み込むことが出来ます。
iniファイルはdllと違い、system32の下に置かなければいけないのでしょうか。

お手数ですが、ご教授いただきたくお願い申し上げます。

Aベストアンサー

http://itpro.nikkeibp.co.jp/article/COLUMN/20051121/224935/

「そこで64ビットWindows(WOW64)は,32ビット・アプリケーションが,例えばC:\WINDOWS\system32にアクセスすると,C:\WINDOWS\SysWOW64にリダイレクトする(図14[拡大表示])。」
と言うのが重要。

つまり
・32ビットアプリケーションは、インストーラーにより、C:\Windows\SysWOW64にインストールしなければならない
・32ビットアプリケーションをC:\Windows\System32にインストールしてはならない(iniファイルも然り。C:\Windows\System32に32ビット用iniファイルを置いてはならない)
・32ビットアプリケーションは、C:\Windows\SysWOW64にアクセスする場合は、C:\Windows\System32にアクセスし、WOW64によってリダイレクトして貰わねばならない
・32ビットアプリケーションは、C:\Windows\SysWOW64にアクセスするようなハードコーディングをしてはならない
って事です。

なお、
string strIniFilePath = System.Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\****.INI";
の方が安全です。

http://itpro.nikkeibp.co.jp/article/COLUMN/20051121/224935/

「そこで64ビットWindows(WOW64)は,32ビット・アプリケーションが,例えばC:\WINDOWS\system32にアクセスすると,C:\WINDOWS\SysWOW64にリダイレクトする(図14[拡大表示])。」
と言うのが重要。

つまり
・32ビットアプリケーションは、インストーラーにより、C:\Windows\SysWOW64にインストールしなければならない
・32ビットアプリケーションをC:\Windows\System32にインストールしてはならない(iniファイルも然り。C:\Windows\Syst...続きを読む

Qバッファのデータをビットマップで表示するにはどうしたら良いんでしょうか?

visual C++ で

1.カメラ(静止画)から得た画像をバッファに取り込む。
2.バッファにあるデータを(配列で)ビットマップで表示する。

にはどうしたら良いんでしょうか?
また、他に何か良い方法があったら教えて下さい。

Aベストアンサー

1. カメラから画像を取り込む
これについては、カメラ側の仕様が分からないことには、なんとも言えません。DirectShowを用いてキャプチャ可能かもしれませんし、あるいはTWAINを使う必要があるかもしれません。

2. バッファにあるデータをビットマップ表示する
これに関しても、バッファ内のデータがどのような形式かに依存します。画像データを表す方式はYV12, I420, UYVY, RGB24などいくつもあり、これをWindowsが表示可能な形式(RGB24, RGB32など)に変換する必要があります。

もしバッファ内のデータがRGB形式の場合は、CreateCompatibleBitmap WIN32関数にデータを渡すなどして、直接ビットマップオブジェクトを作成することが可能です。

下記のページが参考になるかと存じます。

参考URL:http://black.sakura.ne.jp/~third/system/winapi/win105.html


人気Q&Aランキング

おすすめ情報