Hiragi(GKUTH)の日常
理系大学生の日記

なんか弾幕が流行ってるようです

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

なんか弾幕が流行ってるようです

投稿記事 by Hiragi(GKUTH) » 9年前

 というわけで祝日の夜を潰して弾幕を描くプログラム(相当久しぶりなプログラミング)してみました。
なお最低限弾幕が表示できりゃええので、当たり判定とか無く、弾が持つべき最低限の情報(座標、角度、速度)
だけで実装してみました。

 なんか皆さんDxLibばっかり使っていらっしゃるので、Siv3D使ってみました、DirectXの世代もかなり新しい(10.0?)ので違いが出るのかなーと
んでなんかstd::listとか言う奴が早いらしいので調べてみて使い方を少し練習してみました。 なんか直感的で使いやすいねlist
でもなんだろう、多分使い方間違ってると思います。 ほっとくとどんどんメモリを確保していくのがその証拠、どうやって直すかも分からんし(おい
それにその場で思いつきの謎設計してるのでスパゲッティ&マイナーだと思います。

CPU:i5-4670 3.4GHz 4core
GPU:GTX760 GDDR5 2G
Mem:16G
VGA(640x480)

で、結果画像
(拡大してもモアレですよ)
で、大体11万個位描画したあたりから60FPSを維持できなくて低下し始めます。
画像
そしてココでもうRAM占有量90MBぐらいとか恐ろしい
CPU使用率も30%程です。
でも実際ゲームとして使うときはもっとエフェクトバリバリで移動計算ももっと複雑になるでしょうから、遅くなることでしょう。

::追記::
 計算と描画、どっちに時間掛かってるか計測してみました。
結果計算は30万描画時でも3ms-4ms程度でGPUが30ms-34msとやっぱりGPUがネックになっているようです、というかコレはピクセルレート的な限界か?
なんか描画はできるだけ一度にドローコールしたほうが良いとかどっかで聞いたことあるけどまぁいいや、もっと高速化の手立ては有るんでしょうけど...
それと、GPUの使用率見ても50%ぐらいしか使用してくれてないんですよねー...ハードの性能を引き出すとか言う作業はもっと難しいんですかねぇ

あれ?これ前もやったこと有る気がするなぁ...

 さて、今度の土日は可変長配列とただの配列とstd::vectorでも設計してみよう

ソースコード貼っときます。 かなりマズイ設計だと思うけど(listの要素破棄してなかったり...)
► スポイラーを表示
最後に編集したユーザー Hiragi(GKUTH) on 2016年2月11日(木) 23:09 [ 編集 2 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: なんか弾幕が流行ってるようです

投稿記事 by ISLe » 9年前

Hiragi(GKUTH) さんが書きました:で、次に等倍で描画してみたら...
スケーリング時とほぼ変わらない感じになりました。
まさか
img.scale(1.0).drawAt(x,y);
じゃないですよね。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: なんか弾幕が流行ってるようです

投稿記事 by Hiragi(GKUTH) » 9年前

ISLe さんが書きました:
Hiragi(GKUTH) さんが書きました:で、次に等倍で描画してみたら...
スケーリング時とほぼ変わらない感じになりました。
まさか
img.scale(1.0).drawAt(x,y);
じゃないですよね。
ではありません。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: なんか弾幕が流行ってるようです

投稿記事 by Hiragi(GKUTH) » 9年前

Dixq (管理人) さんが書きました:> アロー演算子では動かなくて(コンパイル通らない)単に.で動くようになった。
> とりあえず登録機構のところ見なおしてみます。

Bullet*のlistじゃなくてBulletそのものをlistに詰めてるんですね、
ポインタ使った方が早いと思いますよ。
あぁまた苦手なポインタかよ...
ポインタのリストとかまた不思議な感触です
でもリスト自体がポインタならそのリストが指す実体は勝手に作成...されるのか?

にしてもリストのポインタが実体を指定する分1工程増えて
むしろ遅くなるイメージが...

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前

Re: なんか弾幕が流行ってるようです

投稿記事 by Dixq (管理人) » 9年前

ISLeさん

いつも思いますが、そういう鼻につく言い方やめた方がいいですよ。
現実でもそうなんですかね。
色んな所からISLeさんの発言について苦情が来てますし、
自覚ないのかもしれませんがコミュニケーションの仕方にかなり問題があるようです。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前

Re: なんか弾幕が流行ってるようです

投稿記事 by Dixq (管理人) » 9年前

グクス君

リストにpush_frontするときにオブジェクトコピーが走るので、
オブジェクトの大きさが大きくなると違いが出てくるかもしれません。
プログラマーって関数に構造体やクラス渡す時、オブジェクトのコピーにならないように
ポインタ渡すか参照にするじゃないですか、そんな感じです。
まぁ実際どれだけ違いがあるのかと言われたら今のCPUパワーじゃ体感するに値しないかもしれませんが・・。
プログラマーの性というか、なるべく計算量は少ないコードにしたがりますしね。

ISLe
記事: 2650
登録日時: 14年前

Re: なんか弾幕が流行ってるようです

投稿記事 by ISLe » 9年前

Dixq (管理人) さんが書きました:ISLeさん

いつも思いますが、そういう鼻につく言い方やめた方がいいですよ。
現実でもそうなんですかね。
色んな所からISLeさんの発言について苦情が来てますし、
自覚ないのかもしれませんがコミュニケーションの仕方にかなり問題があるようです。
わたしは
Dixq (管理人) さんが書きました:消し方の正解をお教えしましょう。
がとても鼻につく不快な表現だと感じました。
正解って

苦情が来るのは不快
来ないのは不快じゃないっていうのはどうなんですかね。

わたしは単純に疑問を提示しただけなのに
それに対して平気で公開処刑するのがまともな人間の感覚とは思えませんが。
最後に編集したユーザー ISLe on 2016年2月13日(土) 22:51 [ 編集 2 回目 ]

Rittai_3D
記事: 525
登録日時: 12年前

Re: なんか弾幕が流行ってるようです

投稿記事 by Rittai_3D » 9年前

Dixq (管理人) さんが書きました:

CODE:

    for (auto b : tama0){
        if (b->Getflag() == true)
            b->Draw();
    }
右辺値参照の方が良いのでは…?

CODE:

for( auto&& b : tama0 ) {
    if( b->Getflag() )
        b->Draw();
}

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 14年前
住所: 大阪府
連絡を取る:

Re: なんか弾幕が流行ってるようです

投稿記事 by Hiragi(GKUTH) » 9年前

Dixq (管理人) さんが書きました:グクス君

リストにpush_frontするときにオブジェクトコピーが走るので、
オブジェクトの大きさが大きくなると違いが出てくるかもしれません。
プログラマーって関数に構造体やクラス渡す時、オブジェクトのコピーにならないように
ポインタ渡すか参照にするじゃないですか、そんな感じです。
まぁ実際どれだけ違いがあるのかと言われたら今のCPUパワーじゃ体感するに値しないかもしれませんが・・。
プログラマーの性というか、なるべく計算量は少ないコードにしたがりますしね。
プログラマーって参照渡し、ポインタのコピーにすることが多い...?んだ
なんか自分ので実装しようとしたらよく分からんくなったのでまた今度やってみます。

アバター
へにっくす
記事: 634
登録日時: 13年前

Re: なんか弾幕が流行ってるようです

投稿記事 by へにっくす » 9年前

参考になるかな?
参考)その12 イテレート中のSTLのlistから要素を安全に削除する方法
> たぶん弾の登録の方法がマズいんだろうなぁ...
Hiragi(GKUTH) さんが書きました:

CODE:

void BulletMgr::Add(float x, float y, float ang, float speed,Texture img)
{
    //プッシュ用
    Bullet n;
    //弾の登録(先頭に追加)
    tama0.push_front(n);
    //先頭のイテレータを指定
    auto itr = tama0.begin();
    //先頭の初期化
    itr->Init(x,y,ang,speed,img);
}
私としては、なぜリスト追加してわざわざ先頭のポインタを取得してるのかわからない。
コンストラクタですべての値をセットして、リストに追加すればいいと思いますが・・・
最後に編集したユーザー へにっくす on 2016年2月14日(日) 09:25 [ 編集 3 回目 ]