제 연구에서 RenderScript 내부에서 메모리를 할당 할 수 없음을 발견했습니다. 예를 들어 int* values = new int[10];
은 C99에서 사용할 수 없습니다. 이 배열을 처리중인 현재 픽셀에만 으로 지정하고 싶습니다. 이러한 동적 할당은 커널 함수 내부에서 선언되고 인스턴스화 된 경우이를 보장합니다.RenderScript에서 로컬/개인 배열을 선언하는 방법은 무엇입니까?
나는 int values[10];
이 유효한 선언임을 알고 있습니다. RenderScript의 시작 부분에 넣으면 전역 배열이되며 Java 코드에서 설정할 수 있습니다 (Allocation
사용).
커널 내부에 int values[10];
을 넣으려고했는데, 현재의 픽셀에 대해 로컬이라고 가정했습니다. 단일 값 변수 (uint32_t, float4 등)를 선언하는 것이 현재 픽셀에 국한된다는 것을 알고 있습니다. 그러나 커널 내부에서 선언 된 배열은 여전히 전역 변수입니다. 다른 모든 픽셀은 읽고 쓸 수 있습니다.
uchar4 RS_KERNEL mykernel(uchar4 in, uint32_t x, uint32_t y){
int* values = (int*)malloc(sizeof(int)*256); // illegal
int* values2 = new int[256]; // illegal
int values3[256]; // legal, but it's global. I want a local array
}
궁금한 점이있어서 현재 픽셀 (x, y)에서 인접 픽셀에 액세스하려고합니다. 나는 그것을 견딜 수 있었다. 그러나 가장 자주 발생하는 색상 구성 요소, 해당 배열이 정렬 된 정확한 중간 구성 요소 등을 선택해야 할 수 있으므로 일부 픽셀 정보 (예 : 인접 픽셀의 색상 구성 요소 각각 하나)를 배열에 저장해야합니다. 그래서 저는 모드와 메디안 필터, 그리고 유화 효과까지 끌어 내려고 노력하고 있습니다.이 모든 것은 로컬 어레이에 인접한 픽셀 데이터를 저장해야합니다.
RenderScript에서 처리중인 현재 픽셀 만 처리 할 수있는 로컬/개인 배열을 어떻게 선언 할 수 있습니까? 그렇게 할 수 없다면 단일 값 변수만으로 작업이 필요한 로컬 배열을 어떻게 시뮬레이트합니까?
업데이트
int values3[256];
상기 현재 스레드에 실제로 로컬이다. 우리가 원하지 않는 휴지통 값을 포함 할 수도 있습니다. 나는 각 인덱스의 값이 기본적으로 0이라고 가정했다. 일부는 그렇지 않습니다. 그래서 다른 모든 스레드가 쓰고 있다고 생각했습니다. 저는 위에서 말한 것들을 골라 봤습니다. 그래서 저는 항상 0에서 시작하지는 않았습니다. 그래서 계산이 끝났습니다!
나는 당신이 옳을 바랍니다. 내 디버깅은 다른 스레드에서 정보를 수집 한 것 같았다. 나중에 코드와 결과를 게시 할 예정입니다. –