Có phải tất cả các trò chơi được thực hiện bằng cách vẽ từng khung hình?


60

Tôi là người mới bắt đầu học về hoạt hình máy tính (cho các trò chơi). Cho đến nay, phương pháp duy nhất mà tôi đã bắt gặp là vẽ từng khung hình, mỗi khung hình cập nhật. Vì vậy, khi bắt đầu mọi khung hình, toàn bộ khung hình sẽ bị xóa, và sau đó những thứ cần thiết cho khung hình đó được vẽ lại.

Câu hỏi của tôi là liệu phương pháp này có phải là phương pháp duy nhất được sử dụng để tạo hoạt hình và trò chơi hay không. Có vẻ như nó là một chút không hiệu quả. Tôi cũng không hiểu phương pháp này sẽ hoạt động như thế nào đối với các trò chơi 3d . Ai đó có thể vui lòng giải thích điều này chi tiết hơn?


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Josh

John Carmack gần như đã phát minh ra cách tiếp cận trên PC để thực hiện cuộn toàn màn hình bằng cách chỉ vẽ một lát dọc mỏng của màn hình đã thay đổi. PC đơn giản là không thể cập nhật màn hình toàn màn hình đủ nhanh nếu không có kỹ thuật này. Ông đã sử dụng điều này trên nhiều game 2d vào đầu những năm 90 như Commander Keen. Đọc "Masters of Doom" để biết thêm.
Tro

Câu trả lời:


68

Các trò chơi rất cũ đã sử dụng một kỹ thuật trong đó chỉ những phần của khung được vẽ lại đã thay đổi trên khung đó. Những gì tôi có thể nhớ, trò chơi "Little Big Adventure" sử dụng kỹ thuật này (1994). Nhưng bạn có thể thấy rằng trò chơi này hầu hết thời gian là một camera tĩnh. Chỉ khi bạn di chuyển ra khỏi khu vực có thể nhìn thấy, cảnh mới được vẽ lại. Nếu bạn chơi trò chơi, bạn cũng sẽ nhận thấy một độ trễ nhỏ trên khung đó. Trên các GPU hiện đại với các công cụ trò chơi hiện đại, mọi thứ đã thay đổi. Tất cả mọi thứ được vẽ lại trên mỗi khung. Tùy thuộc vào kỹ thuật kết xuất, mọi thứ thậm chí có thể được kết xuất nhiều lần. Khả năng tính toán của GPU chỉ cực kỳ cao khi bạn sử dụng nó một cách chính xác. Nhưng tái sử dụng đang xảy ra. Ví dụ, một công cụ có thể quyết định chỉ cập nhật bản đồ bóng mỗi khung hình thứ 5. Hoặc ánh sáng không được cập nhật miễn là không có thay đổi trong nguồn sáng.


23
Đó không chỉ là những trò chơi cũ. Tại EA, đã có một nỗ lực để giảm mức sử dụng pin máy tính xách tay cho một số trò chơi "thông thường" nhất định và một kỹ thuật là chỉ vẽ lại các phần của màn hình. Đôi khi bạn có thể thấy điều này trong The Sims 3 nếu bạn để máy ảnh đứng yên và một chiếc sim đi ngang qua màn hình, đôi khi sẽ xảy ra lỗi khi vẽ lại không đủ lớn và bạn sẽ thấy các pixel bị bỏ lại phía sau màn. Bạn chỉ cần di chuyển máy ảnh một chút để buộc vẽ lại đầy đủ và dòng sẽ biến mất.
Kevin Phí

12
Rất cũ .. 1994 ... Bây giờ tôi cảm thấy già ...
kể cả

4
@ hoàn toàn cũ về thuật ngữ chơi game. Hãy nhớ rằng chúng tôi đã chuyển từ các đốm pixel 8 bit sang hiện thực ảnh (trong các đoạn cắt cảnh được kết xuất sẵn nếu không phải là hành động trực tiếp) chỉ trong 20 ~ 30yrs.
Jared Smith

