Làm thế nào để các thiết bị như Game Boy Advance đạt được tốc độ khung hình của chúng?


31

Tôi đã thiết kế thiết bị chơi game cầm tay của riêng mình dựa trên bộ vi điều khiển AVR và màn hình OLED nhỏ.

Tôi bắt đầu với màn hình đơn sắc 128x64 pixel và có thể thoải mái vẽ lên nó với tốc độ hơn 60 khung hình mỗi giây.

Gần đây tôi đã làm lại nó để sử dụng OLED RGB, 128x128 pixel mà không thực sự suy nghĩ quá nhiều chỉ để tìm thấy tôi chỉ có thể đạt được khoảng 4 FPS. Sau một vài suy nghĩ và tái cấu trúc cẩn thận, tôi có thể đạt được điều đó lên tới ~ 12fps nếu tôi không quan tâm quá nhiều đến việc làm bất cứ điều gì khác!

Câu hỏi của tôi là - làm thế nào mà một thiết bị như GBA (Game Boy Advance) đạt được tốc độ khung hình gần 60fps? Tôi đã nghĩ về việc có một 'bộ xử lý đồ họa' riêng biệt nhưng nhận ra rằng tôi vẫn sẽ bị tắc nghẽn khi chuyển dữ liệu hiển thị sang đó.

Tôi cũng băn khoăn về việc sử dụng giao diện song song 8 bit, hầu hết các màn hình này có xu hướng tăng tốc, có thể giúp tôi tăng tốc độ 8 lần, ngoại trừ các MCU hiện đại không có xu hướng giao diện song song phần cứng như chúng làm cho nối tiếp và bit- đập có thể sẽ ăn rất nhiều tăng tốc.

Những lựa chọn khác tồn tại?

Tôi hiện đang sử dụng ATmega1284P được kết nối với bộ điều khiển OLED SSD1306 thông qua USART-SPI. Đó là phiên bản đơn sắc.

Màn hình màu là SSD1351, ban đầu không được kết nối với SPI phần cứng. Tôi không tin nó sẽ tạo ra đủ khác biệt, nó chỉ quá chậm nói chung

Tôi biết tôi có thể nhận được MCU nhanh hơn, nhưng tôi muốn biết những tùy chọn khác tôi có thể khám phá - bộ xử lý GBA chậm hơn nhiều so với 1284 của tôi!


6
"Tôi vẫn sẽ bị tắc nghẽn khi chuyển dữ liệu hiển thị sang đó." DSI có bốn làn mỗi làn lên tới 1,2Gbits / giây. Tôi để phần còn lại của tính toán cho bạn.
Oldfart 17/12/18

1
Giống như bất kỳ đồ họa nào trong bất kỳ thiết bị trò chơi video nào, có bộ nhớ sẽ xử lý đồ họa. Theo trang web này , có một vị trí địa chỉ cho đồ họa, âm thanh, vv Các hướng dẫn sẽ được lưu trữ ở đó. Giả sử không có nhiều dữ liệu sẽ tạo ra xung đột với thời gian thực hiện, nó sẽ chạy các hướng dẫn đó để tải dữ liệu đồ họa một cách dễ dàng.
KingDuken 17/12/18

5
mua màn hình mà không có bộ điều khiển trên đó và tạo bộ điều khiển của riêng bạn
old_timer 17/12/18

4
@immibis: Hầu như chắc chắn một số bộ điều khiển dựa trên I2C- hoặc SPI khủng khiếp. Công cụ của người chơi có đầy đủ các công cụ chậm quá mức như thế khi bạn có thể nhận được màn hình iPhone 400+ dpi với giá 20 đô la vì quy mô kinh tế.
R ..

6
@R .. Tôi chỉ muốn chỉ ra rằng lý do cho các bộ điều khiển sở thích này là để chúng có thể giao tiếp với hầu hết mọi bộ xử lý, vì bạn làm cho nó có vẻ như chúng vô dụng. Bạn hoàn toàn không thể giao tiếp với màn hình iPhone. Nó có thể kết nối với một bộ xử lý đồ họa chuyên dụng và có thể tùy chỉnh.
dùng253751

Câu trả lời:


