仮眠プログラマーのつぶやき

自分がプログラムやっていて、思いついたことをつぶやいていきます。 2025年からzennに移行

自作ゲームやツール、ソースなどを公開しております。
①ポンコツ自動車シュライシュラー
DOWNLOAD
②流体力学ソース付き
汚いほうDOWNLOAD
綺麗なほうDOWNLOAD
③ミニスタヲズ
DOWNLOAD
④地下鉄でGO
DOWNLOAD
⑤ババドン
DOWNLOAD
⑥圧縮拳(ツール)
DOWNLOAD
⑦複写拳
DOWNLOAD
⑧布シミュレーション
DOWNLOAD
⑨minecraft巨大電卓地形データ
DOWNLOAD
⑩フリュードランダー
デジゲー博頒布α版
DOWNLOAD
⑪パズドラルート解析GPGPU版
DOWNLOAD
⑫ゲーム「流体de月面着陸」
DOWNLOAD

パズドラ

ニコ動に紹介動画UP(パズドラルート解析)

パズドラルート解析GPGPU版の宣伝、もとい使い方動画をニコ動にアップした。


使い方の解説動画としてはあまり良くないほうかもしれないが、まぁだいたいわかるだろう。
強いて言うなら、アイフォン、やアンドロイドのキャプチャをどうやってパソコンに持ってくるかだが、

アイフォンなら、ホームボタン+電源同時押しでスクショが撮れ、USBケーブルでパソコンと繋げば、png形式の
キャプチャ画像が見れるだろう。

アンドロイドなら、電源ボタン+音量キーの小を同時長押し、で撮れる。
古いアンドロイドはその方法では撮れなく、私のmotorola ISW11Mでも撮れない。
その場合はどうするかというと、非常にめんどくさいが、android SDKやjava SE JDKなどをインストールしなくてはならない。
詳しい方法はコチラなど参照したり、ググって貰いたい。





動画作成のほうだが、デスクトップ画面のキャプチャはbandicamを使っているため、どうしても上にロゴが入ってしまう。
だが実はこれには裏技があり、保存形式を無圧縮aviにして、撮影する大きさより少し上の部分をはみ出して大きめのサイズにして撮る。そのあと、はみ出させた上の部分をカットすれば、ちょうどbandicamのロゴが消えている動画が残るはずだ。

だが、無圧縮aviという保存形式はHDDや遅めのSSDでは保存に間に合わないほど容量の大きいものだ。
そこでramdisk
余ったメモリを仮想HDDとして使うことができる。
速度はSSDの10倍!
当然電源を切ったらデータは全部消えるけど。
ramdiskソフトはいつくも使ったけどやっぱ一番いいのはGavotte
中国製らしいが、すごく前に作られてるのにもかかわらず32Gオーバーのramdiskも作成可能。当然無料。

話はそれてしまったが
ルート解析のソフト紹介動画と同時に、技術的な動画も投稿した。



「【開発秘話】パズドラルート解析君を全力で高速化してみた」
こっちが本命。作ってて楽しかった
全然開発秘話なんかではなく脚色だらけだけど、とにかくGPGPUを布教するためにはなんでもするぜ!

 



一応本編はこっち
「パズドラルート解析GPGPU版の使い方」








全く関係ないけどminecraftで電卓作ったよの動画。結構前に投稿したものだがこのブログで一言も触れてなかったので一応宣伝
「【Minecraft】レッドストーン回路だけで作られた10桁の電卓【機能美】」




そういえば電卓の地形データを配布しようと思っていたんだ。
スパゲティプログラムのようにこれじたこれ、上手く使える人いるかな・・
minecraft巨大電卓地形データ
DOWNLOAD
 

パズドラルート解析GPGPU版αマイナーアップデート、これでエジプト神さえいれば!

ダウンロードはこちら
新しいビットマップ イメージ



パズドラルート解析GPGPU版αマイナーアップデートでは、課題であったほぼ全部の機能が実装された!
・スクリーンショット読み込み機能
・ベンチマークツイート機能
・起動時の高速化
・解析条件の設定
・計算の高速化


あとはグラフィックの更新のみである。