16

Không.

Ít nhất nếu bạn bao gồm các trò chơi cũ từ những năm 70 đã sử dụng màn hình vector.

Ví dụ, trò chơi Asteroid được biết đến rộng rãi, ban đầu được phát triển cho màn hình vector, một cách khác nhau về cơ bản để hiển thị đồ họa lên màn hình.

Màn hình vectơ cũng được sử dụng bởi một số trò chơi arcade từ cuối những năm 1970 đến giữa những năm 1980 như Asteroid, Tempest và Star Wars. Atari sử dụng thuật ngữ Quadrascan để mô tả công nghệ khi được sử dụng trong các trò chơi video của họ.

https://en.wikipedia.org/wiki/Vector_monitor

Đồ họa thời hiện đại được tạo ra khá nhiều 100% cho rasterizaton, theo định nghĩa, ghi nội dung của bộ đệm đồ họa vào màn hình mỗi khung hình.


7
Hiển thị vector thậm chí không rõ ràng có một "khung".
hobbs

2
@hobbs Đúng, điều này làm cho câu trả lời của tôi vẫn đúng vì câu trả lời cho "Có phải tất cả các trò chơi được tạo bằng cách vẽ từng khung hình?" là "Không, thậm chí không phải tất cả các trò chơi được vẽ dựa trên khung."
Sandy Chapman

1
tuy nhiên, trong một ý nghĩa sâu sắc hơn, câu hỏi là về việc liên tục vẽ tất cả các mục có thể nhìn thấy, không chỉ các mục di chuyển và đối với hầu hết các vectơ hiển thị, câu trả lời vẫn là "có" (ống lưu trữ hình ảnh sẽ là một ngoại lệ)
szulat

@szulat theo cách đó là sự thật, nhưng công bằng mà nói, nó vẫn không rút ra những khoảng trống nơi màn hình hiển thị màu đen. Nó chỉ làm mới các mục hiển thị trên màn hình. Tức là trong các tiểu hành tinh, nó chỉ vẽ lại con tàu và các tiểu hành tinh còn lại trên màn hình.
Sandy Chapman

@SandyChapman và ở một cấp độ khác, thực sự có rất ít sự khác biệt. một trò chơi cập nhật bộ nhớ màn hình hoặc các họa tiết khi có gì đó thay đổi. mặt khác, phần tương ứng của màn hình vẫn tĩnh. điều này đúng cho cả hệ thống raster và vectơ - các tiểu hành tinh, bộ xử lý làm mới màn hình từ bộ nhớ màn hình (vector!) mà không làm phiền cpu, tương tự như cách phần cứng phổ zx tạo tín hiệu video raster của nó. cho dù chùm crt thực hay ảo đang vẽ đa giác hoặc quét màn hình theo một mẫu cố định, là thứ yếu.
szulat

11

Ở mức thấp nhất, bộ xử lý đồ họa trên máy của bạn thực sự sẽ tính toán từng khung hình từ đầu và gửi nó đến màn hình của bạn. Tuy nhiên, bạn sẽ chỉ được tiếp xúc với điều này, nếu bạn tự mình quản lý công cụ cấp thấp này [1] Bất kỳ công cụ đồ họa nào (và với điều đó, trò chơi-) sẽ xử lý những việc này cho bạn và bạn có thể tự do thể hiện cảnh trong điều kiện của nhiều thực thể mà bạn có thể sửa đổi giữa các khung, nhưng sẽ liên tục.

... phương pháp này sẽ hoạt động như thế nào đối với các trò chơi 3d ...

Các yếu tố trong không gian 3D vẫn tồn tại, một lần nữa, công cụ đồ họa sẽ tính toán lại hình ảnh trên màn hình của bạn cho bất kỳ thay đổi nào xảy ra (chuyển động của camera, v.v.)

[1] ... ví dụ nếu bạn viết công cụ của riêng mình [2] bằng một cái gì đó như OpenGL. Ngay cả trong trường hợp đó, bạn có thể sẽ lưu trữ những thứ liên tục giữa các khung.

