シングルプレイヤーエンジンは無効なデータをどの程度強制的に拒否する必要がありますか?


11

シングルプレイヤーゲームで、外部スクリプトで指定されたコンポーネントからエンティティを構築しようとする場合、コンポーネントの1つが不正な形式である場合に何が望ましいと思いますか。

  • エンジンはそのコンポーネントをスキップして、適切に記述されたコンポーネントのみを使用してエンティティをゲームの世界に住まわせる必要がありますか?
  • または、コンポーネントの1つが不正な形式である場合、エンティティを世界に追加しないでください。

エラーをログに記録することについては話していないことに注意してください。これは言うまでもなく、エンティティに何が起こるかについてだけです。


シングルプレイヤーとマルチプレイヤーのどちらについて話しているのですか?
o0 '。

@Lohorisシングルプレイヤー。
ポールマンタ

2
ほとんどの回答がすでに暗示しているように、あなたの聴衆は誰ですか?あなたは改造可能なゲームを作っていますか、それとも社内開発の目的で話しているのですか?
テトラッド、2011

@Tetradできる限りモダーフレンドリーなゲームにしたい。
ポールマンタ

回答:


11

改造可能なゲームについて話している場合は、上記の提案の1つに従うことをお勧めします。しかし、あなた自身のエラーをロールオーバーすることについて心配しているなら、私はそれをしないと言うでしょう。私はFail-Fastの擁護者になりました。これはというエラーであれば、あなたが作成したとリリースする前に解決しなければならない、あなたはエラーが明らかにする必要があります。Wikiページの下部にリンクされている記事は、なぜフェイルファストが良いのか、いつ使用すべきか、または使用すべきでないかについての主題をよく読んでいます。


2
これはユーザーのエラーと開発者のエラーを区別する素晴らしい二分法だと思います。コンパイラエラーは一般に修正が非常に簡単ですが、ランタイム/セマンティックエラーは悪魔であるというまったく同じ理由で理にかなっています。
ジョッキング

エンジンに、ゲームの開始後にエンティティを変更する方法が含まれている場合は、失敗する前に、少なくとも自分でエラーを修正する機会を与える必要があります。
Blecki

7

ユーザーと開発者の違いは、ゲーム開発では必ずしも明確ではありません。「フェイルファスト」などの標準的なプログラミング手法は、特にチームの規模が大きくなるにつれて、必ずしも有利とは限りません。

たとえば、テクニカルアーティストがターゲッティングアウトラインのシェーダーを台無しにした可能性があります。たとえば、フォールバックが壊れたため、SM4システムにしかロードされず、ラインシステムのトップにいるため気付かなかったとします。これにより、一部のアニメーションの読み込みに失敗します。これらのアニメーションは、戦闘デザイナーが作成した特定の呪文によって参照されます。最後に、レベルデザイナーはスポーンを配置しようとしていますが、これらのスポーンはすべてその呪文をキャストできますが、効果がないため、スペルが有効ではないため、世界中にそれらを配置できません。デザイナーは常に最悪のコンピューターを使用しているため、シェーダーが読み込まれないため、無効です。

ですから、あなたのデモは午後2時までには準備ができておらず、投資家はなぜゲームで敵を1人も獲得できず、プロジェクトがシャットダウンするのか疑問に思っています。

または、失敗をログに記録し、試行を続けるオプションを選択すると、一部の敵のスペルエフェクトが表示されないことを除いて、ゲームは問題なく再生されます。通知。

そのため、ほとんどの場合、最初のオプションを推奨します。できるだけ多くのエンティティをスポーンします。フェイルファストの場合があります-ビルドを実行できる人(つまり、プログラマーおよびテクニカルプロデューサー)以外はデータを編集してはならず、常にロード時に100%チェックされる場合、または責任者が確実である場合など問題はエディターを使用している人です-しかし、それらは通常のケースではなく、投資する準備ができていない可能性があるため、それ自体多くの技術インフラストラクチャが必要です。


1
あなたが提案するシナリオは、優れたソース管理システムで防ぐことができると思います。あなたのシナリオでは、アーティストは「ビルドを壊しました」。壊れたシェーダーを使用している他のユーザーは、問題が解決されるまで、シェーダーを以前のリビジョンにロールバックできるはずです。
ジョンマクドナルド

1
@John優れたソース管理は必須であり、障害がローカルで解決されるまでプロジェクトの残りの部分を作業状態に復元するためにロールバックが必要な場合がありますが、これは防止メカニズムとしてはほとんど役立ちません。 。

@ジョン:大規模なプロジェクトでは、ビルドに数時間(または1日)かかることがあります。したがって、実際には2つの方法が必要です。ソース管理だけでなくバイナリ管理も必要なので、プログラマーではない人が以前のビルド全体にロールバックできます。しかしもちろん、これには独自のリスクとコストがあります。これは、他の古いバグに対して新しいコンテンツを開発しているためです。実行可能ファイルには、他の悪いバグがある可能性があります。そして、ロールバックする適切なビルドを見つけることさえ、30分以上かかる場合があります-デザイナー全員が30分停止してビルドをいじる必要がある場合、それは大きなお金を無駄にします。

@Joe Wreschnig:それは理にかなっています。だから、私はフェイルファストがもはや資産ではない点があるに違いないと思います。それを使用する人々のタイプ、または特定のサイズのプロジェクトのいずれかです。何がうまくいくかを決めるのはチームのメンバー次第だと思います。
ジョンマクドナルド

2
ファストハードフェイルは本当に問題なのか、確信が持てません。一人の「チーム」であっても、本当にこのレベルを達成する必要があるため、シェーダーコードを処理したくないのかもしれません。確かに適切なエラー処理を記述し、すべてのエラーをログに記録しますが、6か月前にエラーコードを書いたときよりも、すぐに何が重要であるかをよく理解しています。

1

ユーザーは、インポートするエンティティをプレビューでき、エラーがあるかどうかを事前に知ることができます。

どのようなエラーが致命的で、ゲームに追加されないようにするか、警告として無視することができるかを何らかの方法で決定する必要があります

もちろん、何らかの理由でインポートされたエンティティが何らかの理由でセーブゲームデータを不可逆的に変更できる可能性がある場合は、完全なものにする必要があります。


0

開発では、無効なデータについてはうるさいはずです。つまり、読み込まれるすべての場所にすべてを記録します。ただし、エンジンがこれを無視して続行できる場合は、そうする必要があります。あなたはのようなロジックを持つことができます

void setValue(int value) {
    if (value < MIN_VALUE) {
       log(value + " is too low, using " + MIN_VALUE);
       value = MIN_VALUE;
    }
    if (value > MAX_VALUE) {
       log(value + " is too high, using " + MAX_VALUE);
       value = MAX_VALUE;
    }
}

マルチプレイヤーゲームでも、1人のプレイヤーがシステムをだまそうとしていると想定しない限り、これは許容されます。

ソフトウェアをリリースした後、プレーヤーがこれらのログを読み取らないことを想定して、デフォルトでこのロギングをオフにすることをお勧めします。


ログにパフォーマンスの問題がない場合は、リリースビルドでログオンし続け、レポートを開発チームに送り返す必要があります。(もちろん、プレイヤーに適切に通知します。)

リリースのために、より簡潔なログを記録できるはずです。開発では、より冗長になる傾向があります。
Peter Lawrey、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.