ページ 11

画像表示の効率

Posted: 2011年8月21日(日) 15:40
by raisu@yahuu
すごい初心者質問なのですが手短にいきます ごめんなさい

画像を表示するときに表示座標と画像の名前を構造体にしています
そしてマップ切り替えの度に読込関数で構造体の中身を入れ替えています
構造体の内容をすべて引数で描画関数に渡しています

このようなやり方をしているのですが何しろ自分のやり方ですので間違っている気がしてなりません
(りゅうじんろく)プログラミングの館をみようと思っても難しくてよく分からないので
教えてください(わがままで申し訳ないです)

Re: 画像表示の効率

Posted: 2011年8月21日(日) 16:55
by h2so5
詳しい仕様が分からないので何ともいえませんが、
(たとえば構造体は実体を渡しているのかポインタを渡しているのかなど)
方法としては普通だと思います。

もう少し詳しく方法を教えていただければ、もっとアドバイスできると思いますよ。

Re: 画像表示の効率

Posted: 2011年8月21日(日) 17:33
by softya(ソフト屋)
ぱっと見の印象だと、画像のファイル名だけではなく画像のハンドルも構造体内に無いと変なのですが、それは無いのでしょうか?
※ DXライブラリじゃ無いにしても何らかのハンドル等はあるはずですが。

Re: 画像表示の効率

Posted: 2011年8月23日(火) 01:45
by raisu@yahuu
返信ができませんでした
ハンドルも構造体に入れたほうがいいのですか 分かりました

構造体は実体を渡していると思います 特にポインタとか気にかけたことがないので

ポインタで渡すと全体を渡さなくていいので処理が軽くなるといったことは聞いたことがあるのですが
これはどういうことなのでしょうか?教えてくださいませんか

それと自分は一度にゲームに使う画像を全て構造体に記憶させてしまうと
容量?がすごいことになるとおもうので画面が暗転するごとにif文で
構造体を新しい内容に書き換えているのですがこれは正しいですか?

質問ばかりですがお願いします すいません

Re: 画像表示の効率

Posted: 2011年8月23日(火) 10:02
by softya(ソフト屋)
言語、利用ライブラリなどが明言されていないのとゲームの種類ややりたいことがはっきりしないので一般論になりますが、ポインタと言っているのでCかC++だと仮定して書かせて貰います。
raisu@yahuu さんが書きました: 構造体は実体を渡していると思います 特にポインタとか気にかけたことがないので

ポインタで渡すと全体を渡さなくていいので処理が軽くなるといったことは聞いたことがあるのですが
これはどういうことなのでしょうか?教えてくださいませんか
ポインタを使用せずに構造体を引数とした場合は、関数には値渡し(コピー)となります。
つまり、関数を呼び出す度に構造体のコピーを作っているので重くなるわけです。
あと呼び出し先の関数で値渡しの構造体の内容を変更しても呼び出し元の構造体には変化が起きませんので注意してください。
raisu@yahuu さんが書きました: それと自分は一度にゲームに使う画像を全て構造体に記憶させてしまうと
容量?がすごいことになるとおもうので画面が暗転するごとにif文で
構造体を新しい内容に書き換えているのですがこれは正しいですか?
プレイが快適なら別に問題ないと思いますが、保持すべきものと個別に読み込むものは区別されるべきです。
常にメモリにあってほしいものと、容量を食い過ぎるから随時読むものはちゃんと設計して区分されているなら問題有りません。
これも画像が何であるか書かれていないので一般論として回答したしました。

Re: 画像表示の効率

Posted: 2011年8月23日(火) 18:12
by raisu@yahuu
えーと、ではif文で分岐させたほうが効率がいいということですかね
一応、主人公の画像とポーズしたときのメニュー画面ぐらいは常にメモリに入れておくつもりですが
すいません、何回も聞いて(画像がなんであるかとはどういうことかわかりませんが、2Dのbmpです)

トピックをたてるまでもないのでここで質問させてもらいますが(これが最後です分かれば消えますので)
staticで変数を宣言すると値を保持しておけると聞きましたが
この前、main関数と描画関数、キーボード入力関数にわけて絵が動き回るだけのゲームをつくったのですが
そのときにstaticで変数宣言をしていないのにも関わらず問題なく絵が動きました
普通、絵が動いた後に変数は消滅して元の場所から動くことはないと思うのですが・・・

