マシン語ゲームで小数が使われていたか否か語るスレ
スプライトを使うゲームなら実装はアーケードやゲーム機、MSXなどで数えきれないほどある。
整数のみでリアルタイムゲームを作るのは、アーケードやゲーム機では黎明期を除き極めて少数派。 使われてたに決まってるじゃん。
================= 終了 ==================== ================= 再開 ==================== 小数って言っても、固定小数点だろ。
でもスプライト使ったアクションゲームでも小数使わずに作れるんじゃないの? 〜〜〜〜〜〜〜〜〜 今度こそ終了 〜〜〜〜〜〜〜〜〜 100倍で計算して100で割る
そんなんでも十分だった >>8
それが固定小数点の考え方だよね
普通は256倍とか128倍、64倍などにするけど 小数点以下8ビットで0.00390625か (間違ってたらスマンこ)
そこまで必要ないような希ガス
小数点以下は3ビットか4ビット前後もあれば充分なんじゃね
4ビットの根拠はないけどなんとなくそれくらいかな、と 1フレームで複数回の移動計算・判定処理を入れてた事例は
さすがにないだろうな。 整数だけだと縦or横と同じ速度で動くはずが斜では急に速度が上がるという不条理w
誤差が最悪40%ぐらいでる・・・のかな?
たぶん描画エリア(座標計算が必要なエリア)の縦横どちらか長いほうの辺に合わせるのがおそらく合理的。
長辺が129〜256ドットの範囲なら小数点以下は8ビットあれば内部の座標と画面上の表示位置の誤差は最大1ドットにまで収束する・・・んでいいはず。
ちょっと自信ないけど。
本職のゲームプログラマーさんに正解を教えてもらいたい。 ゼビウスでは、ガルザカートでちゃんと丸く広がってたから、
それらしい計算は行われていた模様。
まあ、上記の通りビット操作の固定少数なんだろうけど。
方向が16方向で固定だったようだから、
移動量の配列でも用意していたのだろう。 >>10
単純な話だけど、ビットシフトするにも時間が掛かる
実は8bitだと速いんだよね、16bitで計算して上位8bit取り出すのはノーコストだから
そんな理由で、8bitが多いと思う、精度と言うより効率だね >>14
画面解像度が256ドットとしても
整数部8ビットじゃ、画面外の処理ができないので
整数部10ビット程度は必要だよ >>15
俺は現役時代整数部10ビット小数部6ビットの固定小数点で演算してたなぁ >>12
>>整数だけだと縦or横と同じ速度で動くはずが斜では急に速度が上がるという不条理w
ああ、そりゃそうだよな
斜め移動を単純な縦移動+横移動ってさせてたら確かにそうなってしまう
一度に縦と横の両方を移動できちゃうもんな
なるほど、単純な斜め移動でも小数が必要になるわけか ふむふむ、10 : 6ビットで扱うのが主流だったわけか。
おれは12 : 4ぐらいかなあと思ってた。 >>14
スプライトの座標系が-512〜+511とすると
左がスプライト側 右側がCPUから見たI/Oが
アーケードゲーム機だとこんな風に配置される様に
ハード屋さんに作ってもらうので
プログラム上でビットシフトせずに済むんだよ
D9 - D15
D8 - D14
D7 - D13
D6 - D12
D5 - D11
D4 - D10
D3 - D9
D2 - D8
D1 - D7
D0 - D6
NC - D5
NC - D4
NC - D3
NC - D2
NC - D1
NC - D0
NCは未接続 >>19
> ハード屋さんに作ってもらうので
> プログラム上でビットシフトせずに済むんだよ
こういうのをチート(ずる)と言わずしてなんというw アーケードゲーは、はじめからそのソフトに見合った
ハードの設計をしてたんだもんねぇ。 >>18
だいたい整数部にどれだけのビットが必要か、小数部にどれだけの精度が必要か、あとは
どれだけビットシフトを減らせるか位のバランスで決める感じだよね
>>19みたいなアーケードの例はとても興味深いね、こういうトコでも普通のパソコンより有利な
条件が出てくる、専用ハードウェアだからこそだね >>19
へえ、面白いなぁ
開発がソフトとハードで平行して行われるような環境ならではだね
8ビットマイコンだと既に出来上がってるハードの上で作るしかないからどうしたって不利になる ある時期から8bitから16bitのスプライトマシンで固定小数使うのは常識になっていたのは知ってるし、後半の部分では実際に商品を作っていた。
ただ、前にあった書き込みで、速度はそのまま持つのではなく何段階かにしてテーブルのテーブルを持つのは実装としてあったと想像する。
MSXのザナックタイプなど、遅いCPUでそれなりに敵が多いシューティングゲームはこれを採用してるんじゃないかな。
あの手のはスプライトのちらつきを抑えるためにスプライトダブラを使ってるだろうから、それだけでもCPU負荷は大きい。
#アイテムで自機速度が少しずつ上がるとかはそのままではできなくなるが、自機だけ処理を別にすれば良い。 結論 : 使われてた
============= 終了 ================ 100なり1000なりかけて計算すればいいだけ
ゲームボーイアドバンスなんかも固定小数使ってた
DSになるとさすがにない 100なり1000なりなんて手間だろ
「128なり1024なり」 って言えよ GBAはarm7
32ビットCPUなんでマシン語なんて使わんだろ
100なり1000なりかけて計算すればなんて書いちゃう奴だから
プログラムのプの字も知らないんだろうけど 今どきの32ビットや64ビットのコンパイラより効率のいいコードを、アセンブラで書けるようなヒトって人間辞めてるだろw そういや昔、ゲームボーイアドバンスで
プログラムする本てのを買ったことがある。
それにはケーブルがついてて、そのケーブルを
ゲームボーイにつなぐことで、ROMの吸い出しが出来たんだよ。 unixuser誌でそんな連載があって、連載終了後
USB転送ケーブル付きで書籍が発売されたのよ。
何年か遅れで買ったけど、これ2003年発売なんだ。
もう15年も前の話か・・・ 小数は使ってたよ。
float double みたいなのじゃないけど。 浮動少数演算がデバイスドライバになってるマシンがあったな。
浮動少数演算CPUを増設してドライバを置き換えれば、
アプリはそのままでも演算速度がアップするとか。 >>34
でも計算の度に呼び出すからオーバーヘッドが大きくて遅くなるんだよな 68000では固定小数使ってたわ。
レジスタ32ビットだったから、
上位整数、下位小数で add.l とかでロングワードで計算してた。
実際スプライトレジスタに転送するのは上位のみ。 >>34
68881が無いとエラー出すゲームソフトがあったよ
だからFPU無し機種の為にソフトFPUなるものがあった
当時浮動小数点演算FPUは高額だったからね
コストダウンの為にオプション扱いされてた
Macintoshなんだけどさ DOSでは環境変数NO87に何か文字列を設定しておくと8087があっても使わなかったな サインテーブルとか固定小数で1象限分だけ(他は反転でどうとでもなるので)作ってたな…
360度を1/4で90度分を256分解能で近似とかのインチキ演算でも低解像度だと案外バレない >>39
一回転360度を256(符号なし8ビット)段階化はやるよな
オーバーフローチェックも要らなくなるし DOS版のTSPという時系列分析ソフトが87系必須で、8087エミュレータでごまかしていたが劇的に遅かった >>39
そんなプログラムを先月作ったがテーブルは257個じゃないと1.0相当値の入る場所が無くて困る いや、角度は1度刻みで0度から90度の91項目だろ?
角度を256段階に刻む必要なんてあるか? 一周を360で刻む必要がゲームには無いから、扱いやすい256や1024で刻む
90より楽な理由は二進数だから 角度で刻むのではなくて始点のXY軸と終点XY軸では
例えば敵キャラの今いる位置を始点として
狙う自機キャラの今いる位置を終点とする
みたいな〜感じ〜 では???