Điểm của đồng bằng delta trong mã này là gì? Nó phản ánh một điều tiêu chuẩn trong trò chơi dev?


24

Tôi biết rất ít về lập trình trò chơi nhưng muốn tìm hiểu thêm. Tôi đang cố gắng để hiểu mã cho trò chơi này . Tôi đang cố gắng hiểu lý do tại sao mã lại chuyển "delta" sang Shipcontrols.js, thay đổi hướng của tàu dựa trên đầu vào của người dùng.

Về cơ bản, trò chơi tính toán "delta" mỗi vòng lặp ...

Đây là một phiên bản rút gọn của ngăn xếp sử dụng delta qua một vòng lặp ...

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

Bước vào đây ...

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); 

Bước vào đây ...

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

Những thứ như thế này ...

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

và cái này...

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

Điểm của đồng bằng ở đây là gì? Có phải nó chỉ đang cố gắng để giới thiệu một yếu tố ngẫu nhiên? Mã cho trò chơi này là rất tốt. Tại sao anh chàng này sử dụng delta?


2
"Có phải nó chỉ đang cố gắng giới thiệu một yếu tố ngẫu nhiên?" Trên thực tế hoàn toàn ngược lại là đúng, mục đích của delta ở đây là để giảm sự ngẫu nhiên và bình thường hóa vật lý trong công cụ trò chơi.
zzzzBov

Câu trả lời:


27

Đây là "đồng bằng thời gian." Đã bao nhiêu thời gian trôi qua kể từ lần cập nhật trước. Điều cần thiết là đảm bảo rằng hình ảnh động, vật lý, v.v đang chạy với tốc độ phù hợp.

Mã đang chạy một lần trên mỗi cập nhật khung. Tuy nhiên, không có gì đảm bảo rằng các khung được vẽ ở tốc độ không đổi. Một khung hình có thể mất 1/60 giây và khung hình tiếp theo có thể mất 1/30. Nếu bạn không đo lường và giải thích cho điều này, trò chơi sẽ bị hốt hoảng và chạy quá nhanh hoặc quá chậm trong nhiều trường hợp.

Đồng bằng thời gian thường được áp dụng trong vật lý vì đó là cách các phương trình được chỉ định cho các tích hợp Euler đơn giản. Tích hợp vận tốc vào vị trí được định nghĩa là x1 = x0 + v * (t1 - t0)đơn giản hóa thành mã như thế nào x += v * dt. Do đó, thời gian deltas là cần thiết để đánh giá cập nhật vật lý.

Đó là rất, rất bình thường đối với đồng bằng thời gian được đo lường và áp dụng.


Tôi nghĩ rằng đây là câu trả lời tốt nhất vì nó giải thích 'dt' có thể thay đổi rất nhiều, đó là lý do tại sao chúng ta cần nội suy các tính toán vật lý với nó.
BiAiB

Có thể đáng lưu ý rằng một vấn đề lớn với đồng bằng thời gian trong một số bối cảnh là trong nhiều trường hợp, chúng sẽ bị "tắt" bởi một khung. Nếu một cái gì đó khiến một bản cập nhật khung hình mất gấp đôi thời gian như bình thường, thì delta được áp dụng khi tính toán các hành động của khung đó sẽ là thông thường, mặc dù khung sẽ không được hiển thị cho đến khi các đối tượng được hiển thị đã di chuyển xa gấp đôi như họ đã làm Nếu thời gian giữa khung hình đó và khung hình tiếp theo nhỏ hơn bình thường (có thể xảy ra nếu bộ hẹn giờ cố gắng "bắt kịp", hai khung hình có ít thời gian hơn bình thường giữa chúng sẽ hiển thị ...
supercat

... Khoảng cách lớn hơn bình thường giữa các vị trí của đối tượng).
supercat

@supercat: Đó chỉ là cách sửa lỗi Timestep thông thường của bạn . Mặc dù vậy, bạn vẫn cần thời gian trên mỗi khung hình để biết khi nào nên thực hiện mô phỏng cố định.
Sean Middleditch

@SeanMiddleditch: Là một người đã mã hóa các trò chơi cho Atari 2600, tôi thấy điều đó theo một cách nào đó tò mò rằng không ai than thở rằng trên các hệ thống hiện đại có một độ trễ không thể tránh khỏi giữa khi người chơi di chuyển bộ điều khiển và khi nhân vật phản ứng. Trên nhiều trò chơi Atari 2600, điều khiển được thăm dò cứ sau 16,7ms và các cập nhật của người chơi xảy ra trong vòng 1-16ms (tùy theo vị trí thẳng đứng); thiết bị hiện đại không có khả năng phản ứng nhanh chóng.
supercat