Re: 画像表示の効率

Posted: 2011年8月23日(火) 18:21
by h2so5
staticで変数を宣言しなくても宣言された関数・ブロック内であれば値は保持されます。

Re: 画像表示の効率

Posted: 2011年8月23日(火) 18:28
by softya(ソフト屋)
raisu@yahuu さんが書きました:えーと、ではif文で分岐させたほうが効率がいいということですかね
一応、主人公の画像とポーズしたときのメニュー画面ぐらいは常にメモリに入れておくつもりですが
すいません、何回も聞いて(画像がなんであるかとはどういうことかわかりませんが、2Dのbmpです)
こちらもわからない事だらけで答えづらいのですが、最初にマップと言われてますのでマップチェンジ毎に不要な画像の破棄・必要な画像を読み込むことはまっとうな行為です。
で、関数に読み込む情報を構造体で渡して、構造体にあるハンドルに値を入れて呼び元に戻す場合は構造体ポインタである必要があります。
申し訳ないですが「えーと、ではif文で分岐させたほうが効率がいいということですかね」と出てくるかがわかりませんが、効率で言えば読み込み関数に構造体ポインタを渡したほうが良いと思いますが、構造体の構造やプログラムの構成が分からないのでYESとは断言できません。
曖昧な情報をもとに、かなり推測で書いているので正解かどうかは分かり兼ねます。
raisu@yahuu さんが書きました:トピックをたてるまでもないのでここで質問させてもらいますが(これが最後です分かれば消えますので)
staticで変数を宣言すると値を保持しておけると聞きましたが
この前、main関数と描画関数、キーボード入力関数にわけて絵が動き回るだけのゲームをつくったのですが
そのときにstaticで変数宣言をしていないのにも関わらず問題なく絵が動きました
普通、絵が動いた後に変数は消滅して元の場所から動くことはないと思うのですが・・・
それは変数の生存期間に関わる問題ですので、例えばmain関数で宣言した変数はmain関数が終わるまで値は保持し続けます。
static宣言した場合は関数を抜けても値を保持し続けることが出来ます。これがstatic有無の違いです。main関数以外じゃないと差は実感できないでしょう。
文法上で変数が消滅した場所で、その変数を参照するプログラムを書いたらコンパイルエラーになります。

コード:

{
  int a=1;
}
a=2; ← エラーになります。
[追記]
このサンプルの場合、寿命とスコープで同時にエラーになっているのであんまり良い例じゃないですね。
ともかく変数には、有効範囲(スコープ)と生存期間(寿命)の2つがあります。
寿命は基本的に、宣言された関数やブロックが有効な間です。そしてstaticを付けるとプログラムが動いている間が寿命になり、初期化はプログラム起動時しか行われなります。
スコープは、定義された関数やブロック内でプログラムが動いている間です。なので同じ名前の変数があっても宣言している関数が違えば別のものとして扱われます。

もう少し元になるraisu@yahuu さんのソースコードや具体例があると説明しやすいのですが。

Re: 画像表示の効率

Posted: 2011年8月24日(水) 23:45
by raisu@yahuu
すごい初歩的なところでつまづきました
前に最後ですとかぬかしたのに・・・本当に最後です

コード:

#include "Dxlib.h"

int hyouji_flag=1


void byouga(){
    
    typedef struct{
    	int x1;
    	int y1;
    	char namae;
    	int handoru;
    }kyara1;
    
    if(hyouji_flag==1)
     	kyara1 kyara[1]={
	  {0,0,"sibahu.png",handoru1}
	};  
    
    for(int i; i>1 ; i++)
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.namae[i],TRUE);
    
}	

前の構造体を引数で渡すと言っていたコードが消えたのでまた書いてみたのですが
宣言の構文エラーと言われ実行できません どこが間違っているのでしょうか?

Re: 画像表示の効率

Posted: 2011年8月25日(木) 00:04
by h2so5

コード:

#include "Dxlib.h"

int hyouji_flag=1        ←セミコロンがない


