오래된 게임의 데이터 구조


10

NES 용 Super Mario Brothers 및 SNES 용 Super Mario World와 같은 오래된 게임을 프로그래밍 할 때 사용되는 데이터 구조가 궁금합니다. 나는이시기의 게임들이 집회에서 작성되었다는 것을 이해하고있다. 프로그래머가 데이터 구조를 정의 / 사용 했습니까?

예를 들어, 동전 그룹이 화면에 나타나면 어떻게 저장됩니까? 프로그래머가 방금 배열을 사용 했습니까? 아니면 연결 목록이 있었습니까?

건배!

편집 : 나는 다양한 접근법에 관심이 있습니다 ... 반드시 보편적 인 접근법은 아닙니다.

편집 2 : 내 게임 중 일부에서는 컬렉션에 대해 (잠재적으로 나쁜) 접근 방식을 사용하며 이전 게임 중 하나가 비슷한 접근 방식을 사용했는지 알고 싶습니다. 나는 다음을하고 싶다 :

// 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
보편적 인 대답은 없습니다. 주어진 프로그래머가 주어진 문제에 대한 솔루션을 어떻게 구현했는지에 달려 있습니다.
Ed S.

1
모든 게임이 어셈블리로 작성되었다고 생각하지는 않지만 어셈블리 프로그래머는 프로그램에서 프로그램으로 복사 / 붙여 넣기 재사용을 위해 작은 구성 요소를 수집하는 것이 일반적이라고 말할 것입니다. printf () 함수를 몇 번 작성 하시겠습니까? :)
James

좋은 지적. 동적으로 할당 된 컬렉션과 정적으로 할당 된 컬렉션에 대해 정말 궁금합니다
MrDatabase

1
어떤 특정 문제가 않습니다 당신 이? 왜 오래된 게임에 관심이 있습니까?
Tetrad

2
두 번째 편집에서 얻은 것은 "배열 구조"레이아웃의 예입니다. 이는 병렬 처리 및 SIMD 작업에 이점이 있기 때문에 최신 게임에서도 일반적으로 유지됩니다. 소니는 구조화 데이터의 전통적인 C ++ 방법은 비용를 규칙적 숨겨진 심각한 가질 수 방법에 대한 몇 년 전에 발표를했다 research.scee.net/files/presentations/gcapaustralia09/...
Crashworks

답변:


13

16 비트 날짜에도 게임 콘솔은 기본적으로 실시간 소프트웨어를 실행하는 작고 내장 된 컴퓨터였으며, 우리가 사용한 데이터 구조는 컴퓨터 과학 어디에서나 배열, 행렬, 힙, 트리와 같은 구조입니다. 연결 목록이 너무 느려서 링크 된 목록이 많지 않습니다 (간접 조회에는 대기 시간이 길다).

차이점은 STL 이전에 성능이 매우 중요하기 때문에 일반적으로 구조와 알고리즘을 직접 작성해야했습니다!

David Braben은 2011 년 GDC에서 재미있는 강의 를하면서 1984 년 엘리트BBC 마이크로 에 맞추는 데 사용한 미친 속임수에 대해 이야기 했습니다 . GDC Vault에서 무료로 볼 수 있습니다 .


멋있는. 동적으로 할당 된 배열을 사용 했습니까? 아니면 대부분 정적 크기를 가집니까? 예를 들어 5 개의 코인이 화면에 나타나고 플레이어가 동전을 모을 때까지 화면에 남아있는 상황이 궁금합니다.
MrDatabase

2
@MrDatabase-가능하면 정적 할당. 당신 같은 경우는 설명을 위해, 우리는 종종 단지의 정적으로 할당 된 배열 거라고 존재할 수 32 개 가능한 동전을. 동전이 세상에 왔을 때 우리는 배열의 자리를 채울 것입니다. 그들이 떠났을 때, 우리는 그것을 비 웁니다. 동적 할당을 사용할 수 없었습니다. 단지 2MB의 RAM 만 있으면 프로그램이 일정한 메모리에서 실행되도록 보장해야하기 때문에 사용을 피했습니다.
Crashworks

멋있는. 나는 비슷한 것을한다 (질문 # 2 편집 참조). 내 업데이트 기능 if(coinsActive)에서 maxNumCoins를 반복하고 업데이트하기 전에 "coinsActive"비트 세트를 확인합니다 . 이렇게하면 제로 코인이 활성화되어 있으면 루프를 완전히 피할 수 있습니다.
MrDatabase

GDC Vault 링크로 인해 +1 Peter Molyneux의 사후 대중적인 이야기는 내가 본 것 중 가장 재미있는 이야기 여야합니다.
TravisG

MeDataBase-비활성 상태가 된 동전이 차지한 슬롯에 마지막 활성 객체를 복사합니다 (예 : 10 개의 동전이 있으면 동전 5가 비활성화되고 동전 10을 슬롯 5에 복사하고 숫자 동전을 줄임) 반복 할 수 있습니다. numCoins에 모든 요소를 ​​업데이트하십시오. 'if'가 필요하지 않습니다. 물론 이것은 비활성 동전이 상태를 유지할 필요가없고 업데이트 순서가 중요하지 않은 경우에만 작동합니다 (배열이 실제 동전이 아닌 동전에 대한 포인터를 저장하면 상태가 유지 될 수 있지만 흩어져있는 캐시 동작을 얻습니다) 'if'보다 나빠질 가능성이 있습니다)
Kaj

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.