2014-09-04 3 views
0

최근에 렌더링 코드에 모든 것을 저장하도록 코드를 수정했습니다 (데이터를 복사하기 전에 앞뒤로 복사하는 것이 효과적이지 않았습니다).하지만 이제 가비지 수집기가 미친 듯이 가비지 수집 중입니다. (아직도 응용 프로그램은이 방법으로 더 나은 예비 성형됩니다.)렌더러 및 가비지 컬렉터

나는 내가 자주 통화 기능, 새로운 배열을 생성하지 않는 모든 것을 사용하여 수집 할 필요가 무엇인지 알아낼 수 없습니다.

void __attribute__((kernel)) diffuseVelocityY(float in, uint32_t x, uint32_t y) { 
    velocityY_prev[x] = velocityY[x] + a*(velocityY_prev[x-1] + velocityY_prev[x+1] + velocityY_prev[x-(width)] + velocityY_prev[x+(width)])/(1+(4*a)); 
} 

내가 업데이트 할 같은 포인터의 데이터를 사용하고 있기 때문에 그것에 대한 temperaly 포인터를 생성한다 (나는이 방법이 있다면 아무 생각이 : 내 유일한 생각은 내가이 작업을 수행하는 경우이다 공장). 나는 그것을 변경하려고 했으므로 빈 포인터에 데이터를 넣고 완료된 후 데이터를 올바른 위치에 복사합니다. 그것은 더 적은 쓰레기를 모으는 것처럼 보였지만 아직도 가비지 수집이 있었고 preformance는 또한 내려 갔다. 누군가가합니다 (_befores 내가 코드를 수정하기 전에 출신)보고 싶은 경우

나는 내 코드 here을 업로드했습니다.

가비지 수집을 중단하는 방법을 알지 못합니다. 누군가 도와 줄 수 있기를 바랍니다. 방법의

하나 :

void set_bnd_densiy_prev(int b){ 
     for (int i = 1; i <= gridSizeY; i++) { 
      density_prev[IX(0, i)] = (b == 1 ? -density_prev[IX(1, i)] : density_prev[IX(1, i)]); 
      density_prev[IX(gridSizeX + 1, i)] = (b == 1 ? -density_prev[IX(gridSizeX, i)] : density_prev[IX(gridSizeX, i)]); 
     } 
     for (int i = 1; i <= gridSizeX; i++) { 
      density_prev[IX(i, 0)] = (b == 2 ? -density_prev[IX(i, 1)] : density_prev[IX(i, 1)]); 
      density_prev[IX(i, gridSizeY + 1)] = (b == 2 ? -density_prev[IX(i, gridSizeY)] : density_prev[IX(i, gridSizeY)]); 
     } 
    density_prev[IX(0 ,0)] = 0.5f*(density_prev[IX(1,0)]+density_prev[IX(0 ,1)]); 
    density_prev[IX(0 ,gridSizeY+1)] = 0.5f*(density_prev[IX(1,gridSizeY+1)]+density_prev[IX(0 ,gridSizeY)]); 
    density_prev[IX(gridSizeX+1,0)] = 0.5f*(density_prev[IX(gridSizeX,0)]+density_prev[IX(gridSizeX+1,1)]); 
    density_prev[IX(gridSizeX+1,gridSizeY+1)] = 0.5f*(density_prev[IX(gridSizeX,gridSizeY+1)]+density_prev[IX(gridSizeX+1,gridSizeY)]); 
} 

코드는 그것에서 발생 : renderscript 그들을 처리 할 수 ​​Fieldpackers을 만들 필요가 있기 때문에

private final static int mExportFuncIdx_set_bnd_densiy_prev = 3; 
    public void invoke_set_bnd_densiy_prev(int b) { 
    FieldPacker set_bnd_densiy_prev_fp = new FieldPacker(4); 
    set_bnd_densiy_prev_fp.addI32(b); 
    invoke(mExportFuncIdx_set_bnd_densiy_prev, set_bnd_densiy_prev_fp); 
} 
+0

은 당신의'velocityY'와'velocityY_prev'은 RenderScript 내의 메모리에 결합하고 있는가? 'foreach_diffuseVelocityY()'를 호출하기 전후에 무엇을하고 있습니까? –

+0

@LarrySchiefer 나는 그들에게 기억을 할당했다. 그것을 호출 한 후에 나는 set_bnd_velocityY_prev()를 호출하여 foreach_diffuseVelocityY()에서 수정 된 동일한 배열/포인터의 데이터를 수정한다. 그 전에 다른 배열/포인터를 사용하여 동일한 작업을 수행했습니다. 그들은 모든 OpenGL 그리기에서 호출됩니다. – FaNaT

+0

RS 호출은 대부분 JNI 코드를 중심으로 코어 RS 엔진을 호출하는 씬 래퍼이므로 최소한의 Java 객체가 생성되어야합니다. 즉, 연기 테스트 코드가 적당하기 때문에 문제의 원인을 정확하게 좁히기가 어려울 수 있습니다. systrace 기능을 사용하여 좀 더 자세히 살펴 보았습니까? –

답변

0

문제는 함수 인수로했다. 따라서 동일한 문제가있는 경우 함수 args를 제거한 다음 복사하여 함수를 붙여넣고 변수를 수정하고 다른 함수를 호출하지는 마십시오.하지만 작동합니다.

(당신의 도움에 대한 감사 thebaron)