这段代码中“增量”的含义是什么?它反映了游戏开发人员的标准吗?


24

我对游戏编程了解甚少,但想了解更多。我正在尝试了解游戏的代码。我试图理解为什么代码会将“ delta”传递给Shipcontrols.js,后者会根据用户输入来更改飞船的方向。

基本上,游戏每个循环都会计算“增量” ...

这是使用delta到一个循环的堆栈的缩写版本...

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

Answers:


27

这就是“时间增量”。自上次更新以来已经过了多少时间。有必要确保动画,物理等以正确的速度运行。

该代码每帧更新运行一次。但是,不能保证以恒定速度绘制帧。一帧可能需要1/60秒,下一帧可能需要1/30秒。如果您不对此进行衡量和考虑,则游戏会令人不安,在各种情况下运行得太快或太慢。

时间增量经常在物理学中应用,因为这就是为简单的Euler积分指定方程式的方式。将速度集成到位置的定义是x1 = x0 + v * (t1 - t0)简化为的代码,例如x += v * dt。因此,需要时间增量来评估物理更新。

测量和应用时间增量非常非常正常。


我认为这是最好的答案,因为它解释了'dt'可以有很大的不同,这就是为什么我们需要用它来内插物理计算的原因。
BiAiB

可能值得注意的是,在某些情况下,时间增量的一个主要问题是,在许多情况下,时间增量会被一个帧“关闭”。如果由于某种原因导致一帧更新花费的时间是平时的两倍,则即使在显示对象移动两倍时才显示该帧,计算该帧的动作时所应用的增量也将是平常的。就像他们一样。如果该帧与下一帧之间的时间比平时短(如果计时器尝试“追赶”,则可能会发生,则两帧之间的时间比平时短的帧将显示...
2013年

...物体位置之间的距离大于平常的距离)。
2013年

@supercat:那只是通常的Fix Your Timestep之类的东西。但是,您仍然需要每帧时间增量,以了解何时执行固定仿真。
肖恩·米德迪奇

@SeanMiddleditch:作为为Atari 2600编写游戏代码的人,我觉得有些奇怪,没有人为这个事实感到遗憾,在现代系统上,玩家移动控制器和角色响应之间存在不可避免的滞后。在许多Atari 2600游戏中,每16.7毫秒对控件进行一次轮询,并且玩家的更新会在此间隔的1-16毫秒内发生(取决于垂直位置)。现代设备无法对此做出快速反应。
2013年

32

在数学上下文中,“Δ”,“ d”或“Δ”是指“差异”。每当具有相似含义的两个数字之间存在差异时,该差异可以称为“ delta”或“ d”。

三角洲在游戏开发中非常普遍。例如,一个字符的之间的差的X坐标一秒前和其x坐标现在可以被称为“增量X”,并且通常表示为dxdelta_xd_x

同样,两次之间存在差异是很常见的,就像在代码中一样:

var delta = now - this.time;

在这种情况下,该变量表示存储在中的某个时间与存储在中this.time的时间之间的差now

增量通常用于表示时间的变化。因此,例如,如果您知道玩家的X坐标每帧应更改5个像素,则可以将此更改存储为增量:

var delta_x = 5

然后在需要时使用该增量应用更改:

player.x = player.x + delta_x

但是请记住,这只是一个约定。没有人会强迫您将变量命名为“ delta”或“ d”,但这样做可能会帮助其他读取您的代码的人或您自己(如果将来再读取)的人来了解该变量应该做什么。

在编程中广泛使用的其他常见希腊字母是:

Epsilon:很小的价值。通常在比较浮点数或其他具有精度问题的变量时使用:

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

Pi同义常数

Theta:代表角度

Lambda:用于表示匿名函数或闭包


1
您还将看到π的某些倍数,例如2π,π/ 2,π/ 4和e(欧拉常数)。
jzx

@Thomas:当然,任何具有数学基础的程序都会将理论符号带入代码中。注意句子“ 编程中广泛使用的其他常见希腊字母是”。“ 某些图形代码”几乎不能被视为“通用”或“广泛使用”。我从未宣称这些是唯一可以使用的希腊字母,也不是您可以为这些希腊字母设置的唯一含义。
2013年

@yzx:我最后一次检查,欧拉恒用拉丁文字母“E”。我不是在谈论代码中出现的数学常数,而是谈论代码中常用的希腊字母。
2013年

@PandaPajama我已删除我的评论,因为它不受欢迎。
托马斯

3
如果您的战友特别时髦,您甚至可以看到Tau(τ)而不是2π。
卡兹巨龙

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等),结果都是相同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.