画像表示の効率
Re: 画像表示の効率
詳しい仕様が分からないので何ともいえませんが、
(たとえば構造体は実体を渡しているのかポインタを渡しているのかなど)
方法としては普通だと思います。
もう少し詳しく方法を教えていただければ、もっとアドバイスできると思いますよ。
(たとえば構造体は実体を渡しているのかポインタを渡しているのかなど)
方法としては普通だと思います。
もう少し詳しく方法を教えていただければ、もっとアドバイスできると思いますよ。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
ぱっと見の印象だと、画像のファイル名だけではなく画像のハンドルも構造体内に無いと変なのですが、それは無いのでしょうか?
※ DXライブラリじゃ無いにしても何らかのハンドル等はあるはずですが。
※ DXライブラリじゃ無いにしても何らかのハンドル等はあるはずですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
返信ができませんでした
ハンドルも構造体に入れたほうがいいのですか 分かりました
構造体は実体を渡していると思います 特にポインタとか気にかけたことがないので
ポインタで渡すと全体を渡さなくていいので処理が軽くなるといったことは聞いたことがあるのですが
これはどういうことなのでしょうか?教えてくださいませんか
それと自分は一度にゲームに使う画像を全て構造体に記憶させてしまうと
容量?がすごいことになるとおもうので画面が暗転するごとにif文で
構造体を新しい内容に書き換えているのですがこれは正しいですか?
質問ばかりですがお願いします すいません
ハンドルも構造体に入れたほうがいいのですか 分かりました
構造体は実体を渡していると思います 特にポインタとか気にかけたことがないので
ポインタで渡すと全体を渡さなくていいので処理が軽くなるといったことは聞いたことがあるのですが
これはどういうことなのでしょうか?教えてくださいませんか
それと自分は一度にゲームに使う画像を全て構造体に記憶させてしまうと
容量?がすごいことになるとおもうので画面が暗転するごとにif文で
構造体を新しい内容に書き換えているのですがこれは正しいですか?
質問ばかりですがお願いします すいません
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
言語、利用ライブラリなどが明言されていないのとゲームの種類ややりたいことがはっきりしないので一般論になりますが、ポインタと言っているのでCかC++だと仮定して書かせて貰います。
つまり、関数を呼び出す度に構造体のコピーを作っているので重くなるわけです。
あと呼び出し先の関数で値渡しの構造体の内容を変更しても呼び出し元の構造体には変化が起きませんので注意してください。
常にメモリにあってほしいものと、容量を食い過ぎるから随時読むものはちゃんと設計して区分されているなら問題有りません。
これも画像が何であるか書かれていないので一般論として回答したしました。
ポインタを使用せずに構造体を引数とした場合は、関数には値渡し(コピー)となります。raisu@yahuu さんが書きました: 構造体は実体を渡していると思います 特にポインタとか気にかけたことがないので
ポインタで渡すと全体を渡さなくていいので処理が軽くなるといったことは聞いたことがあるのですが
これはどういうことなのでしょうか?教えてくださいませんか
つまり、関数を呼び出す度に構造体のコピーを作っているので重くなるわけです。
あと呼び出し先の関数で値渡しの構造体の内容を変更しても呼び出し元の構造体には変化が起きませんので注意してください。
プレイが快適なら別に問題ないと思いますが、保持すべきものと個別に読み込むものは区別されるべきです。raisu@yahuu さんが書きました: それと自分は一度にゲームに使う画像を全て構造体に記憶させてしまうと
容量?がすごいことになるとおもうので画面が暗転するごとにif文で
構造体を新しい内容に書き換えているのですがこれは正しいですか?
常にメモリにあってほしいものと、容量を食い過ぎるから随時読むものはちゃんと設計して区分されているなら問題有りません。
これも画像が何であるか書かれていないので一般論として回答したしました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
えーと、ではif文で分岐させたほうが効率がいいということですかね
一応、主人公の画像とポーズしたときのメニュー画面ぐらいは常にメモリに入れておくつもりですが
すいません、何回も聞いて(画像がなんであるかとはどういうことかわかりませんが、2Dのbmpです)
トピックをたてるまでもないのでここで質問させてもらいますが(これが最後です分かれば消えますので)
staticで変数を宣言すると値を保持しておけると聞きましたが
この前、main関数と描画関数、キーボード入力関数にわけて絵が動き回るだけのゲームをつくったのですが
そのときにstaticで変数宣言をしていないのにも関わらず問題なく絵が動きました
普通、絵が動いた後に変数は消滅して元の場所から動くことはないと思うのですが・・・
一応、主人公の画像とポーズしたときのメニュー画面ぐらいは常にメモリに入れておくつもりですが
すいません、何回も聞いて(画像がなんであるかとはどういうことかわかりませんが、2Dのbmpです)
トピックをたてるまでもないのでここで質問させてもらいますが(これが最後です分かれば消えますので)
staticで変数を宣言すると値を保持しておけると聞きましたが
この前、main関数と描画関数、キーボード入力関数にわけて絵が動き回るだけのゲームをつくったのですが
そのときにstaticで変数宣言をしていないのにも関わらず問題なく絵が動きました
普通、絵が動いた後に変数は消滅して元の場所から動くことはないと思うのですが・・・
Re: 画像表示の効率
staticで変数を宣言しなくても宣言された関数・ブロック内であれば値は保持されます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
こちらもわからない事だらけで答えづらいのですが、最初にマップと言われてますのでマップチェンジ毎に不要な画像の破棄・必要な画像を読み込むことはまっとうな行為です。raisu@yahuu さんが書きました:えーと、ではif文で分岐させたほうが効率がいいということですかね
一応、主人公の画像とポーズしたときのメニュー画面ぐらいは常にメモリに入れておくつもりですが
すいません、何回も聞いて(画像がなんであるかとはどういうことかわかりませんが、2Dのbmpです)
で、関数に読み込む情報を構造体で渡して、構造体にあるハンドルに値を入れて呼び元に戻す場合は構造体ポインタである必要があります。
申し訳ないですが「えーと、ではif文で分岐させたほうが効率がいいということですかね」と出てくるかがわかりませんが、効率で言えば読み込み関数に構造体ポインタを渡したほうが良いと思いますが、構造体の構造やプログラムの構成が分からないのでYESとは断言できません。
曖昧な情報をもとに、かなり推測で書いているので正解かどうかは分かり兼ねます。
それは変数の生存期間に関わる問題ですので、例えばmain関数で宣言した変数はmain関数が終わるまで値は保持し続けます。raisu@yahuu さんが書きました:トピックをたてるまでもないのでここで質問させてもらいますが(これが最後です分かれば消えますので)
staticで変数を宣言すると値を保持しておけると聞きましたが
この前、main関数と描画関数、キーボード入力関数にわけて絵が動き回るだけのゲームをつくったのですが
そのときにstaticで変数宣言をしていないのにも関わらず問題なく絵が動きました
普通、絵が動いた後に変数は消滅して元の場所から動くことはないと思うのですが・・・
static宣言した場合は関数を抜けても値を保持し続けることが出来ます。これがstatic有無の違いです。main関数以外じゃないと差は実感できないでしょう。
文法上で変数が消滅した場所で、その変数を参照するプログラムを書いたらコンパイルエラーになります。 [追記]
このサンプルの場合、寿命とスコープで同時にエラーになっているのであんまり良い例じゃないですね。
ともかく変数には、有効範囲(スコープ)と生存期間(寿命)の2つがあります。
寿命は基本的に、宣言された関数やブロックが有効な間です。そしてstaticを付けるとプログラムが動いている間が寿命になり、初期化はプログラム起動時しか行われなります。
スコープは、定義された関数やブロック内でプログラムが動いている間です。なので同じ名前の変数があっても宣言している関数が違えば別のものとして扱われます。
もう少し元になるraisu@yahuu さんのソースコードや具体例があると説明しやすいのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
すごい初歩的なところでつまづきました
前に最後ですとかぬかしたのに・・・本当に最後です
前の構造体を引数で渡すと言っていたコードが消えたのでまた書いてみたのですが
宣言の構文エラーと言われ実行できません どこが間違っているのでしょうか?
前に最後ですとかぬかしたのに・・・本当に最後です
#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: 画像表示の効率
#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 はスコープ外
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
#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);
}by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
あれから病院にいって全く進んでいないのですがまだわかりません
素人すぎるのは申し訳ないです
こんなことを言われました
エラー E2108 D:\TEST3\gazou.cpp 16: typedef 'kyara1' の使い方が間違っている(関数 byouga() )
エラー E2379 D:\TEST3\gazou.cpp 16: ステートメントにセミコロン(;)がない(関数 byouga() )
エラー E2451 D:\TEST3\gazou.cpp 22: 未定義のシンボル kyara(関数 byouga() )
素人すぎるのは申し訳ないです
#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() )
-
raisu@yahuu
Re: 画像表示の効率
#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);
};
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
kyara1 kyara[2]{
は
kyara1 kyara[2] = {
じゃないと初期値の代入になりませんよ。
あと私の指摘の
・ロードと描画が同じところにあると激烈に速度が低下します。基本的にはやってはいけません。
・結局構造体のポインタ引数で関数が呼び出されていませんが。これはいったい?
は解決していません。
は
kyara1 kyara[2] = {
じゃないと初期値の代入になりませんよ。
あと私の指摘の
・ロードと描画が同じところにあると激烈に速度が低下します。基本的にはやってはいけません。
・結局構造体のポインタ引数で関数が呼び出されていませんが。これはいったい?
は解決していません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
何度も本当にすみません
エラーが増えました
ソフト屋さん指摘の二つの点ですが
これができないのにポインタの作業にとりかかってはいけないと思うということと
画像の読み込みに関してはこれは練習用ですので本番では隣接したフィールドは読み込んでおく
というような感じにしようとしています 口答えしているみたいで申し訳ないです
#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: 不要な }
ソフト屋さん指摘の二つの点ですが
これができないのにポインタの作業にとりかかってはいけないと思うということと
画像の読み込みに関してはこれは練習用ですので本番では隣接したフィールドは読み込んでおく
というような感じにしようとしています 口答えしているみたいで申し訳ないです
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
失礼、思っきり見逃してました。
よく分からないから放置していないなら問題はないですよ。
ただ、今はここだけやりましたって書いてもらうと余計な混乱がなくてよかったです。
#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);
};
}ただ、今はここだけやりましたって書いてもらうと余計な混乱がなくてよかったです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
構造体の初期化の時にhandoruを記述しないようにしたのですが
エラー E2294 D:\TEST3\gazou.cpp 22: . または .* の左側に構造体が必要(関数 byouga() )
↑こんなのが これはどういうことですか
それとhaoru1,2は存在しないとおっしゃいましたが どういうことですか
エラー E2294 D:\TEST3\gazou.cpp 22: . または .* の左側に構造体が必要(関数 byouga() )
↑こんなのが これはどういうことですか
それとhaoru1,2は存在しないとおっしゃいましたが どういうことですか
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
不要なのは初期化値で、構造体から無くしたらエラーになりますよ。raisu@yahuu さんが書きました:構造体の初期化の時にhandoruを記述しないようにしたのですが
エラー E2294 D:\TEST3\gazou.cpp 22: . または .* の左側に構造体が必要(関数 byouga() )
↑こんなのが これはどういうことですか
int haoru1;raisu@yahuu さんが書きました: それとhaoru1,2は存在しないとおっしゃいましたが どういうことですか
int haoru2;
と言う変数は宣言されていませんし、もし宣言されていても値も入っていませんので初期化値として不適当ですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
raisu@yahuu
Re: 画像表示の効率
いえ、構造体から消したのではなく初期化している部分から消したのですが・・・
エラー E2108 D:\TEST3\gazou.cpp 21: typedef 'kyara1' の使い方が間違っている(関数 byouga() )
エラー E2294 D:\TEST3\gazou.cpp 21: . または .* の左側に構造体が必要(関数 byouga() )
こういわれるんです 意味が分かりません
エラー E2108 D:\TEST3\gazou.cpp 21: typedef 'kyara1' の使い方が間違っている(関数 byouga() )
エラー E2294 D:\TEST3\gazou.cpp 21: . または .* の左側に構造体が必要(関数 byouga() )
こういわれるんです 意味が分かりません
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像表示の効率
あっ、kyara.handoruは間違いですよ。
kyara.handoruが正しいです。以下同様。
kyara.handoruが正しいです。以下同様。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。