ところでパズドラは1ヶ月くらいやっていなかったのだが、ソフトを使うために久しぶりに起動してみた。今は10コンボで味方全員の攻撃力が10倍になるモンスターがいるらしく、他にも5属性同時攻撃で攻撃力6倍のモンスターなど。
今までよりさらにコンボ数が重要になってきているのがわかった。
(一応、5属性同時攻撃の経路検索などもルート解析で設定できるようにした)

でもそういうモンスターってやっぱ手に入りにくい・・?レアガチャ?

それになんかスキルのインフレもすごい。
光属性で攻撃2倍の太陽龍プテラドスにあこがれてやっと最近最終進化したと思ったのに、もう光属性の攻撃&回復が2倍のやつでてきているし・・
こいつは太陽龍プテラドスからさらに進化するみたいだな


ダメージインフレもすごくて、10コンボで攻撃10倍のやつをフレンドでも使って得意属性が相手なら、ダメージは200倍×コンボ数のダメージ上乗せというとんでもないダメージとなる・・・・。

そのうちダメージが2147483648 (2^31) を超えてカンストかオーバーフローしてマイナスとかになるんじゃ??
とか変なプログラムバグの心配をしてみる(大きなお世話だ)


というわけでガンホーに怒られない限りはパソコン用ソフト、パズドラルート解析GPGPU版のサポートは続けていくつもりです。



(GPGPUといえばGeforce Titanでの解析ベンチマーク見てみたいな・・)

パズドラルート解析超高速版、キャプチャ機能付き公開

ダウンロードはこちら
新しいビットマップ イメージ

パズドラに関するアプリはさらに増え今ではコンボを計算するアプリは合計で3つとなった。

その中で、自分の作ったルート解析君はあまりに遅い。
比較アプリ名は避けるが、現時点で無料のほうのコンボ計算アプリは、同じ全経路検索でウチの約4~6倍の早さということが分かっている。
有料のほうは、全経路検索ではないらしいので比較はできないが最近上から落ちてくるドロップも考慮してくれるようになったらしく、コンボ効率は更に上がっている。


そこで、計算速度改善のため抜本的な見直しを行った。


1、iPhone用に作るのではなくパソコン用に作る。 
まず一番計算速度に影響するのが、CPUのスペックである。動作周波数そのまま速度に比例する。モバイル機器のCPUはせいぜい1.5GHzとかそんなものなので、パソコンのスペックには到底かなわない。
そしてパソコンのCPUですら今では頭打ち。そこで登場するのがGPGPU技術!
これはグラフィックボードの演算能力を使ってCPUより高速に計算するというもの。

2、GPUで計算する。
現在のグラフィックボードの能力は凄まじく、1枚あれば3.7TFlofs(テラフロップス)計算できるものもある。
これはメニーコアCPUの3~100倍とも言われている。
つまるところ、単純に演算能力の高いデバイスの能力をフルに使って、ガンガン計算させようというものだ。究極の計算高速化手段だがなんとも外国人っぽい発想である。
私は1年くらい前から、シミュレーションのプログラムを高速に動かすためにGPGPUの研究を続けていた。今ちょうどHLSLを使ってGPGPUを手軽にできるHSP向けプラグインの開発をしていた所であったため、プラグイン開発と並行してパズドラルート解析の高速化バージョンを作ることとなった。
(結果的に、GPGPUソフトの開発で必要と思われる機能がうまくピックアップできプラグイン開発に昇華できた)

3、計算アルゴリズムの改善
今までは、コンボの計算アルゴリズムは非常に複雑なものであった。

1つの画面内に6×5マスの30個のドロップがある。
その中で、横3つが同じ色である、又は縦3つが同じ色である場合に、その3つのドロップをコンボ発生フラグ1とする。
次にコンボ発生フラグのあるドロップで、ドロップが縦横でつながっている、かつ同じ色ならば、それが1コンボとして計算する。
繋がっていない同色なら別コンボとして計算する。
ここで一番重要なのが「つながっている 」か判定することだ。これには塗りつぶしのアルゴリズムを使って判定していたのだが、これでは毎回コンボ発生時にコンボの数だけ塗りつぶしを実行することになり、非常に時間がかかる。