64

Các câu trả lời khác bao gồm câu hỏi của bạn khá tốt ở mức độ trừu tượng (phần cứng), nhưng đặc biệt có kinh nghiệm thực tế với GBA, tôi nghĩ rằng một lời giải thích chi tiết hơn có thể có giá trị trong khi.

GBA có nhiều chế độ vẽ và cài đặt có thể được sử dụng để kiểm soát cách bộ xử lý đồ họa diễn giải RAM video, nhưng có một điều không thể giải thích được: tốc độ khung hình. Bộ xử lý đồ họa đã vẽ lên màn hình theo một vòng lặp liên tục gần như (nhiều hơn về điều này bên dưới). (Đây có thể là bit phù hợp nhất cho câu hỏi của bạn.)

Nó sẽ vẽ một dòng tại một thời điểm nghỉ rất ngắn giữa mỗi dòng. Sau khi vẽ đường cuối cùng cho khung, nó sẽ mất khoảng thời gian bằng khoảng thời gian để vẽ 30 ​​dòng. Sau đó bắt đầu lại. Thời gian của mỗi dòng và thời gian của mỗi khung đều được xác định trước và đặt trong đá. Theo nhiều cách, bộ xử lý đồ họa thực sự là bậc thầy của hệ thống đó và bạn cần phải viết các trò chơi của mình xung quanh hành vi của nó, bởi vì nó sẽ tiếp tục làm những gì nó đã làm dù bạn đã sẵn sàng hay chưa.

Khoảng 75-80% thời gian nó đang tích cực đẩy lên màn hình. Tốc độ khung hình nào bạn có thể thực hiện nếu bạn đang làm như vậy?

80% thời gian đó cũng là những gì CPU phải xử lý đầu vào của người dùng, tính toán trạng thái trò chơi và tải các họa tiết / ô xếp vào các khu vực VRAM hiện đang tắt màn hình (hoặc ít nhất là không bao gồm trong dòng hiện tại được vẽ).

20% giữa các khung, là tất cả CPU phải điều chỉnh cài đặt video hoặc RAM sẽ ảnh hưởng đến toàn bộ khung hình tiếp theo.

Ở cuối mỗi dòng, bộ xử lý đồ họa sẽ gửi một ngắt đồng bộ hóa dòng đến CPU. Ngắt này có thể được sử dụng để điều chỉnh cài đặt trên một vài họa tiết hoặc một vài lớp nền (đây là cách bạn có thể tạo hiệu ứng như đèn chiếu hình nón, bằng cách thay đổi kích thước và vị trí của một trong các mặt nạ hình chữ nhật giữa mỗi đường được vẽ. đối với phần cứng thì tất cả các vùng đó đều là hình chữ nhật.). Bạn phải cẩn thận để giữ các bản cập nhật này nhỏ và hoàn thành trước khi bộ xử lý đồ họa bắt đầu vẽ dòng tiếp theo hoặc bạn có thể nhận được kết quả xấu. Bất kỳ thời gian nào để xử lý các ngắt này cũng cắt giảm 80% thời gian xử lý của CPU ...

Đối với các trò chơi tận dụng tối đa hệ thống này, cả CPU và bộ xử lý đồ họa đều không nghỉ ngơi thực sự; mỗi người đang đuổi theo người khác xung quanh vòng lặp cập nhật những gì người kia hiện không nhìn vào.


5
Chào mừng và cũng đặt.
Mindwin

2
Một số hệ thống "mới hơn" như Nintendo DS đã khắc phục được giới hạn tốc độ khung hình cố định bằng cách thêm thanh ghi VCOUNT để trì hoãn khung tiếp theo trong một khoảng thời gian có thể định cấu hình (thường để giúp đồng bộ hóa trò chơi nhiều người chơi).
rừng

21

Tính năng chính của tất cả các máy chơi game phân biệt chúng với PC đời đầu và hầu như tất cả các máy tính gia đình (1) là các phần cứng .