void byouga(){
    
    typedef struct{
    	int x1;
    	int y1;
    	char namae;
    	int handoru;
    }kyara1;
    
    if(hyouji_flag==1)
     	kyara1 kyara[1]={
	  {0,0,"sibahu.png",handoru1}
	};  
    
    for(int i; i>1 ; i++)        ←i が初期化されていない
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.namae[i],TRUE);        ←ループに含まれていない、i はスコープ外
    
}	


Re: 画像表示の効率

Posted: 2011年8月25日(木) 00:33
by softya(ソフト屋)

コード:

#include "Dxlib.h"
 
int hyouji_flag=1
 
 
void byouga(){
    
    typedef struct{
        int x1;
        int y1;
        char namae;
        int handoru;
    }kyara1;
    
    if(hyouji_flag==1)
        kyara1 kyara[1]= ←if文で宣言してあるのが意味が分かりません。
      {0,0,"sibahu.png",handoru1}
    };  
    
    for(int i; i>1 ; i++) ← iの初期化値が2以上じゃないとループが回りません。あとループが止まりません。
        kyara.handoru[i]=LoadGraph(kyara.namae[i]); ←ロードと描画が同じところにあると激烈に速度が低下します。基本的にはやってはいけません。
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.namae[i],TRUE);
    
}
結局構造体のポインタ引数で関数が呼び出されていませんが。これはいったい?

Re: 画像表示の効率

Posted: 2011年8月28日(日) 16:44
by raisu@yahuu
あれから病院にいって全く進んでいないのですがまだわかりません
素人すぎるのは申し訳ないです

コード:


#include "Dxlib.h"

void byouga(){
    
    typedef struct{
        int x1;
        int y1;
        char namae;
        int handoru;
    }kyara1;
    

        kyara1 kyara[2]{
        {0,0,"sibahu.png",handoru1}, 
        {0,0,"syujinkou.png",handoru2}
        };
    
    for(int i=0; i<2 ; i++){
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.handoru[i],TRUE);
    };	
}    

こんなことを言われました
エラー E2108 D:\TEST3\gazou.cpp 16: typedef 'kyara1' の使い方が間違っている(関数 byouga() )
エラー E2379 D:\TEST3\gazou.cpp 16: ステートメントにセミコロン(;)がない(関数 byouga() )
エラー E2451 D:\TEST3\gazou.cpp 22: 未定義のシンボル kyara(関数 byouga() )

Re: 画像表示の効率

Posted: 2011年8月28日(日) 16:46
by raisu@yahuu

コード:

#include "Dxlib.h"
 

 
 
void byouga(){
    
    typedef struct{
        int x1;
        int y1;
        char namae;
        int handoru;
    }kyara1;
    

        kyara1 kyara[2]{
        {0,0,"sibahu.png",handoru1}, 
        {0,0,"syujinkou.png",handoru2}
        };
    
    for(int i=0; i<2 ; i++){
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.handoru[i],TRUE);
    };	
}    
行数がくるっていましたね

Re: 画像表示の効率

Posted: 2011年8月28日(日) 16:48
by softya(ソフト屋)
kyara1 kyara[2]{

kyara1 kyara[2] = {
じゃないと初期値の代入になりませんよ。

あと私の指摘の
・ロードと描画が同じところにあると激烈に速度が低下します。基本的にはやってはいけません。
・結局構造体のポインタ引数で関数が呼び出されていませんが。これはいったい?
は解決していません。

Re: 画像表示の効率

Posted: 2011年8月28日(日) 17:07
by raisu@yahuu
何度も本当にすみません

コード:

#include "Dxlib.h"
 

 
 
void byouga(){
    
    typedef struct{
        int x1;
        int y1;
        char namae;
        int handoru;
    }kyara1;
    

        kyara1 kyara[2]={
        {0,0,"sibahu.png",handoru1}, 
        {0,0,"syujinkou.png",handoru2}
        };
    
    for(int i=0; i<2 ; i++){
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.handoru[i],TRUE);
    };	
}

コード:

エラー E2034 D:\TEST3\gazou.cpp 17: 'char *' 型は 'char' 型に変換できない(関数 byouga() )
エラー E2451 D:\TEST3\gazou.cpp 17: 未定義のシンボル handoru1(関数 byouga() )
エラー E2141 D:\TEST3\gazou.cpp 17: 宣言の構文エラー(関数 byouga() )
エラー E2139 D:\TEST3\gazou.cpp 17: 宣言に ; がない(関数 byouga() )
エラー E2190 D:\TEST3\gazou.cpp 17: 不要な }
エラー E2040 D:\TEST3\gazou.cpp 17: 宣言が正しく終了していない
エラー E2190 D:\TEST3\gazou.cpp 19: 不要な }
エラー E2190 D:\TEST3\gazou.cpp 19: 不要な }
エラー E2040 D:\TEST3\gazou.cpp 21: 宣言が正しく終了していない
エラー E2141 D:\TEST3\gazou.cpp 21: 宣言の構文エラー
エラー E2238 D:\TEST3\gazou.cpp 21: 'i' の宣言が複数見つかった
エラー E2344 D:\TEST3\gazou.cpp 21: 一つ前の 'i' の定義位置
エラー E2141 D:\TEST3\gazou.cpp 21: 宣言の構文エラー
エラー E2190 D:\TEST3\gazou.cpp 25: 不要な }
エラーが増えました

