2012-05-18 7 views
2

타일 기반 지형 생성 시스템에서 작업 중이며 약간의 걸림 소리가 발생했습니다. 나는 물과 땅 사이의 천이를 표시 할 일련의 전이 타일을 만들기를 원하며 어떤 타일을 사용해야 하는지를 파악하는 효율적인 방법을 찾는 데 어려움을 겪고있다.Android - 주변 타일을 기반으로 타일 비트 맵을 결정합니다.

첫 번째 시도는 기본적으로 각 타일을 일련의 if 문을 통해 실행하여 어느 타일을 사용해야하는지 파악합니다. 이 문제의 주된 문제점은 100 타일 × 100 타일의 세계지도를 사용하면 주변의 8 타일 (80,000 개의 작업)에있는 데이터에 액세스 한 다음 최대 4 개의 if 문 (320,000 작업). 이것이 나에게 비현실적으로 비효율적이며 느릴 것으로 보인다.

이 방법의 장점은 토지 타일에서만 실행된다는 것이며, 먼저 적어도 하나의 물 타일에 인접 해 있는지 확인하여 필요한 작업 횟수를 크게 줄입니다.

내가 작성한 기본 차트는 주변 타일을 따라 걷고 적절한 타일을 선택합니다. 내가 갔다으로 타일을 할당, 양 방향으로 해안을 따라 해안 타일을 공격하면

Attempt 1 layout

내 두 번째 생각은, 본질적으로 타일을 걷는 시작이었다. 이 방법은 기와가 시작하기 전에 이미 파악되지 않았는지 확인합니다. 이 문제는 하나, 나는 그게 어떻게 작동하는지 알 수 없다. 둘째, 결과적으로 내가 얼마나 효율적인지 알지 못한다.

친구가 제 3의 방법이 효과가있을 것이라고 말했습니다. 물 타일을 가져 와서 0과 동일하게 설정하고 1로 설정된 랜드 타일을 설정합니다. 그런 다음 주변 타일을 가져 와서 1에서 9까지 숫자를 매 깁니다. 거기에서부터 0과 1의 문자열을 만듭니다.

W W W 
W L L 
L L L 

가 될 것이다 : 000,011,111

0 * 2^0 + 0 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4 + 1 * 2^5 + 1 * 2^6 + 1 * 2^7 + 1 * 2^8

0 * 1 + 0 * 2 + 0 * 4 + 0 * 8 + 1 * 16 + 1 * 32 + 1 * 64 + 1 * 128 + 1 * 126 = 496

이론은 타일 어소시에이트 조합 번호 496과 비교하여로드합니다. 문제는 각 가장자리에 13 또는 14 개의 조합이 있으므로 그 결과로 결과가 발생한다는 것입니다. 예를 들면 :

기본적으로
W W L   L W W 
W L L and W L L Both need the same tile as the above example, but 
L L L   L L L produce different numbers. 

, 내가 특정 타일 초래 물과 땅의 가능한 조합 각각에 대한 최종 수를 파악해야, 다음을 통해 마지막 수를 실행하는 것이이 방법을 수행하기 일련의 if/case를 사용하여 적절한 비트 맵을 선택합니다. 이것은 if 블록보다 비효율적입니다.

그럼,이 모든 것에 실제 질문이옵니다. 누구든지이 작업을 수행하는 다른 방법이나 이러한 방법 중 하나를보다 효율적으로 만드는 방법을 알고 있습니까?

+1

해결책을 시도하고 아직 속도를 테스트 해 보셨습니까? 조숙 한 최적화를 시도하지 않으시겠습니까? – zarthross

+0

아직은 기회가 없었습니다. 나는 모든 if 문을 실행하는 데 시간이 많이 걸릴 것이라는 가정에 기반한 대체 방법을 찾고있다. 나는 오늘 저녁 첫 번째 방법으로 통과 할 것이다. –

+0

@Zathross 당신이 옳았다 고 생각합니다. 나는 초기 테스트와 맵에서 모든 사각형을 돌아 다니며 총 타일에 대한 정보를 수집하고 물을 확인한 다음 올바른 비트 맵을 할당하는 데 총 반환 시간이 평균 60 밀리 초가 걸린다. 그러나 일단 게임에서 보았을 때, 가능한 모든 육지 - 물 구성에 대한 설명이 어디에도 없었 음을 알았습니다. 필요한 타일 수를 두 배로 늘리거나 세배로 늘려서 세 번째 방법으로 다시 시도해 볼 수 있습니다. –

답변

0

나는 실제로 게임을 시작하면서이 부분을 썼다. 해결책을 생각해 보는데 잠시 시간이 걸렸지 만, 내가 그랬을 때 나는 그것을 더 일찍 생각하지 않았다는 것을 믿을 수 없었다.

1 2 3 
4 x 5 
6 7 8 

을 그리고 각 연결은 또는하지 연결하는 타일을 포함 할 수 있습니다 : 당신이 그것에 대해 생각한다면, 각 타일은 8 가능 "연결"이있다. 이것이 매우이 쁜 시스템이며, 모든 조합을 8 비트 (또는 1 바이트)로 나타낼 수 있으며 모든 조합이 0-255까지 순차적으로 표시된다는 것을 알기 때문에 룩업 테이블을 쉽게 사용할 수 있습니다 , lookup array)를 사용하여 올바른 이미지를 찾습니다. 이것은 256 가지 가능한 조합의 조합이 있다는 것을 의미하지만 (위의 다른 조합은 동일한 타일 그래픽을 사용한다고 말한 것처럼 256 가지 이미지가 마음에 들지 않습니다.) 우리는 생성해야합니다. 내가 한 것은 (그리고 나는 추천한다), lookup 배열을 생성하기위한 작은 스크립트를 작성했다.

이제이 방법은 모든 타일에 연결되어있는 타일의 길이가 8 개인 배열을 유지하는 방법입니다. 지도를로드 할 때 타일의 "연결"배열을 채우십시오. 일단 모든 타일이 연결되면 (또는 모든 타일이로드 된 후) 각 타일 (룩업 어레이의 인덱스)에 대한 "연결 마스크"또는 "연결 값"을 계산합니다. 이것은 "connections"배열을 루핑하고 비트 시프트를 사용하여 마스크를 구현함으로써 이루어집니다. 그 다음에는 추가/제거/변경되는 개별 타일과 연결된 8 개의 타일에 대해서만 최소한의 처리 만하면됩니다.

희망이 도움이됩니다. 자세한 내용이나 예제 코드가 필요하다면 나중에 제공 할 수 있습니다!