Cấu trúc dữ liệu trong các trò chơi cũ


10

Tôi tò mò về các cấu trúc dữ liệu được sử dụng khi lập trình các trò chơi cũ hơn như Super Mario Brothers cho NES và Super Mario World cho SNES. Hiểu biết của tôi là các trò chơi của thời kỳ này được viết trong hội đồng. Các lập trình viên có định nghĩa / sử dụng bất kỳ cấu trúc dữ liệu nào không?

Ví dụ: khi một nhóm tiền xu xuất hiện trên màn hình chúng được lưu trữ như thế nào? Có phải các lập trình viên chỉ sử dụng mảng? Hoặc có lẽ họ đã có danh sách liên kết?

Chúc mừng!

Chỉnh sửa : Tôi quan tâm đến các phương pháp khác nhau ... không nhất thiết là một cách tiếp cận phổ quát.

Chỉnh sửa 2 : Trong một số trò chơi của tôi, tôi sử dụng cách tiếp cận (có khả năng xấu) đối với các bộ sưu tập và tôi muốn biết liệu có bất kỳ trò chơi cũ nào sử dụng cách tiếp cận tương tự không. Tôi thích làm như sau:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
Không có câu trả lời phổ quát; nó liên quan đến cách một lập trình viên nhất định thực hiện giải pháp cho một vấn đề nhất định.
Ed S.

1
Mặc dù tôi không nghĩ rằng tất cả các trò chơi đó được viết bằng cách lắp ráp, tôi sẽ nói rằng việc các lập trình viên lắp ráp thu thập các thành phần nhỏ của họ để sao chép / dán lại từ chương trình này sang chương trình khác là khá phổ biến. Bao nhiêu lần bạn muốn viết hàm printf ()? :)
James

Điểm tốt. Tôi thực sự tò mò về các bộ sưu tập được phân bổ động so với các bộ sưu tập được phân bổ tĩnh
MrDatabase

1
Làm vấn đề cụ thể những gì bạn có? Tại sao bạn quan tâm những trò chơi cũ làm gì?
Tetrad

2
Những gì bạn đã có trong lần chỉnh sửa thứ hai là một ví dụ về bố cục "cấu trúc của mảng", vẫn phổ biến ngay cả trong các trò chơi hiện đại vì nó có lợi ích cho hoạt động song song và hoạt động SIMD. Sony đã làm một bài thuyết trình một vài năm trước đây về cách C ++ cách truyền thống của cấu trúc dữ liệu có thể có nghiêm trọng ẩn Perf chi phí: research.scee.net/files/presentations/gcapaustralia09/...
Crashworks

Câu trả lời:


13

Ngay cả trong những ngày 16 bit, các máy chơi game về cơ bản chỉ là những máy tính nhúng nhỏ, chạy phần mềm thời gian thực và các cấu trúc dữ liệu chúng ta sử dụng giống như những gì bạn tìm thấy ở bất cứ đâu trong khoa học máy tính: mảng, ma trận, đống, cây. Không có nhiều danh sách được liên kết vì chúng quá chậm (tra cứu gián tiếp có độ trễ dài).

Sự khác biệt là trước STL và với hiệu suất rất quan trọng, chúng ta thường phải tự viết các cấu trúc và thuật toán!

David Braben đã có một bài giảng vui vẻ tại GDC 2011, nơi anh ấy nói về tất cả những mánh khóe điên rồ mà anh ấy đã sử dụng để phù hợp với Elite trên BBC Micro năm 1984. Bạn có thể xem nó miễn phí tại GDC Vault .


Mát mẻ. Bạn đã sử dụng mảng được phân bổ động? Hay hầu hết đã có một kích thước tĩnh? Tôi tò mò về các tình huống trong đó, năm đồng xu sẽ xuất hiện trên màn hình và vẫn ở trên màn hình cho đến khi người chơi thu thập chúng (hoặc chúng cuộn ra khỏi màn hình).
MrDatabase

2
@MrDatabase - Phân bổ tĩnh bất cứ nơi nào có thể. Đối với các trường hợp như bạn mô tả, chúng tôi thường chỉ có một mảng được phân bổ tĩnh, ví dụ 32 đồng tiền có thể tồn tại. Khi tiền xu xuất hiện trên thế giới, chúng ta sẽ lấp đầy một vị trí trong mảng. Khi họ rời đi, chúng tôi sẽ bỏ trống. Phân bổ động không có sẵn, chúng tôi chỉ tránh sử dụng nó vì khi bạn chỉ có 2 MB RAM, bạn thực sự cần phải đảm bảo chương trình của mình chạy trong bộ nhớ không đổi!
Crashworks

Mát mẻ. Tôi làm một cái gì đó tương tự (xem chỉnh sửa # 2 cho câu hỏi). Trong chức năng cập nhật của mình, tôi kiểm tra bitet "coinsActive" if(coinsActive)trước khi tôi lặp qua maxNumCoin và cập nhật. Bằng cách này, tôi hoàn toàn tránh vòng lặp nếu không có đồng tiền nào đang hoạt động.
MrDatabase

+1 vì liên kết GDC Vault. Cuộc nói chuyện Popolous sau khi chết của Peter Molyneux phải là cuộc nói chuyện vui nhộn nhất tôi từng thấy.
TravisG

MeDataBase - bạn sao chép đối tượng hoạt động cuối cùng vào vị trí bị chiếm giữ bởi một đồng tiền không hoạt động (nghĩa là nếu bạn có 10 đồng xu, đồng xu 5 trở nên không hoạt động, sao chép đồng xu 10 vào vị trí 5 và giảm số tiền số hóa) bạn chỉ có thể lặp lại để numCoin và cập nhật tất cả các yếu tố đó. Bạn sẽ không cần 'nếu'. Tất nhiên điều này chỉ hoạt động nếu các đồng tiền không hoạt động không cần duy trì trạng thái và nếu thứ tự cập nhật không quan trọng (trạng thái có thể được duy trì nếu mảng lưu trữ con trỏ đến tiền xu và không phải là đồng tiền thực tế, nhưng sau đó bạn có hành vi bộ đệm bị phân tán có khả năng tệ hơn 'nếu')
Kaj

5

Dưới đây là một cuộc thảo luận thú vị trên GameDev.net về mã nguồn Super Mario Bros: Mã nguồn Super Mario

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.