[2] Đây không phải là một lựa chọn ở cấp độ kỹ năng hiện tại của bạn.


Bạn có tham khảo để hỗ trợ "bộ xử lý đồ họa trên máy của bạn thực sự sẽ tính toán từng khung hình từ đầu" không?
Kromster

@Kromster: Đây chủ yếu là một điều hiệu quả. Vì mỗi khung có thể yêu cầu tính toán đầy đủ và không chắc chắn chính xác phần nào không nên, bạn sẽ cần một phép tính đắt tiền để xác định chính xác bit nào có thể được lưu. Ngay cả khi nó sẽ là một cải tiến hiệu suất ròng, nó sẽ dẫn đến tốc độ khung hình không nhất quán.
MSalters

@MSalters cách nó được đặt ra, mâu thuẫn với nhiều điểm trong nhiều câu trả lời hàng xóm.
Kromster

Tôi muốn nói rằng "bộ xử lý đồ họa trên máy của bạn thực sự sẽ tính toán từng khung hình từ đầu" về mặt kỹ thuật là không đúng sự thật. GPU tính toán chính xác những gì bạn nói với nó. Nếu bạn muốn nó sử dụng lại khung trước đó, thì nó sẽ (thực sự, đó là mặc định của nó). Nhiều công cụ trò chơi hiện đại (và thậm chí GUI GUI của hệ điều hành) chọn bắt đầu lại từ đầu (trong đó khung trước đó chỉ được hiển thị nếu khung mới không hoàn thành kết xuất kịp thời), nhưng chúng không phải.
Ove

Tôi thậm chí không chắc chắn điều gì sẽ tạo thành một tham chiếu cho "màn hình phải bị xóa", nhưng có một tham chiếu về cách hiển thị khung hình trong Doom: adriancourreges.com/blog/2016/09/09/doom-2016- nghiên cứu đồ họa ; đừng quên rằng một card đồ họa cao cấp vừa phải sẽ có thể quản lý hàng nghìn tỷ phép tính mỗi giây, vài nghìn mỗi pixel.
pjc50

2

Câu trả lời ngắn gọn: Không.

Câu chuyện dài:

Khi tôi học một số chương trình trò chơi ở trường, chúng tôi được dạy làm như sau:

Quyết định tốc độ khung hình / giây mà chúng tôi muốn trong trò chơi (ví dụ 30).

Viết một số mã thêm 1 vào một bộ đếm cho mỗi khoảng (33 msec trong 30 khung hình / giây). Mã này chạy đồng thời với vòng lặp trò chơi.

Sau đó, vòng lặp trò chơi thực hiện các tính toán cho trò chơi (cập nhật trạng thái trò chơi) sẽ giảm cùng một bộ đếm cho mỗi khung hình. Nhưng các tính toán đồ họa và vẽ lên màn hình sẽ chỉ được thực hiện nếu bộ đếm ở mức 0.

Kết quả là tốc độ khung hình đồ họa sẽ điều chỉnh tùy thuộc vào mức độ cpu xử lý các tính toán trong trò chơi. Khi không có quá nhiều điều xảy ra trong trò chơi, việc tính toán rất dễ dàng và tốc độ khung hình đồ họa sẽ cao hơn so với cập nhật trạng thái trò chơi thực tế (về cơ bản lãng phí chu kỳ vì chúng ta vẽ cùng một trạng thái trò chơi nhiều lần trên màn hình).

Nhưng sau đó, có rất nhiều điều đang xảy ra trong trò chơi, cpu sẽ có nhiều việc phải làm hơn và các cập nhật trạng thái trò chơi sẽ được ưu tiên hơn so với vẽ trên màn hình.