そこで、あらかじめ全てのコンボ発生パターンを記録したコンボシートなるものを作成することにした。
30ドロップを1列に直線に並べる。1つのドロップは、コンボ発生フラグ有る無しの2つのどちらかの状況しかとりえない。
このとき、30個のドロップのコンボ有る無しがとる全ての場合の数は2の30乗、つまり1073741824パターンである。
この1073741824パターンで、コンボがいくつ発生するか、全体攻撃がつくかどうかを記録したもの、それがコンボシートである。

・・・つまり、塗りつぶしの部分が要らなくなったということである。(予め計算してある。)

他にも、同色ドロップから始まる事実上全く同じといえるルートを計算から除外したり、細かい所でアルゴリズムの改善が行なわれた。


4、使用言語の変更
iPhoneアプリではインタプリタ型のHSPをつかていたので、どうしても速度に不安があった。
今回、主要な計算部分はGPUでやっているし、CPUでやらないといけない部分に関してもC++で作成してある。
だいたいHSPとC++の速度差は10倍くらいである。



という徹底した計算高速化を追求した。
そして以上の改善より、なんとアプリ版より
1086倍も高速になった!!!!!
 それもグラフィックボードがnVidia GT520の時である。これがハイエンドのものとなればさらにもう10倍は早くなろう!
これがGPGPUの威力である。
 新しいビットマップ イメージ
これはルート長16マスの設定で、1億パターンを計算し結果は47秒であった!!


他にも解析中の「計算中・・」という文字がずっと動かなくてフリーズかと思われないよう、進行度合いを表示するようにした。


さてここでこのソフトの注意点がある。
・プログラマブルシェーダーに対応していないグラフィックボードでは動かない。
(OSはXP以上、対応シェーダーモデル3.0以上 )
・最大テクスチャサイズが4096未満のものは起動しない
・計算中はGPUに非常に負荷がかかるため、動画再生やウィンドウの移動などがカクカクになる
・負荷がかかりすぎると画面が落ちる可能性がある(スペックの低いグラボだと)

と言ったもので、前者2つはかなり古いグラフィックボードで起こると予想されるが、一応少し前のノートパソコンのオンボードですら動く レベルである。
core iシリーズのIntel HD Graphicsでは確実に動くであろう。

4つめの画面落ちだが、設定で安定動作機能も付いているので低速になるがそれを試してみれば必ず動くはずだ。
設定で高速計算機能もつけた。レジストリをいじってGPUのパワーをフルに引き出せる秘技だ。これで通常解析の1.2~1.5倍は早くなうだろう!


またこれはα版である。 まだまだ、不具合が多い可能性があるので、ルートの検索結果がおかしいなどという不具合があればコメント欄にぜひ報告してほしい。
検索結果は、コンボ数の多い順ではある。


最後に完成版までに搭載する機能のピックアップだ。以下のものを予定している。
・起動時の高速化
・検索条件の設定(何色優先など)
・グラフィックの更新
・計算高速化
・ベンチマークのツイッター公開機能??


上から最優先課題として搭載していく予定だ。
 

パズドラルート解析GPGPU版は超高速!

ダウンロードはこちら
新しいビットマップ イメージ










パズドラ ドロップルート解析君 の計算の遅さは確かに自分でも問題であるとわかっていた。
 
全経路検索という手段をとっている以上、莫大な演算量を必要とするのは明らか。

というわけで今自分で開発中の「HSPSHAD」というHSP用GPGPUプラグインを使って、あったら便利だろうなと思う命令の追加や、機能向上を行ないながら同時に開発を行なっていたのが「パズドラルート解析GPGPU版」である。

そして今回、まだ精度に微妙な不安定さは残るが上からの落下も考慮したルート解析で、とりあえず正しい答えを出力することに成功!

ルート解析gpgpu

これはドロップの移動距離が11マスの時の計算結果だ。


結果

初めて正しい演算結果を出してくれたのが非常に嬉しく、思わずアップしたのだが、何が言いたいかというと驚くべきはその速度!なんとミドルレンジ(ローエンドか?)nVidia GT520で1174882通りのルート計算に、GPU 処理time 236ms(ミリ秒)、CPU 処理time 622ms。つまりルート解析アプリの300倍近い速さである!
高性能グラボならさらに早くなる!たとえノーパのオンボードGPUでもアプリの50倍以上は保証できる。