Hướng dẫn lập trình GBA được liên kết cho thấy cách chúng hoạt động theo quan điểm của bộ xử lý chính. Bitmap đại diện cho người chơi, nền, kẻ thù, vv được tải vào một vùng của bộ nhớ. Một khu vực khác của bộ nhớ chỉ định vị trí của các họa tiết. Vì vậy, thay vì phải ghi lại tất cả RAM video mỗi khung hình, cần rất nhiều hướng dẫn, bộ xử lý chỉ phải cập nhật vị trí của các họa tiết.

Bộ xử lý video sau đó có thể làm việc theo pixel theo pixel để xác định sprite nào sẽ vẽ tại điểm đó.

Tuy nhiên, điều này đòi hỏi RAM hai cổng được chia sẻ giữa hai người và tôi nghĩ trong GBA, bộ xử lý video nằm trên cùng chip với bộ xử lý chính ARM và Z80 chính.

(1) Ngoại lệ đáng chú ý: Amiga


Chỉ có một nit - các game arcade thực sự ban đầu có các sprite trong ROM được liên kết với bộ xử lý đồ họa, không phải RAM hai cổng. Tôi không có đầu mối nếu đó cũng là trường hợp với bảng điều khiển ban đầu, mặc dù nó chắc chắn có thể được thực hiện theo cách đó.
TimWescott

@TimWescott GBA đã có nhiều chế độ vẽ và tôi không có kinh nghiệm với hầu hết vì vậy điều này có thể không đúng sự thật nhưng, tôi không nghĩ bất kỳ chế độ nào trong số đó có quyền truy cập trực tiếp vào ROM (trên hộp mực): Điển hình là tất cả dữ liệu gạch / sprite / bảng màu phải được chuyển từ ROM sang bộ nhớ video và bộ xử lý đồ họa hoạt động trên đó từ đó.
Mr.Mindor 17/12/18

@ Mr.Mindor Xin lỗi nếu tôi không rõ ràng - Tôi không giả vờ hiểu biết về cách GB hoặc GBA đã làm điều đó. Tôi chỉ bình luận về các game arcade thực sự sớm của Nintendo hồi cuối thập niên 70 và đầu thập niên 80, khiến tất cả chúng tôi tự hỏi làm thế nào trong h *** họ đã làm điều đó.
TimWescott

@TimWescott: Tôi nghĩ điều tương tự cũng đúng với NES, mặc dù ROM được đề cập nằm trong Game Paks.
supercat

19

"Câu hỏi của tôi là - làm thế nào một thiết bị như GBA đạt được tốc độ khung hình gần 60fps?"

Để trả lời câu hỏi, họ đã làm nó với một bộ xử lý đồ họa. Tôi khá chắc chắn rằng Game Boy đã sử dụng đồ họa sprite. Ở mức cao nhất, điều đó có nghĩa là bộ xử lý đồ họa được tải những thứ như hình nền, và hình ảnh của Mario, và hình ảnh của Princess Peach, v.v. Sau đó, bộ xử lý chính đưa ra các lệnh như "hiển thị phần bù nền bằng cách này nhiều trong x và y, lớp phủ hình ảnh Mario # 3 ở vị trí x, y này ", v.v. Vì vậy, bộ xử lý chính hoàn toàn không quan tâm đến việc vẽ từng pixel và bộ xử lý đồ họa hoàn toàn không quan tâm đến việc tính toán trạng thái của trò chơi. Mỗi cái được tối ưu hóa cho những gì nó cần làm, và kết quả là một trò chơi video khá tốt mà không cần sử dụng nhiều sức mạnh tính toán.


7
Gọi nó là "bộ xử lý đồ họa" phóng đại những gì nó làm, cho thấy nó là một loại CPU của riêng nó. Nó chỉ là một bộ điều khiển video, về cơ bản là một loại trình sắp xếp phức tạp. Khi nó đếm các pixel ngang và dọc, nó tìm nạp dữ liệu tiêu đề và / hoặc sprite, đặt chúng vào các thanh ghi thay đổi và kết hợp đầu ra của các thanh ghi thay đổi thành một pixel đầu ra. Nó không có khả năng chạy một chương trình như bộ xử lý đồ họa "GPU" thực sự.
Ross Ridge

14

GBA có bộ xử lý khá chậm. ARM7 rất đẹp; họ chỉ chạy nó chậm và không có tài nguyên.

