2008年11月25日 (火)想定外の使い方はさせないように。。。
おはようございます 本日の当番 プログラマーのT.Yです。
突然ですが、皆さんの作られてるプログラムの関数は、
他の人が想定外の使い方をした際にはどのような挙動になりますか?
実は最近、私は尽くこれに後悔させられたからです。
たとえば最近通信処理を行っていますが。
StartSynchronizePad() ←同期開始
EndSynchronizePad() ←同期終了
IsSynchronizePad() ←キー同期しているか
IsDataSync() ←データ同期しているか
基本的にはこいつらが全てな訳ですが。
簡単な説明では、
同期開始関数が呼び出されると↓のような処理が内部的に行われます。
全員で共有しあうデータの同期
↓
乱数関係のシード値を同期
↓
キーコンフィグなどを情報を同期
↓
フレームの同期開始
といった流れになるので、使い方としては、
同期したデータも使いたい場合も考慮すると
「StartSynchronizePad()」を呼び出した後次のフレーム以降は
「IsDataSync()」でデータが同期されるのを待つ
「IsSynchronizePad()」で同期通信中かを確認した後から
通信対戦するゲーム処理に入る。
ここからは、全く同じ処理が全員で行われる事により、
少ない通信量で通信対戦が出来るでしょ?という訳。
ゲーム終了も同じフレーム数後に終了され、
終了時には「EndSynchronizePad()」を呼び出して、同期通信を終了する。
というのが本来の形。
これを、使ってもらうと現実には。。。。
「EndSynchronizePad()」を呼び出した後に
「IsDataSync()」でなぜかデータ同期待ちを行っていて、
実装した人に説明すると
「え?そうなん?」
みたいな事になったり。
同期通信後に、データのロード待ちが挟まってしまい、
ゲーム開始と同時にプレイヤーの座標がずれたり。
そして、「EndSynchronizePad()」の呼び出しフレームが変わったり。
結構簡単にカオスになってしまいます。
そして、私の元に、
「通信対戦中に、○○の後に画面が暗転したままストップしてしまいます」
だとか、
「通信対戦中に、キャラの座標がずれます」
といったバグとして、とりあえず飛んできます。
ですので、そんなことにならないように、
同期開始処理の呼び出しが一切行われない(または行われる見込みも無い)状況下で
同期完了待ちなんてしようとされた場合には。
assert((false)?"同期してないのに、同期待ちしてます":false));
とか
assert((false)?"終了フレームが違います":false));
とか入れてやらないといけない訳ですよ。
そうすることで
「あれ?止まった」
って時に、
assertion "(false)?"同期してないのに、同期待ちしてます":false" failed: file "source/main.cpp", line 284
とか出てくるので、ソースを見るまでもなく、原因がわかります。
まぁ、これは適当にサンプルとして書いてみただけなので、
#define YASSERT( x, mes ) assert( (x)?#mes:false )
とかして使いやすそうにするとか工夫は必要です。
そういう癖をつけておくと、そのうち幸せになれるかもしれませんよ?
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント