2011-11-13 41 views
14

Tôi đã nghe nói rằng trò chơi cuộn bên trò chơi cũ đã sử dụng một chương trình hack cụ thể để cho phép di chuyển bên có hiệu suất."Di chuyển bên lề" từ trò chơi cũ là gì?

Tôi hiểu rằng năm trước các máy không đủ mạnh để sơn lại toàn bộ màn hình mỗi khung hình khi nó được thực hiện hiện nay. Có các kỹ thuật, chẳng hạn như hình chữ nhật bẩn, cho phép giảm thiểu diện tích màn hình cần thiết để sơn lại khi nền không hoạt động và chỉ các sprites di chuyển.

Cách tiếp cận trên chỉ hoạt động khi nền không thay đổi (và do đó hầu hết các pixel màn hình vẫn giữ nguyên).

Trò chơi cuộn dọc, giống như trường học cũ, có điều khó khăn hơn với nền thay đổi mọi khung hình do cuộn. Tuy nhiên, người ta có thể tận dụng lợi thế của cách các pixel được đưa vào màn hình (theo từng dòng). Tôi tưởng tượng rằng người ta có thể sử dụng một bộ đệm lớn hơn và thay đổi con trỏ dữ liệu một số dòng "xuống" mọi khung hình, do đó nó sẽ được vẽ lại từ vị trí khác, do đó tạo ấn tượng của một cuộn trơn tru. Tuy nhiên, chỉ có các sprites (và một chút nền ở cạnh của màn hình) sẽ cần phải được vẽ lại, đó là một tối ưu hóa nghiêm trọng.

Tuy nhiên, đối với trò chơi cuộn bên, điều không đơn giản và rõ ràng. Tuy nhiên, tôi biết rằng ai đó, một nơi nào đó trong quá khứ, mặc dù một tối ưu hóa (với một số hạn chế) cho phép các máy cũ để cuộn nền theo chiều ngang mà không vẽ lại nó mỗi khung.

IIRC nó được sử dụng trong nhiều trò chơi cũ, chủ yếu là up beat'em 80, cũng như trong sản xuất demoscene

Bạn có thể mô tả kỹ thuật này và đặt tên cho tác giả của nó?

+1

Hai câu trả lời không trùng lặp tuyệt vời! Tôi ước tôi có thể chấp nhận cả hai :-) – Kos

Trả lời

10

Tôi đã viết trò chơi cho C64 cũ tốt làm chính xác điều này. Và về cơ bản có hai điều cần phải nhận thức:

  1. Những trò chơi được KHÔNG sử dụng đồ họa bitmap, nhưng thay vì sử dụng "ánh xạ" phông chữ ký tự, có nghĩa là khối lượng điểm ảnh 8x8 đã thực sự hurdled xung quanh như chỉ là một byte .

  2. Điều tiếp theo cần lưu ý là có hỗ trợ phần cứng để di chuyển toàn bộ màn hình bảy pixel. Lưu ý rằng điều này không có bất kỳ cách nào ảnh hưởng đến bất kỳ đồ họa - nó chỉ làm cho tất cả mọi thứ được gửi đến TV một chút di dời.

Vì vậy, 2) có thể thực sự mượt mà cuộn 7 pixel. Sau đó, bạn di chuyển mọi ký tự xung quanh - cho toàn bộ màn hình chính xác là 1000 byte, mà máy tính có thể đối phó với, trong khi đồng thời bạn di chuyển thanh ghi cuộn trở lại 7 pixel. 8 - 7 = 1 có nghĩa là nó trông giống như bạn đã cuộn một pixel khác ... và sau đó nó tiếp tục như vậy. Vì vậy, 1) và 2) kết hợp làm cho ảo tưởng của cuộn trơn tru thực sự!

Sau đó, điều thứ ba được phát: ngắt raster. Điều này có nghĩa là CPU bị gián đoạn khi TV/màn hình sắp bắt đầu vẽ một đường quét tại một vị trí được chỉ định. Kỹ thuật đó giúp bạn có thể tạo màn hình chia nhỏ để bạn không phải cuộn màn hình toàn bộ màn hình trái ngược với mô tả đầu tiên của tôi.

Và để chi tiết hơn nữa: ngay cả khi bạn không muốn một màn hình chia nhỏ, ngắt raster rất quan trọng: bởi vì nó cũng quan trọng như hôm nay (nhưng hôm nay khung này ẩn bạn) để cập nhật màn hình vào đúng thời điểm. Sửa đổi "cuộn đăng ký" khi TV/màn hình được cập nhật ở bất kỳ đâu trên vùng hiển thị sẽ gây ra hiệu ứng gọi là "rách" - nơi bạn nhận thấy rõ ràng hai phần của màn hình là một pixel không đồng bộ với nhau.

Còn gì nữa để nói? Vâng, kỹ thuật với các bộ ký tự được ánh xạ lại làm cho nó có thể làm một số hình động rất dễ dàng. Ví dụ băng tải và bánh xe răng cưa và các thứ có thể hoạt hình bằng cách liên tục thay đổi diện mạo của "nhân vật" đại diện cho chúng trên màn hình. Vì vậy, băng tải kéo dài toàn bộ chiều rộng màn hình có thể trông giống như nó đang quay vòng ở khắp mọi nơi bằng cách chỉ thay đổi một byte đơn trong bản đồ ký tự.