特質すべきはCPU timeというのは演算結果をコンボ数の多い順に並べたりしている時間というだけなので、ほぼ解析の本幹部分は全部GPUで演算しているということ!
つまりアプリで約3~8分くらいかけて行う計算を236msでやってのけたのである。
GPGPUの威力の高さがわかるであろう。

このプログラムはHLSLというシェーダ言語で作成されており、シェーダーモデルは3.0。
シェアードメモリも使えなければ整数演算も擬似的にしかできない。
多くのパソコン上で動くことを優先した形だが、事実上命令数制限完全撤廃されたsm5.0での動作やCUDA 上での実行ならその速度はさらに5~10倍になると予想される。

そしてまた肝心のスクリーンショット読み込みの機能が手付かずという自体になっているが、実装面ではアプリではなくPC上なのでまだ楽である。(と願いたい)


とりあえず精度を高めてインターフェイスを少し作ったら 「パズドラルート解析GPGPU版のテスト版のβ版」をアップしたいと思う。

 2/17 α版公開 ダウンロードは一番↑から

パズドラルート解析アプリの問題点と今後の抱負

PC用解析君はコチラ

新しいビットマップ イメージ




問題のアプリです
https://itunes.apple.com/jp/app/andrpzsolve/id580792881?l=ja&ls=1&mt=8
https://play.google.com/store/apps/details?id=net.onionsoft.hsptv.pdroute
アプリの名前柄、流行りに便乗して多くのユーザーにダウンロードしてもらったという形になったわけですが、
まぁ予想通りではあったが、計算速度があまりに遅すぎるというご指摘を多く頂きました。
その割にはちゃんと評価してくださっているユーザーもいて、親切だなとも思ったというのが感想です。

では早速、このアプリの問題点を全て挙げてみましょう
1、計算速度が遅すぎる
2、スクリーンショット取り込みができない
3、iphone、ipadだとメニュー画面に戻れない 
4、androidでは計算中に強制終了画面がでる 



1、計算速度が遅い
一番の原因は「全経路検索」をしているためです。
数学に「場合の数」という概念があります。
数学的に考えるなら、ドロップをあるルートで動かしたとき、一番コンボ数が多くなる経路を求めるには、すべての場合のルートを確認する必要があります。

ここでルートの最大距離を1マスとしたとき、全ての経路の場合の数は98通りとなります。
とりうる始点は30通り(横6マス×縦5マス)、そこからドロップ移動可能方向の上下左右4をかけ、30×4で120通りとなりますが、欄外にはみ出る経路の場合の数は考慮してはなりません。
例えば始点位置が一番左上の場合、そこから左、上へはもう移動できません。

同じように、ルートの最大距離が2マスとすれば、1マス移動の98通りのルートからさらに1マス上下左右へ移動可能なので4を掛けますが、先ほどと真逆の方向へは移動できません(戻る方向に行けばルート距離が1減るため)。さらに欄外へ行く経路を除外すれば236通りとなります。
以降ルートの場合の数は、 586通り、1452通り、3574通り、8764通り、21412通り、52220通り、127376通り、311224通り、760980通り・・と指数関数的に増えていくわけです。

ルート距離が12マスの場合、全ての経路のとりうる場合の数は1860172通りあります。
ハード的にはだいたいここらまでが限界です。
なぜならここらでスマホの使用メモリが200Mbを超えてしまうからです。
ルート1通りあたりに使うバイト数は、95byte。
内訳は、30個のドロップ(6種類)配列の格納で30byte。
同色ドロップが横2つ続いているときのみ0を表すいわゆる横差分値を格納する変数で30byte、同じく縦でも同じのを作り30byte。
これに加えルートの移動ログを格納する変数で4byte(1マス移動につき2bit)
さらに、ルートの先端部分つまり現在位置を格納する変数で1byte

スマホのメモリ容量は機種によりけりだが、スワップが発生すると劇的に遅くなるのでこれ以上のメモリ使用は難と考えられます。
また計算時間も非常識なものとなります。
1860172通りのルート全てで、コンボが発生するか、発生する場合は何色のドロップが何個何連鎖コンボが発生するかを計算する必要があるので、2.4GhzのノートパソコンのCPUでも3分近くかかります。
スマホのCPUは約1Ghz前後であるしキャッシュもあるのか無いのかよくわからないので、最大12マスの設定で全経路検索をすれば10分近くかかることとなります。

