2014-05-20 5 views
0

안녕하세요 저는 지형이 무한한 터널처럼 보이는 끝없는 사이드 스크롤러 게임을하고 있습니다. 긴 경로는 게임 더 "고르지"가된다 :드로잉 및 스크롤 경로 성능 문제

private void createPaths() {  
    if(startingPath) { 
     pathBottom.setLastPoint(0, canvasHeight); 
     pathTop.setLastPoint(0, 0); 

     slopeWidth = 0; 
     slopeHeight = generateRandomNumber(canvasHeight/4, canvasHeight/2); 

     lastX = 0; 
     lastY = canvasHeight - slopeHeight; 
     newX = lastX; 
     newY = lastY; 

     startingPath = false; 
    } else { 
     lastX = canvasWidth; 
     lastY = newY; 
     newX = lastX; 
     newY = canvasHeight - slopeHeight; 
    } 

    pathBottom.lineTo(lastX, lastY); 
    pathTop.lineTo(lastX, lastY - OFFSET); 

    do { 
     lastX = newX; 
     lastY = newY; 

     slopeWidth = generateRandomNumber(canvasWidth/8, canvasWidth/2); 
     newX += slopeWidth; 

     if(i % 2 == 0) { 
      slopeHeight = generateRandomNumber(canvasHeight/12, canvasHeight/6); 
      newY = canvasHeight - slopeHeight; 
     } else { 
      slopeHeight = generateRandomNumber(canvasHeight/4, canvasHeight/2); 
      newY = canvasHeight - slopeHeight; 
     } 

     pathBottom.cubicTo(
       interpolateLinear(lastX, newX, 0.333f), 
       lastY, 
       interpolateLinear(lastX, newX, 0.666f), 
       newY, 
       newX, 
       newY); 
     pathTop.cubicTo(
       interpolateLinear(lastX, newX, 0.333f), 
       lastY - OFFSET, 
       interpolateLinear(lastX, newX, 0.666f), 
       newY - OFFSET, 
       newX, 
       newY - OFFSET); 
     i++; 
    } while (newX < canvasWidth * 2); 
    pathBottom.lineTo(newX, canvasHeight); 
    pathTop.lineTo(newX, 0); 
} 

및 사용하여 스크롤 :

public void updateTerrain() { 
    moveX -= speed; 
    int pos = newX - canvasWidth + moveX; 
    if(pos > 0) { 
     Matrix matrix = new Matrix(); 
     matrix.setTranslate(-speed, 0); 
     pathBottom.transform(matrix); 
     pathTop.transform(matrix); 
    } else { 
     createPaths(); 
     moveX = 0; 
    } 
} 

문제는 내가 무작위로이 코드를 사용하여 터널을 생성 할 수 있었다. 나는 약간의 시간이 지나면 그 길에서 그려지는 점들을 줄여야한다고 생각하지만, 솔직히 나는 그것을 어떻게하고 여전히 지형 스크롤을 만들어 내고 생성시키는 지 모른다. 네가 나를 도울 수 있다면 정말 고마워. 감사.

+0

(이하 "시작 인덱스"에서 시작)

  • 그런 다음 같은 경로 인스턴스를 다시 사용 포인트의 배열에서 모든 포인트를 을 다시 추가 할
  • 경로를 재설정 path.rewind 바인딩없이 성장하는 데이터 구조를 생성 한 다음 전체 프레임을 각 프레임으로 렌더링합니까? 그렇다면 고정 크기 슬라이딩 창 구조로 전환하고 싶을 것입니다. – fadden

    +0

    어떻게 할 수 있는지 알려주세요. – keysersoze

    답변

    1

    이것은 더 큰 논리 조각처럼 보입니다. 성능 문제는 여기에 나와 있지 않은 다른 코드에있을 수 있습니다.

    일반적인 조언 (Romain Guy 및 Chet Haase와 같은 사람들에 따르면)은 onDraw 중에 개체 할당 (새 이름)을 피하는 것입니다. 모든 "새"는 GC를 트리거 할 가능성이 있습니다.

    나는 Matrix의 동일한 인스턴스를 재사용하고 단지 그것을 업데이트 할 것이다.

    또한 "고정 크기 슬라이딩 윈도우 구조"(순환 버퍼 또는 링 버퍼와 비슷 함) 위에 언급 한 바와 같이 Path 객체가 고정 된 크기인지 확인해야합니다.

    1. 경로에 대한 점의 고정 번호를 선택
    2. 배열에서 그 점을 계속 추적하고 배열의 "논리적"시작의 추적 할 수있는 "시작 인덱스"변수를 유지 (의 200을 가정 해 봅시다). 새로운 점을 추가 할 필요가있을 때, 배열 크기를 모듈로하여 인덱스를 증가시키고, 마지막 점 (index - 1 modulo 배열 크기)을 덮어 씁니다. 배열의 끝에 도달하면 줄 바꿈 (시작 부분에서 시작하여 startindex - 1로 이동)을해야합니다.
    3. 보기가 생성 될 때 path.incReserve를 사용하여 메모리를 미리 할당합니다.
    4. 사용은 그래서 당신은