+0

Rất tốt. Tôi đã thử một cái gì đó như thế này trên một máy tính, nhưng đã bị cản trở bởi chỉ có thể đặt 256 "nhân vật" khác nhau trong một bộ. –

+0

cũng có một lá cờ trong chip video của C64 để thu nhỏ màn hình theo chiều ngang của một ký tự, do đó bạn sẽ không nhận thấy ký tự phụ hiện đang được cuộn. –

+0

@yi_H khá như vậy. Bây giờ bạn đang thực sự thành chi tiết! :-) –

8

Tôi đã làm điều gì đó tương tự như cách quay lại vào những năm 90, sử dụng hai cách tiếp cận khác nhau.

Người đầu tiên tham gia "cửa sổ", được hỗ trợ bởi tiêu chuẩn VESA SVGA. Một số thẻ được triển khai chính xác. Về cơ bản, nếu bạn có bộ đệm khung hình/video RAM lớn hơn vùng có thể hiển thị, bạn có thể vẽ một bitmap lớn và cung cấp tọa độ hệ thống cho một cửa sổ trong khu vực mà bạn muốn hiển thị. Bằng cách thay đổi các tọa độ đó, bạn có thể di chuyển xung quanh mà không phải điền lại bộ đệm khung.

Phương pháp khác dựa vào thao tác phương pháp BLT được sử dụng để đưa khung hoàn chỉnh vào bộ đệm khung. Việc đánh một trang vào bộ đệm khung có cùng kích thước với màn hình rất dễ dàng và hiệu quả.

tôi thấy cũ 286 mã này lắp ráp (trên hoạt mềm cũ 17 năm!) Mà sao chép một màn hình 64000 byte (320x200) từ một trang tắt màn hình để bộ đệm video:

Procedure flip; assembler; 
    { This copies the entire screen at "source" to destination } 
    asm 
     push ds 
     mov  ax, [Dest] 
     mov  es, ax 
     mov  ax, [Source] 
     mov  ds, ax 
     xor  si, si 
     xor  di, di 
     mov  cx, 32000 
     rep  movsw 
     pop  ds 
    end; 

Các rep movsw di chuyển từ CX (trong đó một từ là hai byte trong trường hợp này). Điều này rất hiệu quả vì nó cơ bản là một lệnh duy nhất để cho CPU di chuyển toàn bộ mọi thứ càng nhanh càng tốt.

Tuy nhiên, nếu bạn có bộ đệm lớn hơn (giả sử, 1024 * 200 cho một bên cuộn), bạn có thể dễ dàng sử dụng vòng lặp lồng nhau và sao chép một hàng pixel mỗi vòng. Trong bộ đệm rộng 1.024 pixel, ví dụ, bạn có thể sao chép byte:

start   count    
0+left   320 
1024+left  320 
... 
255*1024+left 320 

nơi left là tọa độ x trong hình nền lớn mà bạn muốn bắt đầu (phía bên trái của màn hình). Tất nhiên, ở chế độ 16-bit, một số phép thuật và thao tác của con trỏ phân đoạn (ES, DS) được yêu cầu để có bộ đệm lớn hơn 64KB (trên thực tế, nhiều bộ đệm 64k liền kề), nhưng nó hoạt động khá tốt.

Có thể có những giải pháp tốt hơn cho vấn đề này (và chắc chắn là những giải pháp tốt hơn để sử dụng ngày nay), nhưng nó có hiệu quả đối với tôi.

2

Trò chơi điện tử thường có các chip video tùy chỉnh hoặc logic rời rạc để cho phép cuộn mà không cần CPU phải thực hiện (nhiều) công việc. Cách tiếp cận sẽ tương tự như những gì danbystrom mô tả trên C-64.

Về cơ bản phần cứng đồ họa đã xử lý các ký tự cuộn (hoặc lát) và CPU sau đó xử lý thay thế tất cả các ô khi thanh ghi cuộn đã đạt đến giới hạn của chúng.Tôi hiện đang nhìn vào bảng Irem-mrem 52 mà giao dịch với nhiều hình nền cuộn trong phần cứng. Sơ đồ có thể được tìm thấy trực tuyến.

1

Để cuộn phải trên Commodore Amiga, chúng tôi đã sử dụng Đồng để dịch chuyển màn hình lên đến 16 pixel. Khi màn hình đã chuyển, chúng tôi đã thêm 2 byte vào địa chỉ bắt đầu của bộ đệm màn hình trong khi ở bên phải, chúng tôi đã sử dụng Blitter để sao chép đồ họa từ bộ nhớ chính sang bộ đệm màn hình. Chúng tôi sẽ đặt bộ đệm màn hình lớn hơn một chút so với chế độ xem màn hình để chúng tôi có thể sao chép đồ họa mà bạn không thấy hiệu ứng nhấp nháy từ việc sao chép ở phía bên phải của chế độ xem.

Các vấn đề liên quan