32

"Delta", "d" hoặc "", có nghĩa là "sự khác biệt" trong bối cảnh toán học . Bất cứ khi nào có sự khác biệt giữa hai số có ý nghĩa tương tự nhau, sự khác biệt đó có thể được gọi là "delta" hoặc "d".

Deltas rất phổ biến trong phát triển trò chơi. Ví dụ, sự khác biệt giữa tọa độ X của một ký tự một giây trước và tọa độ X của nó bây giờ có thể được gọi là "delta x" và thường được ký hiệu là dx, delta_xhoặc d_x.

Ngoài ra, rất khác nhau khi có sự khác biệt giữa hai lần, như bạn có trong mã của mình:

var delta = now - this.time;

Trong trường hợp này, biến đó biểu thị sự khác biệt giữa thời gian được lưu trữ this.timevà thời gian được lưu trữ trong now.

Deltas thường được sử dụng để đại diện cho sự thay đổi của một cái gì đó trong thời gian. Vì vậy, ví dụ: nếu bạn biết rằng tọa độ X của người chơi nên thay đổi 5 pixel mỗi khung hình, bạn có thể lưu trữ thay đổi này dưới dạng delta:

var delta_x = 5

Và sau đó sử dụng delta đó để áp dụng thay đổi bất cứ khi nào bạn cần:

player.x = player.x + delta_x

Nhưng hãy nhớ rằng đây chỉ là một quy ước. Không ai bắt bạn phải đặt tên cho biến của mình là "delta" hoặc "d", nhưng làm như vậy có thể giúp người khác đọc mã của bạn hoặc chính bạn nếu bạn đọc nó trong tương lai, để hiểu biến đó phải làm gì.

Các chữ cái Hy Lạp phổ biến khác được sử dụng rộng rãi trong lập trình là:

Epsilon : cho một giá trị rất nhỏ. Thường được sử dụng khi so sánh dấu phẩy động hoặc các biến khác với các vấn đề chính xác:

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

Pi : cho hằng số cùng tên

Theta : đại diện cho các góc

Lambda : để đại diện cho các chức năng ẩn danh hoặc đóng cửa


1
Bạn cũng sẽ thấy các bội số nhất định của π, như 2π, π / 2, π / 4 và e (hằng số Euler).
jzx

@Thomas: Chắc chắn, bất kỳ chương trình nào có cơ sở toán học sẽ đưa ký hiệu lý thuyết vào mã. Lưu ý câu "Các chữ cái Hy Lạp phổ biến khác được sử dụng rộng rãi trong lập trình là". " Một số mã đồ họa" hầu như không đủ điều kiện là "phổ biến" hoặc "được sử dụng rộng rãi". Tôi không bao giờ tuyên bố đây là những chữ cái Hy Lạp duy nhất có thể được sử dụng, cũng không phải là những ý nghĩa duy nhất bạn có thể đặt cho những chữ cái Hy Lạp đó.
Panda Pajama

@yzx: Lần trước tôi đã kiểm tra, hằng số Euler đã sử dụng chữ cái Latin "e". Tôi đã không nói về các hằng số toán học xuất hiện trong mã, mà thay vào đó là các chữ cái Hy Lạp thường được sử dụng trong mã.
Panda Pajama

@PandaPajama Tôi đã xóa bình luận của mình vì nó không được chào đón.
Thomas

3
Nếu đồng đội của bạn đặc biệt hông, bạn thậm chí có thể nhìn thấy Tau () thay vì 2π.
Kaz Dragon

3

dtlà viết tắt của delta time. Nó được sử dụng trong tính toán tốc độ khung hình để đảm bảo trò chơi chạy ở cùng tốc độ cho dù tốc độ khung hình là bao nhiêu.

Thông tin thêm về framerate independencecó thể được tìm thấy ở đây .


3

dt (delta time) là thời gian giữa mỗi chu kỳ / khung hiển thị (hoặc bất kỳ dấu thời gian nào bạn muốn) của vòng lặp. Với thời gian delta này chúng ta có thể kéo dài các giá trị nhất định theo thời gian. Giống như trong thế giới thực, chúng ta đo các tính chất vật lý nhất định theo thời gian.

Giả sử chúng ta chạy trò chơi 60 khung hình một giây. Nếu chúng tôi muốn trình phát của mình di chuyển 5 pixel mỗi giây, chúng tôi sẽ làm

 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

hoặc là

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

Nhân vật di chuyển 5 pixel trên 60 khung hình. Chu kỳ của bạn càng mất nhiều thời gian delta sẽ nhận được.

Với mỗi tốc độ khung hình (1/30, 1/25, v.v.), kết quả sẽ giống nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.