Hầu hết thời gian, trò chơi sẽ tiếp tục cập nhật với tốc độ dự định, nhưng sẽ xuất hiện "lag" vì bạn sẽ không thấy mỗi bản cập nhật trên màn hình. Điều này có thể thích hợp hơn khi toàn bộ trò chơi bị chậm lại vì bạn buộc nó phải rút ra từng bản cập nhật trên màn hình.

Tất cả điều này được thực hiện với C ++ và không có công cụ trò chơi, cũng như card đồ họa. Tất cả mọi thứ chạy trên một cpu lõi đơn. Chúng tôi đã sử dụng một số thư viện cho đồ họa 2d.


1
Tôi nhớ trò chơi "Rìu vàng". Khi chơi trên 8086, trò chơi chậm hơn và dễ xử lý hơn nhiều so với chơi trên 286, ví dụ như mọi thứ di chuyển nhanh hơn. Chỉ cần FYI.
akostadinov

0

Trước khi người ta có thể nói liệu trò chơi video có "vẽ" màn hình ở mọi khung hình hay không, trước tiên cần xác định nghĩa là "vẽ". Chắc chắn có nhiều trò chơi video chắc chắn không phải tất cả đều vẽ mọi khung hình bằng cách lắp ráp một bitmap từ đầu; thật vậy, nhiều nền tảng chơi game không bao giờ lắp ráp bitmap đầy đủ cả .

Có một vài cách tiếp cận trò chơi video có thể thực hiện để tạo màn hình. Một số rất nhỏ có CPU bật và tắt chùm tia điện tử hoặc cho mỗi pixel hoặc, đối với các trò chơi quét vectơ, đặt tọa độ XY của mỗi dấu chấm được vẽ. Hầu hết các trò chơi làm điều này phần lớn nhằm mục đích chứng minh rằng CPU đủ nhanh. Các trò chơi thông thường hơn sẽ có phần cứng, trong trường hợp không có sự tham gia của CPU, sẽ xuất ra một số mẫu pixel hoặc vectơ để hiển thị nhiều lần. Mẫu này có thể được tạo ra bằng cách đọc dữ liệu tuần tự từ một vùng bộ nhớ và diễn giải từng bit hoặc nhóm bit dưới dạng màu pixel (cái này được gọi là hiển thị bản đồ bit). Trong một số trường hợp, phần cứng có thể đọc một byte bộ nhớ cho mỗi 8x8, 16x16, hoặc khu vực kích thước khác của màn hình và sau đó sử dụng byte đó để chọn một phạm vi bộ nhớ để đọc dữ liệu pixel (điều này thường được gọi là hiển thị bản đồ ký tự). Một số nền tảng phần cứng có thể phủ nhiều màn hình bitmap với các vị trí có thể định cấu hình. Chúng được gọi là sprite.

Một số nền tảng không cho phép thay đổi mẫu hiển thị trong khi nó được gửi đến màn hình, nhưng thay vào đó yêu cầu tất cả các cập nhật xảy ra sau khi chùm tia đã vẽ xong một khung hình nhưng trước khi nó bắt đầu vẽ tiếp theo. Trên các nền tảng như vậy, mọi thứ sẽ xuất hiện trên một khung cần phải được tải vào phần cứng màn hình trước khi bắt đầu khung đó và màn hình sẽ bị giới hạn hiển thị một mẫu có thể được thiết lập cùng một lúc. Nếu CPU ngừng chạy trong khi khung hình đang được hiển thị, thì khung hình đó sẽ tiếp tục được hiển thị vô thời hạn. Các nền tảng khác cho phép thay đổi hoặc cấu hình lại mô hình trong khi nó được vẽ lên màn hình. Điều này cho phép hiển thị một màn hình phức tạp hơn nhiều so với mạch video có thể tự xử lý.