ソフト屋さん指摘の二つの点ですが
これができないのにポインタの作業にとりかかってはいけないと思うということと
画像の読み込みに関してはこれは練習用ですので本番では隣接したフィールドは読み込んでおく
というような感じにしようとしています 口答えしているみたいで申し訳ないです

Re: 画像表示の効率

Posted: 2011年8月28日(日) 17:14
by softya(ソフト屋)
失礼、思っきり見逃してました。

コード:

#include "Dxlib.h"
 
 
 
 
void byouga(){
    
    typedef struct{
        int x1;
        int y1;
        char namae; ← 文字列ポインタじゃないとダメです。
        int handoru;
    }kyara1;
    
 
        kyara1 kyara[2]={
        {0,0,"sibahu.png",handoru1},  ← handoru1,handoru22は存在しないのでエラーになります。それにhandoruだけは動的に読み込むものなので初期化は不要です。
        {0,0,"syujinkou.png",handoru2}
        };
    
    for(int i=0; i<2 ; i++){
        kyara.handoru[i]=LoadGraph(kyara.namae[i]);
        DrawGraph(kyara.x1[i],kyara.y1[i],kyara.handoru[i],TRUE);
    };  
}
よく分からないから放置していないなら問題はないですよ。
ただ、今はここだけやりましたって書いてもらうと余計な混乱がなくてよかったです。

Re: 画像表示の効率

Posted: 2011年8月28日(日) 17:32
by raisu@yahuu
構造体の初期化の時にhandoruを記述しないようにしたのですが
エラー E2294 D:\TEST3\gazou.cpp 22: . または .* の左側に構造体が必要(関数 byouga() )
↑こんなのが  これはどういうことですか

それとhaoru1,2は存在しないとおっしゃいましたが どういうことですか

Re: 画像表示の効率

Posted: 2011年8月28日(日) 17:37
by softya(ソフト屋)
raisu@yahuu さんが書きました:構造体の初期化の時にhandoruを記述しないようにしたのですが
エラー E2294 D:\TEST3\gazou.cpp 22: . または .* の左側に構造体が必要(関数 byouga() )
↑こんなのが  これはどういうことですか
不要なのは初期化値で、構造体から無くしたらエラーになりますよ。
raisu@yahuu さんが書きました: それとhaoru1,2は存在しないとおっしゃいましたが どういうことですか
int haoru1;
int haoru2;
と言う変数は宣言されていませんし、もし宣言されていても値も入っていませんので初期化値として不適当ですよね?

Re: 画像表示の効率

Posted: 2011年8月28日(日) 19:50
by raisu@yahuu
いえ、構造体から消したのではなく初期化している部分から消したのですが・・・

エラー E2108 D:\TEST3\gazou.cpp 21: typedef 'kyara1' の使い方が間違っている(関数 byouga() )
エラー E2294 D:\TEST3\gazou.cpp 21: . または .* の左側に構造体が必要(関数 byouga() )

こういわれるんです 意味が分かりません

Re: 画像表示の効率

Posted: 2011年8月28日(日) 20:16
by h2so5
コードを貼り付けてください。

Re: 画像表示の効率

Posted: 2011年8月28日(日) 20:41
by softya(ソフト屋)
あっ、kyara.handoruは間違いですよ。
kyara.handoruが正しいです。以下同様。