まぁただでさえ非常識な時間なのでこれ以上は不可能でしょう。
全経路検索にしなければ計算時間は劇的に早くなるわけですが、それではコンボの精度が悪化してしまうという欠点があります。
それでも計算速度が早くなる利点は非常に大きいですが、それは以下に示す問題点により、あえて精度をとったという経緯がありました。


2、スクリーンショット取り込みができない
これは、ただただ私の技術不足のため、という一言につきます。

アプリを開発するにあたり、取る方法は2通りあります。
ひとつはHSPdishを使い開発すること、もうひとつはxcodeでobject c、eclipseでjavaを使い開発すること。
後者ではスクリーンショット読み込み機能が実装できます。
私にはHSPで作るしか能力がなく、残念ながらスクリーンショット読み込み機能が実装できませんでした。

また私の機種にはそもそもスクリーンショットを取る機能がなく、そのような機種でもルート解析ができるようにしたいという思いがあったのも事実ですが、やはりスクショ機能はあったに越したことはありません

つまり、ドロップ配列を手動で入力するしかなく、ここでユーザーに多くの労力を強いることが容易に想像できました。
時間と労力をかけて入力しても、計算が一瞬で終わってしまいその割にはたいしたコンボ精度が得られなければ、意味がありません。

時間と労力をかける価値がある状況というのは通常の状況ではあまりありえなく、詰みそうな場合やこの1ターンで戦局が大きく変わる場合など、ここ一番という場面に限られます。
そういうときは、一回だけすごい時間をかけても最大コンボルートを導き出せればいいのですから、計算時間より精度を優先したシステムの方を選択し、結局このような非常識な計算時間になりました。


3、iphone、ipadだとメニュー画面に戻れない
※最新情報で、「ホームボタン二度押し、下の段に出てくるアプリアイコンを消してあげると再度アプリ起動した時に解析できる」ようになっているそうです。

これは評価コメントを見てはじめて気がついたのですが、iphone、ipadの場合、ホームボタンを押したときの動作として、アプリが終了するのではなく、アプリが待機状態になるという性質を理解していないために生まれてしまった不具合でした。申し訳ありません


4、androidでは計算中に強制終了画面がでることがある
これは私が、計算プログラムにwaitを入れるのを忘れたため、タスクがビジー状態になっているためです。
なんという初歩的なミス・・
対策方法は、エラーメッセージが出たら「待機」ボタンを押して待つ、です。いつか結果画面が表示されるでしょう

毎年のHSPプログラムコンテストの作品でもそうですが、私はwaitを 入れるのを忘れる癖があるようです
いい加減直したほうがいいですね
申し訳ありません



なにはともあれ、リリースして3週間くらい経とうとしていますがとても多くのダウンロードと評価をありがとうございます。そして沢山の不具合に関しては、申し訳ございません。

HSPdish製のアプリということで、アプリランキングでそこそこいい所までいけたというのは、HSPの評価を上げるまぁまぁいい話題になるのかなと思う反面、計算が遅かったりと評判が悪いのを見ると逆にHSPの評価を下げてしまう結果になるのではと少し恐れてもいます・・・

まぁアプリの名前は少し誤りがありますからね
もっと誠実につけるとしたら「移動距離が12マス以内で、コンボ数がそれ以上多くなるようなルートがないことを証明するアプリ」とでもなるのでしょうか。そのルートには移動距離制限がつくため、人間がルートを考えた場合13マス以上でもありうるので、人間が考えたほうがコンボ数が多くなる可能性もあります。

だから役に立つ場面なんてのはほとんどないかもしれません。



そういえばHSPdishが出た当初どこかで、その便利さを称えるコメントかなんかで、「これのお陰でしょうもないアプリがたくさん世に放たれるのか」といったのを見た記憶があるのですが、自分でまさにその通りにしてしまいました。



そして今後の抱負ですが・・
そろそろツールじゃなくてゲームを作りたいな・・

もちろんプラグイン開発も同時進行で
むしろプラグインを積極的に使ったゲームとか
プロフィール

toropippi

記事検索
アクセスカウンター

    QRコード
    QRコード
    • ライブドアブログ