Game Studio 4.0におけるElapsedRealTimeとTotalRealTime
新しい機能についてのブログポストを書くとき、よく、今までに書いたデザインドキュメントや、バグデータベースを参考にします。殆どの場合はその内容をそのまま引用することはないのですが、今回は既存の文章がそのまま使えるので、盗用することにしました。
すべでは私が登録したバグの記述から始まります。
「GameTimeクラスのRealTimeメンバーは混乱のもとだし、特に良い使い道もない。更に通常、常にRealTime以外のメンバーを使うことが良いというのであれば、混乱を少なくするためにRealTimeメンバーを削除するのがいいのではないか?」
これは既存のAPIに変更を加えることになるので、DCR(Design Change Request、つまり設計変更要求)のプロセスを通す必要がありました。このプロセスでは変更による影響を理解し、大きな問題とならないことを確認し、または変更を拒否する理由なども考慮します。
以下の文章は私がDCR向けに書いたものです。
GameTimeクラスは以下の四つのプロパティがある。
- TimeSpan ElapsedGameTime;
- TimeSpan TotalGameTime;
- TimeSpan ElapsedRealTime;
- TimeSpan TotalRealTime;
このDCRではElapsedRealTimeとTotalRealTimeプロパティの削除と、それらのプロパティを引数として使っているコンストラクタの削除を提案する。
これらのプロパティは最適に計算されるゲーム内時間ではなく、実時間経過を直接使いたい場合に用意されたプロパティであるが、以下の問題がある。
- これらのデータが有用になることは殆どない。もし実時間でゲームを更新したいのであれば、可変更新に設定(IsFixedTimeStep=false)すればよい。この場合、*GameTimeと*RealTimeの値は一緒になる。
- もし、本当に実時間が測定したいのであれば、.Netフレームワークのタイマー系API(Stopwatch, Environment.TickCount, DateTime.Nowなど)を使うべき。私たちが同じような機能を提供する必要はない。
- これらのデータがGameTimeにあるのは混乱の元。*RealTimeと*GameTimeのどちらを使っていいのか判らない人達をよく見かける。多くの人達が*RealTimeパラメーターが正しいものだと勘違いして使ってしまい、問題に直面している。
- ElapsedRealTimeプロパティは特に混乱のもと。Drawメソッド内での定義があいまい(はっきりさせるべきだった)。RealTimeプロパティ値はGameTimeプロパティ値と同じように更新はしない。では、何を基準にした時間にするべきか?現在の実装は基準を任意に選択していて、このままでは使い道がない。
開発コスト: 2時間
このDCRは承認され、Gamer Studio 4.0でElapsedRealTimeとTotalRealTimeプロパティは削除されました。