Có một lý do tại sao rất nhiều game Nintendo vào thời điểm đó và trước đó là các game cuộn bên. PHẦN CỨNG. Tất cả được thực hiện trong phần cứng. Bạn đã có nhiều lớp gạch cộng với một hoặc nhiều họa tiết và phần cứng đã làm tất cả công việc để trích xuất pixel từ các bảng đó và điều khiển màn hình.

Bạn xây dựng các ô được thiết lập ở phía trước và sau đó có một bộ nhớ nhỏ đó là bản đồ ô. Bạn muốn gạch dưới bên trái là gạch 7? Bạn đặt số 7 vào vị trí bộ nhớ đó. Bạn muốn gạch tiếp theo là gạch 19? Trong tập hợp ô, bạn đặt 19 ở đó, và cứ thế cho mỗi lớp mà bạn đã bật. Đối với sprite, bạn chỉ cần đặt địa chỉ x / y. Bạn cũng có thể thực hiện chia tỷ lệ và xoay bằng cách đặt một số thanh ghi và phần cứng sẽ đảm nhiệm phần còn lại.

Chế độ 7, nếu tôi nhớ đúng, là chế độ pixel, nhưng nó giống như một thẻ video truyền thống nơi bạn đặt các byte trong đó bao phủ màu cho pixel và phần cứng đảm nhiệm việc làm mới video. Tôi nghĩ rằng bạn có thể ping pong hoặc ít nhất là khi bạn có một khung hình mới, bạn có thể lật chúng, nhưng tôi không nhớ đúng. Một lần nữa, bộ xử lý đã được ép xung khá nhiều cho ngày và tuổi đó và không có quá nhiều tài nguyên nhanh. Vì vậy, trong khi một số trò chơi ở chế độ 7, rất nhiều trò chơi cuộn bên cạnh ...

Nếu bạn muốn một giải pháp có tốc độ khung hình cao, bạn cần thiết kế giải pháp đó. Bạn không thể lấy bất kỳ màn hình cũ nào bạn tìm thấy và nói chuyện với nó thông qua SPI hoặc I²C hoặc một cái gì đó tương tự. Đặt ít nhất một bộ đệm khung trước nó, lý tưởng là hai và có kiểm soát hàng và cột nếu có thể trên màn hình đó.

Một số màn hình tôi nghi ngờ bạn mua có một bộ điều khiển trên chúng mà bạn thực sự đang nói chuyện. Nếu bạn muốn hiệu suất loại GBA / bàn điều khiển, bạn tạo / thực hiện bộ điều khiển. Hoặc bạn mua / xây dựng với GPU / chip video / blob logic và sử dụng HDMI hoặc giao diện chung khác vào màn hình chứng khoán.

Chỉ vì một chiếc xe đạp có lốp và xích và bánh răng không có nghĩa là nó có thể đi nhanh như xe máy. Bạn cần thiết kế hệ thống để đáp ứng nhu cầu hiệu suất của bạn, từ đầu đến cuối. Bạn có thể đặt bánh xe đạp đó lên xe máy đó, nhưng nó sẽ không hoạt động như mong muốn; tất cả các thành phần phải là một phần của thiết kế tổng thể.

Các tiểu hành tinh cũng hoạt động theo cách này; nó chỉ cần một 6502. Đồ họa vector được thực hiện với logic riêng biệt; 6502 đã gửi một chuỗi dữ liệu nhỏ đến bộ điều khiển đồ họa véc tơ, sử dụng ROM và dữ liệu đó để thực hiện âm mưu xy của chùm tia và z, bật / tắt ... Một số standup có bộ xử lý riêng biệt để xử lý âm thanh và video tách biệt bộ xử lý tính toán trò chơi. Tất nhiên ngày nay video được xử lý bởi hàng trăm, nếu không phải hàng ngàn bộ xử lý tách biệt với bộ xử lý chính ...


Tôi thề là tôi nhớ chế độ7 bị đánh cắp bởi tiếp thị như là một phản ứng với "chế độ siêu" của Sega hoặc một cái gì đó ... có thể là "Super FX?" vi.wikipedia.org/wiki/Mode_7
Caleb Jay

