2012-03-15 2 views
2

저는 2 차원 타일 기반 (직각 타일) iPhone 게임을 코딩하고 있습니다. 모든 레벨은 앱이 처음 재생 될 때 절차 적으로 생성 된 다음 사용자가 새지도를 원할 때까지 지속됩니다. 지도는 폭이 넓고 높이가 1,000 타일이므로 지형은 파괴적입니다. 현재로서는 Terraria과 다소 비슷하지만 변경 될 것입니다.대형 런타임 생성 타일 맵을 효율적으로 처리 할 수 ​​있습니까?

지도/타일 정보를 보관하려면 현재 2 차원 C 스타일 배열을 여러 개 사용하고 있습니다. 이것은 잘 작동하지만 어레이의 크기가 모두 (1000 * 1000 * sizeof (short)) 바이트를 차지하는 short array[1000][1000]으로 정의되어 있으므로이 메모리가 차지하는 메모리의 양에 대해서는 우려하고 있습니다.

특히 사용자가 멀티 태스킹을 할 때 엄청난 양의 메모리가 필요하지 않은 경우에는 그리 바람직하지 않습니다. 주된 문제는 모든 레벨이 절차 적으로 생성되기 때문에 .tmx와 같은 특정 타일 맵 형식을 사용할 수있는 방법이 없다는 것입니다. 성능이 문제가 될 수도 있습니다. 왜냐하면 타일이 인덱스 (x, y)에서 삭제되면 해당 인덱스의 데이터를 변경해야하기 때문입니다. 타일 ​​맵 데이터를 텍스트 파일로 작성하는 것도 고려해 봤지만 데이터를 액세스하거나 변경할 때 어려움이나 성능 문제가 있다고 생각합니다.

이 점을 염두에 두면서 타일 데이터를 효율적이고 빠르게 처리하는 방법은 무엇입니까?

+2

절차 적으로 생성 된 경우 전체를 생성하지 않고 필요시 타일 값을 생성 할 수없는 이유는 무엇입니까? –

+0

좋은 지적입니다. 주로 프로세스 때문입니다. 내지도는 타일을 배치하는 [drunkard walk] (http://pcg.wikidot.com/pcg-algorithm:drunkard-walk) 방법을 사용합니다. 나는 프로세스의 성격 때문에 한 번에 모든 것을 제외하고 이것을 어떻게 할 것인지 모른다. –

답변

1

내 기분은 각 타일 요소가 주변 타일과 관계가 있도록 구성된 핵심 데이터입니다. 여기에 약간의 오버 헤드가 있지만 장점은 화면에서 나오지 않는 타일을 메모리에서 꺼낼 수 있고 필요할 때 다시 폴트 할 수 있다는 것입니다. 한 방향으로 이동하면 그 방향으로 타일을 쿼리 할 수 ​​있으며 배경에있을 때 메모리를 상당히 싸게 덤프 할 수 있습니다. 이렇게하면 "여러"2D 배열이 제거되고 모든 데이터가 단일 객체로 이동합니다. 원칙적으로 모든 것이 좌표가 아닌 관계에 있기 때문에 그리드는 크기면에서 무한대가 될 수 있습니다.

마찬가지로 SQLite를 사용하여 주어진 범위의 행과 열을 쿼리하여 문제에 접근 할 수 있습니다. 개체를 NSDiscardableContent으로 표시하고 NSCache에 넣으면 메모리 성능이 크게 향상 될 수 있습니다. 좌표가 양수와 음수가 될 수있는 한 효과적으로 효과적으로 무한한 격자를 생성 할 수 있습니다.

+0

유망한 소리입니다! 몇 년이나 몇 년 동안 프로그래밍하지 않았다는 것을 고려할 때 두 사람 중 어느 쪽이 더 좋을 것이라고 생각합니까? (구현하고 확장하기가 더 쉬울까요?) –

+0

아마도 Core Data를 기대합니다. 왜냐하면 그들은 이미 SQLite에 익숙하지 않은 경우에 특히 이미 많은 노력과 최적화를했기 때문입니다. –

+0

핵심 데이터를 살펴본 결과 유망한 것으로 보입니다. 저를 향해 주셔서 고마워요! 나는 이것을 나의 대답으로 표시하고있다. –

관련 문제