2016-08-30 2 views
2

안드로이드보기가보기의 보이는 부분보다 큽니다 (예 : 10000x6000 픽셀). onDraw()에서 경로를 그립니다. 방법. 뷰포트와 교차하는 경로 만 그려지고 대부분 잘 작동하지만 그려지는 패스의 경계 상자가 뷰포트보다 훨씬 커지면 너무 많은 메모리가 할당되고 메모리 부족 오류로 인해 응용 프로그램이 중단됩니다. 클립의 경계가 뷰포트로 설정하더라도와 메모리 경로의 바운딩 박스에 의해 점유되는 전체 영역에 할당된다 : 상기 예에서캔버스에서 화면보다 훨씬 큰 경로를 그릴 때 메모리가 부족합니다.

Large canvas

뷰포트은 2000x1400 픽셀이지만 때 클리핑 캔버스에 그려지면 전체 경로 (7000x4000 픽셀 = 112MB)에 맞게 메모리가 할당됩니다.

이 시나리오에서 할당 된 메모리 양을 제한하는 방법이 있습니까?

BTW, iOS는 클립 경계를 사용할 때 렌더링 된 래스터 이미지의 크기를 제한합니다. 이 문제에 대한 https://code.google.com/p/android/issues/detail?id=24023

+0

난 당신이 내가 것입니다 당신의 라인을 그리는 방법의 onDraw 뷰를 사용하는 추측이 없을 것이라고 말했다 이름으로 새로 고침을위한 메인 스레드에서 실행 보기 – Vijayaramanan

+0

별도의 스레드로 표면 뷰를 사용하여보기를 업데이트하면 그래픽 응용 프로그램에서 표면 뷰를 사용하여이 문제를 대부분 해결할 수 있습니다. – Vijayaramanan

+0

SurfaceView는 과도한 작업입니다. 그리고 화면보다 큰 경로 렌더링에 필요한 메모리 문제를 해결하지 못합니다. –

답변

0

내 솔루션은 깨끗한 될하지만 내가 필요로 무엇을하지 않았다 있습니다

편집 :이 하드웨어 렌더링 층의 알려진 문제처럼 보인다. canvas.drawLines를 사용했는데 각 선 사이에 교차점이 연결되지 않았지만 원활하게 작동합니다.

float[] pathArray = new float[(nodes.size() - 1) * 4]; 
for (int i = 0; i < nodes.size() - 1; i++) { 
    int index = i * 4; 

    Node from = nodes.get(i); 
    pathArray[index] = from.x; 
    pathArray[index + 1] = from.y; 

    Node to = nodes.get(i + 1); 
    pathArray[index + 2] = to.x; 
    pathArray[index + 3] = to.y; 
} 

이렇게하면 "경로"를 만들 수 있습니다.

다음과 같이 캔버스에 그립니다.

canvas.drawLines(pathArray, mDefaultPaint); 

나는 결과가 선 사이의 끊어진 링크되지만 더 움 문제

관련 문제