coranac.com/tonc/text/bitmaps.htm#sec-modes Tôi có thể nhớ nó sai tôi đang nghĩ đến việc có lẽ chế độ 5, hoặc một trong các chế độ bitmap, có một số chế độ gạch với sprites và bitmap mode / đệm khung hoặc chế độ . có thể có một 7. không biết về người bạn liên kết nhưng đó là điều tốt để biết.
old_timer

hmm đọc thêm về chế độ 7 và nó không chỉ là một chế độ. Dù sao, GBA có các chế độ ô và chế độ bitmap chậm hơn vì bạn phải chịu trách nhiệm cho mọi pixel trong đó các chế độ ô vuông một byte trong bản đồ ô vuông tạo ra nhiều pixel. Họ cũng tận dụng kích thước của các bus (chiều rộng) và tốc độ của bộ nhớ, và một thứ bộ nhớ cache của đường ống rom để giúp đưa các công cụ (hướng dẫn) ra khỏi rom nhanh hơn một chút. Nhưng từ ngày đầu tiên, bạn đã phải vật lộn để có được phần mềm để chạy ở tốc độ khá và rất may logic đã đảm nhiệm hầu hết các công việc video.
old_timer

Nếu bạn nhìn vào những màn hình mà bạn đang mua có các giao diện 8 bit hoặc 4 bit hoặc spi hoặc i2c song song này theo cách của bạn để thực hiện, bạn muốn màn hình thô không có các bộ điều khiển đó và sau đó bạn có thể kiểm soát cách quản lý màn hình , xây dựng một hoặc hai bộ đệm khung để bạn có thể ping / pong và giao diện nhanh từ cpu của bạn đến bộ đệm khung. giả sử bạn bắt đầu với màn hình đủ nhanh ở vị trí đầu tiên.
old_timer

7

Làm thế nào mà một thiết bị như GBA đạt được tốc độ khung hình gần 60fps?

Phần cứng.

Nó có bộ nhớ đồ họa, có thể có hoặc không chia sẻ cùng bus với bộ nhớ chương trình / dữ liệu ... nhưng điều quan trọng là nó có bộ xử lý đồ họa đọc bộ nhớ 60 lần mỗi giây và gửi dữ liệu tới LCD bằng cách sử dụng giao diện tối ưu được thiết kế để làm điều này một cách hiệu quả.

Bạn có thể làm tương tự với bất kỳ bộ vi điều khiển hiện đại nào được trang bị thiết bị ngoại vi "giao diện LCD", ví dụ LPC4330 mặc dù điều này có thể quá mức cần thiết. Tất nhiên bạn sẽ cần một màn hình LCD tương thích.

Với các bộ vi điều khiển nhanh hiện đại (ví dụ, ARM không phải là AVR) và một màn hình nhỏ như vậy, có lẽ bạn sẽ không cần các họa tiết hoặc bộ làm mờ để tăng tốc các hoạt động đồ họa. Với một AVR 8 bit, nó có thể bị chậm.

Nhưng không có vấn đề với cpu, bit đập giao diện vào màn hình sẽ bị hút.

Tôi tin rằng Atari 2600 đã sử dụng CPU đập mạnh để gửi hình ảnh lên TV. Đó là một chút lỗi thời.


Ngay cả 2600 cũng có các phần cứng, mặc dù số lượng rất hạn chế (tôi nghĩ là hai người chơi và hai viên đạn)
pjc50

2
@ pjc50, Atari 2600 loại sprites phần cứng đã có. Giống như mọi phần khác của hệ thống con đồ họa, chúng là các đối tượng một chiều. Nếu lập trình viên muốn một cái gì đó ngoài một tập hợp các đường thẳng đứng, chương trình cần cập nhật các họa tiết sau khi mỗi hàng được vẽ lên màn hình.
Đánh dấu

1
@Mark: 2600 chắc chắn có các phần cứng. Phần cứng chỉ kiểm soát định vị ngang, nhưng các họa tiết trên 2600 giúp các trò chơi có thể tạo ra các trò chơi có màu sắc hơn nhiều so với bất kỳ đối thủ nào.
supercat
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.