このコードの「デルタ」のポイントは何ですか?ゲーム開発の標準的なものを反映していますか?


24

私はゲームのプログラミングについてほとんど知りませんが、もっと学びたいです。このゲームのコードを理解しようとしています。私はコードがShipcontrols.jsに「デルタ」を渡している理由を理解しようとしています。これはユーザーの入力に基づいて船の方向を変更します。

基本的に、ゲームはループごとに「デルタ」を計算します...

これは、1つのループを介してデルタを使用するスタックの短縮バージョンです...

var delta = now - this.time;
this.time = now;
this.current.render.call(this.current, delta, this.renderer);  

ここへのステップ...

ctx.manager.add("game", scene, camera, function(delta, renderer)
{
if(delta > 25 && this.objects.lowFPS < 1000) this.objects.lowFPS++;
var dt = delta/16.6;
this.objects.components.shipControls.update(dt); 

ここへのステップ...

bkcore.hexgl.ShipControls.prototype.update = function(dt)
{
var pitchAng;
var yaw;
var roll;
if (undefined != hand){ 

これはこのようなことをします...

if(this.key.forward)
    this.speed += this.thrust * dt;
else

この...

if(this.key.right)
{
    angularAmount -= this.angularSpeed * dt;

ここでのデルタのポイントは何ですか?ランダム性の要素を導入しようとしているだけですか?このゲームのコードは非常に優れています。この男はなぜデルタを使用したのですか?


2
「ランダム性の要素を導入しようとしているだけですか?」実際、正反対は真実です。ここでのデルタの目的は、ランダム性を減らし、ゲームエンジンの物理を正規化することです。
zzzzBov

回答:


27

これが「時間差」です。前回の更新から経過した時間です。アニメーション、物理学などが適切な速度で実行されていることを確認する必要があります。

コードは、フレームの更新ごとに1回実行されます。ただし、フレームが一定の速度で描画されるという保証はありません。1つのフレームには1/60秒かかり、次のフレームには1/30秒かかります。これを測定して説明しないと、ゲームは不安定になり、さまざまな状況で速すぎたり遅すぎたりします。

単純なオイラー積分のために方程式が指定される方法であるため、物理学ではタイムデルタがしばしば適用されます。速度を位置に統合することは、のx1 = x0 + v * (t1 - t0)ようなコードに単純化するものとして定義されますx += v * dt。したがって、物理的な更新を評価するには時間差が必要です。

時間の差分を測定して適用することは、非常に正常です。


「dt」は大きく異なる可能性があるため、これが物理計算を補間する必要があるため、これが最良の答えだと思います。
BiAiB

いくつかのコンテキストでの時間デルタの大きな問題は、多くの場合、フレームごとに「オフ」になることです。1つのフレームの更新に通常の2倍の時間がかかる場合、そのフレームのアクションを計算するときに適用されるデルタは、オブジェクトが2倍移動するまでフレームが表示されない場合でも、通常のデルタになります彼らがしたように。そのフレームと次間の時間は、(「追いつく」まで、タイマーしようとした場合に発生する可能性があり、それらの間に通常よりも短い時間で2つのフレームが表示されます...通常よりも小さい場合
supercat

...オブジェクトの位置間の距離が通常よりも大きい)。
-supercat

@supercat:これは通常のFix Your Timestepのものです。ただし、固定シミュレーションをいつ実行するかを知るには、フレームごとの時間デルタが必要です。
ショーンミドルディッチ

@SeanMiddleditch:Atari 2600向けにゲームをコーディングした人として、現代のシステムではプレイヤーがコントローラーを動かしてからキャラクターが反応するまでに避けられないラグがあるという事実を誰もが嘆いているのではないかと興味をそそられます。多くのAtari 2600ゲームでは、16.7ミリ秒ごとにコントロールがポーリングされ、その1〜16ミリ秒以内にプレーヤーの更新が行われます(垂直位置に応じて)。現代の機器は、すぐに反応することができません。
supercat

32

「デルタ」、「d」または「Δ」は、数学的文脈における「差異」を意味します。意味が似ている2つの数値に差がある場合、その差は「デルタ」または「d」と呼ばれることがあります。

デルタはゲーム開発において非常に一般的です。たとえば、1秒前のキャラクターのX座標とそのX座標の差は「デルタx」と呼ばれるようになりdx、一般的に、delta_xまたはとして示されd_xます。

また、コードにあるように、2つの時間の差があることは非常に一般的です。

var delta = now - this.time;

この場合には、その変数に格納されているいくつかの時間差表すされthis.time、且つに格納された時間now

デルタは一般に、時間の経過に伴う何かの変化を表すために使用されます。たとえば、プレーヤーのX座標がフレームごとに5ピクセル変化することがわかっている場合、この変化をデルタとして保存できます。

var delta_x = 5

そして、そのデルタを使用して、必要なときにいつでも変更を適用します。

player.x = player.x + delta_x

ただし、これは単なる慣習にすぎないことを忘れないでください。変数に「デルタ」や「d」という名前を強制する人はいませんが、そうすることで、コードを読む人や、将来読んだ場合は自分自身が変数の意味を理解するのに役立ちます。

プログラミングで広く使用されている他の一般的なギリシャ文字は次のとおりです。

イプシロン:非常に小さな値。浮動小数点、または精度の問題がある他の変数を比較するときに一般的に使用されます。

const epsilon = 0.0001
...
if abs(some_float - other_float) < epsilon then
    -- close enough, let's say they're equal
end

Pi名前の定数

シータ:角度を表すため

ラムダ匿名関数またはクロージャを表すため


1
また、2π、π/ 2、π/ 4、e(オイラーの定数)など、πの特定の倍数が表示されます。
jzx

@Thomas:もちろん、数学的な基礎を持つプログラムは理論的な表記をコードに持ち込みます。「プログラミングで広く使用されている他の一般的なギリシャ文字は」という文に注意してください。「一部のグラフィックコード」は、「共通」または「広く使用されている」とはほとんど見なされません。これらがギリシャ文字だけで使用できるとか、これらのギリシャ文字に設定できる唯一の意味があるとか、決して主張しませんでした。
パンダパジャマ

@yzx:前回チェックしたとき、オイラーの定数はラテン文字「e」を使用していました。私は、コードに現れる数学定数についてではなく、コードで一般的に使用されるギリシャ文字について話していました。
パンダパジャマ

@PandaPajama歓迎されないのでコメントを削除しました。
トーマス

3
仲間が特にヒップであれば、2πの代わりにTau(τ)が表示されることもあります。
カズドラゴン

3

dtの略ですdelta time。フレームレートの計算に使用され、フレームレートが何であってもゲームが同じ速度で実行されるようにします。

詳細についてはframerate independence見つけることができるここに


3

dt(デルタ時間)は、ループの各サイクル/レンダリングフレーム(または任意のタイムスタンプ)間の時間です。このデルタ時間を使用して、特定の値を時間とともにストレッチできます。現実の世界と同じように、特定の物理特性を経時的に測定します。

ゲームを毎秒60フレーム実行するとします。プレーヤーに毎秒5ピクセルを移動させたい場合は、

 5 * (1/60); //Assuming we have a stable delta time of 0.016
 // (1/60) = 0.016 || 0.016 * 5 =  0.083 --> moved per frame || 60 frames * 0.083 = 5

または

 5 * (newTime - oldTime); //aka dt

キャラクターは60フレームで5ピクセル移動します。サイクルが長くなるほど、デルタ時間が長くなります。

すべてのフレームレート(1 / 30、1 / 25など)で結果は同じになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.