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 回目 ]

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

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

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

消し方の正解をお教えしましょう。

CODE:

    for (std::list::iterator i = tama0.begin();i != tama0.end();)
    {
        //i番目のフラグが立っていたら 更新、描画
        if(i->Getflag() == true)
        { 
            k++;
            i->Update();
	    i++;
        }
        else {
            i = tama0.erase(i);
        }
    }
後描画はもっと簡単にかけるよ。

CODE:

    for (auto b : tama0){
        if (b->Getflag() == true)
            b->Draw();
    }
しかしSiv3Dも便利そうですねー。
一度使ってみようかな
最後に編集したユーザー Dixq (管理人) on 2016年2月12日(金) 15:34 [ 編集 1 回目 ]

アバター
usao
記事: 1889
登録日時: 12年前

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

投稿記事 by usao » 9年前

モアレキターーーーーー!!
手裏剣みたいに見えるところとか,たまりませんなぁ.

アバター
沖 滉均
記事: 237
登録日時: 14年前

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

投稿記事 by 沖 滉均 » 9年前

弾幕が流行っているのかベンチマークが流行っているのか…
という感じで後者として遊んでみたいなぁ←

アバター
usao
記事: 1889
登録日時: 12年前

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

投稿記事 by usao » 9年前

流行っているのはモアレなのであって,
弾幕とかいうのはその実現手段の一形態にすぎない.


単純にeraseせずに別のlistにspliceで退避しといて
新規の弾発生時にそこから使い回すみたいなことやっても
速度的にはほとんど効果無いということなのかな.

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

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

投稿記事 by ISLe » 9年前

描画するときに毎回スケール変換してるから重いのでは。

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

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

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

Dixq (管理人) さんが書きました:消し方の正解をお教えしましょう。

CODE:

    for (std::list::iterator i = tama0.begin();i != tama0.end();)
    {
        //i番目のフラグが立っていたら 更新、描画
        if(i->Getflag() == true)
        { 
            k++;
            i->Update();
	    i++;
        }
        else {
            i = tama0.erase(i);
        }
    }
後描画はもっと簡単にかけるよ。

CODE:

    for (auto b : tama0){
        if (b->Getflag() == true)
            b->Draw();
    }
しかしSiv3Dも便利そうですねー。
一度使ってみようかな
一番目のコードに変更すると弾が消えた時に既存の弾の情報がぐちゃぐちゃになるって言う謎挙動が起きたのだった...
たぶん弾の登録の方法がマズいんだろうなぁ...

それとふたつ目のコードに変更すると、アロー演算子では動かなくて(コンパイル通らない)単に.で動くようになった。
とりあえず登録機構のところ見なおしてみます。

Siv3Dいいっすよー、全然使いこなせないけど、C++11/14の書き方とかにも対応(?)しているらしく

:追記:

ひとつ目のコードちゃんと書き換えできていませんでした、んでfor側のイクリメントを消したら上手く動いた
と思ったら一定時間経つと強制終了される... また後で解決方法確認します。
最後に編集したユーザー Hiragi(GKUTH) on 2016年2月12日(金) 20:34 [ 編集 1 回目 ]

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

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

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

usao さんが書きました:モアレキターーーーーー!!
手裏剣みたいに見えるところとか,たまりませんなぁ.
モアレってなんで出来るんでしょうねぇ、私自身作ろうと思って作ったものじゃないのに勝手にできるって
なんか摂理的なものを感じる()
なんか難しい計算でも行えば出る模様も求めれるのかもしれないですけど

Split? まだlistも殆どさわりしかやってないので全く分からんのです。
最後に編集したユーザー Hiragi(GKUTH) on 2016年2月12日(金) 20:03 [ 編集 1 回目 ]

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

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

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

沖 滉均 さんが書きました:弾幕が流行っているのかベンチマークが流行っているのか…
という感じで後者として遊んでみたいなぁ←
と、とりあえずマトモに動くようになったら配布するかもしれません

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

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

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

ISLe さんが書きました:描画するときに毎回スケール変換してるから重いのでは。
試しに点(1dot)で描画してみました。
結果として速度はほとんど二倍になりました。
で、次に等倍で描画してみたら...
スケーリング時とほぼ変わらない感じになりました。

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

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

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

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

Bullet*のlistじゃなくてBulletそのものをlistに詰めてるんですね、
ポインタ使った方が早いと思いますよ。