Hầu hết các trò chơi máy tính cá nhân sử dụng phần cứng được cấu hình để vẽ một màn hình bitmap, sau đó vẽ lên màn hình đó bất cứ thứ gì cần phải khác với những gì đã có. Đôi khi có thể dễ dàng hơn để vẽ mọi thứ mà không cần quan tâm đến việc nó có thực sự cần thiết trong một trường hợp cụ thể hay không, nhưng nếu mã có thể dễ dàng nói rằng không có lý do nào để một phần của màn hình thay đổi, hiệu suất có thể được cải thiện bằng cách bỏ qua phần đó. Các nền tảng ngày nay thường đủ nhanh để chúng có thể vẽ toàn bộ màn hình nhiều lần trong suốt quá trình của một khung, nhưng trong lịch sử thì không phải vậy. Ví dụ, mã nhanh nhất có thể để ghi tất cả các pixel trên màn hình độ phân giải cao của máy tính Apple II sẽ mất nhiều hơn hai khung hình và mã nhanh nhất có thể để sao chép tất cả các pixel trên máy tính Apple II ' Màn hình độ phân giải cao từ bộ đệm khác sẽ mất gấp đôi. Để có được hiệu suất tốt đòi hỏi các trò chơi chỉ cập nhật những thứ thực sự thay đổi, và đó là những gì các trò chơi hay thường làm.


1
Tôi đã đi được nửa chừng câu trả lời này và tôi không chắc nó thực sự trả lời câu hỏi như thế nào. Đoạn đầu tiên của bạn là nói về CPU, tọa độ XY, chùm electron, byte bộ nhớ và các họa tiết - nhưng không có gì trong số này rõ ràng về việc vẽ từng khung. Đoạn thứ hai nói về các mẫu hiển thị ở độ dài, và sau đó nó mất tôi. Tôi nghĩ rằng bạn cần phải thực hiện bất kỳ phần nào của việc này về việc thực sự vẽ lại màn hình, đưa nó lên trên cùng trong một tuyên bố rõ ràng và sau đó kết nối bất cứ điều gì khác mà bạn cần nói về điều đó để giải thích những gì đang diễn ra.
doppelgreener

1
@doppelgreener: Khái niệm "vẽ" mỗi khung hình hơi mơ hồ. Một cái gì đó phải làm mọi thứ cần thiết để tạo từng khung, nhưng có nhiều cách có thể được chia cho CPU và phần cứng. Một số cách yêu cầu CPU phải được tham gia vào mọi khung hình ngay cả với các phần của màn hình xuất hiện giống nhau giữa một khung hình và khung hình tiếp theo, trong khi các cách khác thì không. Mặc dù bất kỳ trò chơi LCD hoặc CRT nào cuối cùng cũng sẽ yêu cầu một cái gì đó xuất ra mọi khung hình không trống [trò chơi sử dụng màn hình E-paper hoặc flip-dot có thể không], các hành động cần thiết có thể hoặc không được coi là "vẽ".
supercat

Tôi khuyên bạn nên bắt đầu bằng ngôn ngữ đơn giản (cho dù chúng tôi có "vẽ khung" liên tục) và làm việc lại từ đó để giải thích thêm chi tiết kỹ thuật xung quanh lý do tại sao đó không phải là một cách chính xác để đặt nó - thay vì đi sâu vào chi tiết . Bài viết của bạn cần một Tóm tắt điều hành, về cơ bản và Giới thiệu, trước khi bạn bắt đầu kiểm tra mọi thứ đến độ sâu bạn làm.
doppelgreener

-11

Nói ngắn gọn, tôi muốn nói rằng không phải tất cả các khung hình đều được vẽ mà chỉ là những khung hình được yêu cầu để trình bày câu chuyện hoặc chủ đề trò chơi hoặc trò chơi của bạn. Cộng với thời gian của những điều bạn muốn xảy ra trong một số trường hợp nhất định sẽ có vấn đề.


9
Điều này thậm chí không có ý nghĩa đối với câu hỏi được hỏi .. Tôi nghĩ rằng bạn đã nhầm lẫn "khung" cho một thứ khác ... bạn có thể bị nhầm lẫn với các yếu tố của một bảng câu chuyện? OP đặc biệt nói về các khung hình trong bối cảnh kết xuất
Trotski94
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.