최근에 렌더링 코드에 모든 것을 저장하도록 코드를 수정했습니다 (데이터를 복사하기 전에 앞뒤로 복사하는 것이 효과적이지 않았습니다).하지만 이제 가비지 수집기가 미친 듯이 가비지 수집 중입니다. (아직도 응용 프로그램은이 방법으로 더 나은 예비 성형됩니다.)렌더러 및 가비지 컬렉터
나는 내가 자주 통화 기능, 새로운 배열을 생성하지 않는 모든 것을 사용하여 수집 할 필요가 무엇인지 알아낼 수 없습니다.
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);
}
은 당신의'velocityY'와'velocityY_prev'은 RenderScript 내의 메모리에 결합하고 있는가? 'foreach_diffuseVelocityY()'를 호출하기 전후에 무엇을하고 있습니까? –
@LarrySchiefer 나는 그들에게 기억을 할당했다. 그것을 호출 한 후에 나는 set_bnd_velocityY_prev()를 호출하여 foreach_diffuseVelocityY()에서 수정 된 동일한 배열/포인터의 데이터를 수정한다. 그 전에 다른 배열/포인터를 사용하여 동일한 작업을 수행했습니다. 그들은 모든 OpenGL 그리기에서 호출됩니다. – FaNaT
RS 호출은 대부분 JNI 코드를 중심으로 코어 RS 엔진을 호출하는 씬 래퍼이므로 최소한의 Java 객체가 생성되어야합니다. 즉, 연기 테스트 코드가 적당하기 때문에 문제의 원인을 정확하게 좁히기가 어려울 수 있습니다. systrace 기능을 사용하여 좀 더 자세히 살펴 보았습니까? –