2012-10-27 6 views
3

새로운 게임을 만들기 시작할 것입니다. 달성하고 싶은 것 중 하나는지도 데이터를 보유 할 수있는 동적 시스템 정렬 시스템입니다. 이 게임은 하향식 2D이며 XNA 4.0 및 C#으로 제작됩니다. 본질적으로 타일 기반의 무작위 영역에서 시작됩니다. 이와 같이 2 차원 배열은 텍스처 목록에 해당하는 수치 값을 보유함으로써이 작업을 수행하는 한 방법 일 수 있습니다. 그러면이 임의로 생성 된지도를 그리는 방법이됩니다. 문제는 내가 시작하는 곳 주변에 지역을 만들고 싶다는 것 뿐이며 어느 방향 으로든 그들이 원하는 벤처 기업이 될 수 있다는 것입니다. 이것은 내가가는 방향으로 좀 더 무작위로 데이터를 맵 배열에 채워야 함을 의미합니다. 나는 정말 큰 배열을 만들고 그것의 중심을 사용할 수 있으며, 나머지는 만들어 질 새로운 내용을 기대할 것입니다. 그러나 이것은 매우 비효율적 인 것처럼 보입니다.동적 배열을 수행하는 몇 가지 방법은 무엇입니까?

새로운 게임을 시작할 때 무작위로 생성 된 큰지도 배열을 만들고 만들 수있는 한 번의 시간지도 작성 프로세스가있을 수 있지만 모든 메모리를 항상 보유하는 것도 비효율적이라고 생각합니다. 아마도 내가 한 번에 메모리에있는지도 데이터의 일부만 보유하고 어떻게 든 나머지는 메모리에 보관하지 않을 수있는 방법이 있다면. 결국 나는 단지 메모리에있는 맵에 다소 가까운 덩어리를 가질 필요가 있습니다. 그래서 여러분 중 일부는 이러한 종류의 무작위 맵과 동적 배열 문제에 접근하는 좋은 방법에 대한 제안을했을 것입니다. 내가 필요하다면 동적 인 배열 타입 일 필요는 없습니다. 그리하여 맵 데이터를 필요로하는 곳에서 꺼내서 한 번 화면에서 떼어 내고 필요가 없으면 어떻게 든 그 메모리를 없앨 수 있습니다. 거대한 배열이 많은 기억을 가지고있다.

답변

2

실제로 문제가 실제로 발생하기 전에 문제를 해결하려고하는 것처럼 들리는데.

실제로 메모리에서 모든 것을로드하는 간단한 방법을 시도해 보았으며 너무 많은 메모리를 사용하는 것을 보았습니까? Quoth Knuth, "Premature optimization is the root of all evil".

요점은, 당신이이 게임을 만드는 이유 인 당신이 성취하고자하는 독특한 것에 우선 초점을 맞추는 것입니다. 거기에서 당신을 바쁘게 지켜야 할 충분한 것이 분명합니다. 탑 - 다운 2D 스크롤러에 새로운 패러다임을 바꿔 놓은 새로운 기능이 없다면 스마트 폰과 같은 제한된 환경에서도 메모리 사용이 제한 요소가되지는 않습니다.

게임 개발을 마치고 실제로 메모리 사용률이 문제가되면 다음으로 최적화를 시작할 적절한시기입니다. 질문 (임시 캐싱 및 프리 페치)에서 가정하는 솔루션에만 집중하지 말고 프로그램에서 필요하지 않은 메모리를 사용하는 다른 방법을 찾아보십시오.

+0

당신은 좋은 지적을했습니다. 시작하기 전에 계획 단계에서 이런 종류의 일로 마음을 닦는 것은 좋지 않습니다. 솔직하게 말해서 나는 그것이 얼마나 많은 공간을 차지할지 계산하지 못했다. 나는 준비를 원했지만 그렇게 사소한 태도는 처음부터 멈추지 않아야한다. – Ted

2

나는 학생이며 게임 프로그래밍 경험이 없지만, 내가 아는 바로는 당신이 그것을 사용하는 동안 배열을 확장 할 수는 없다. 9 개의 버퍼 (각 2-D 어레이, NSEW 및 대각선 방향마다 하나씩) 사이에서 리소스를 앞뒤로 이동해야한다고 상상해보십시오. 각 버퍼에는 9 개의 타일이 있습니다.

예를 들어

: 영역에

플레이어로드, 그리고 그들이 모든 방향에서 볼 타일을하도록 타일, 당신의 3 × 3 배열의 중간에있다. 백그라운드에서 주변 버퍼의 텍스처 ID를 계산하여 준비합니다.

[ CENTER ] 
+---+---+---+ 
| | | | 
+---+---+---+ 
| | X | | 
+---+---+---+ 
| | | | 
+---+---+---+ 

플레이어가 가운데 타일 (예 : 동쪽) 밖으로 이동하면 센터 버퍼의 동쪽 가장자리에 배치됩니다.

[ CENTER ] 
+---+---+---+ 
| | | | 
+---+---+---+ 
| | | X | 
+---+---+---+ 
| | | | 
+---+---+---+ 

이 시점에서 센터 버퍼의 가장자리를 따라 동쪽 방향으로 준비된 버퍼를 배치하여 타일이 1만큼 겹치도록하십시오.

 [ EAST ] 
[ CENTER ] 
+---+---+---+---+---+ 
| | | | | | 
+---+---+---+---+---+ 
| | | X | | | 
+---+---+---+---+---+ 
| | | | | | 
+---+---+---+---+---+ 

이렇게하면 플레이어가 동부 버퍼로 이동할 수 있습니다. 일단 거기서, 동부 쪽 버퍼는 센터 버퍼가되고, 오래된 센터 버퍼는 새로운 서쪽 버퍼로 재순환됩니다. 오래된 서양 완충기 (그리고 그것에 수직으로 인접한 완충기)는 새로운 동북부, 동부 및 남동부 완충 대가되도록 재활용 될 수 있습니다. 물론

[ CENTER ] 
+---+---+---+ 
| | | | 
+---+---+---+ 
| | X | | 
+---+---+---+ 
| | | | 
+---+---+---+ 

, 당신은 당신이 필요로 어떻게 버퍼 당 많은 타일 때 적절한 재활용/사전 처리 시간은 성능이 얼마나 많은 버퍼를 실험해야합니다,하지만 난이 일 것 상상한다.

+0

귀하의 예는 의미가 있습니다. 나는 당신의 생각이 무엇인지 알며, 그렇게 생각하려고하지 않았습니다. 그것은 나에게 많은 아이디어 감사를 준다. – Ted

관련 문제