2010-08-09 3 views
3

일반적으로 자바 문제이지만 OpenGL 용 Android에서 Vertex Arrays를 사용하고 있습니다. 이 기본 GL 시스템을 사용하려면 Java의 버퍼 시스템을 기본 할당 모드로 사용해야합니다. 이것은 Java에서 매우 느립니다. 그리고 내 전체 응용 프로그램의 시간 중 대략 40-50 %가 buffer.put() 내부에서 소비됩니다.Buffer.put() 및 Android OpenGL의 성능 문제를 해결하는 방법

Java를 사용하는 동안 속도를 향상시킬 수있는 방법이 있습니까? (즉, 기본 sdk를 사용하지 마십시오)?

+0

얼마나 자주 값을 쓰고 있습니까? 당신이 시작하고 잊어 버리는 것에 있어야합니다. – CaseyB

+0

끊임없이 객체를 파괴하는 Java GC의 문제를 해결하기 위해 하나의 정점 버퍼를 사용하여 많은 메쉬를 처리합니다. 프로그램에 많은 메쉬가 있기 때문에 메쉬 당 하나의 객체가 있으면 GC가 미쳐 버립니다. GC 컬렉션은 오래된 Android 휴대 전화에서 매우 느립니다. 물론 내가 할 수있는 한, 나는 값을 재사용하고있다. – Moncader

답변

0

일반적으로 할당을 피하십시오. 버퍼 풀을 사용하고 필요에 따라 주변을 둘러 봅니다. 몇 가지 표준 크기를 가질 수 있으며 성능에 대한 대가로 끝에 몇 바이트를 낭비 할 수 있습니다. 또한, OpenGL을 사용할 때 대개 스킨이나 애니메이션을하지 않는 한 모든 프레임마다 버퍼를 다시 작성할 필요가 없습니다. 일반적으로 미리 구운 배열을 가지고 있고, 행렬을 사용하여 객체를 변형하면됩니다.

+0

할당은 문제가되지 않습니다. 프로그램 시작시 한 번만 할당합니다. 이것은 느린 put() 메소드로 할당 된 버퍼를 변경하는 것입니다. 버퍼를 다시 쓰는 것에 관해서는, 값을 변경하는 몇 가지 버퍼가있는 Android의 Java에서는 메모리 소비로 인해 수백 개의 별도 버퍼를 할당하는 것이 낫다는 것을 알게되었습니다. 몇 개의 버퍼를 사용하고 필요에 따라 값을 변경합니다 (슬프게도 모든 프레임). – Moncader

+0

이것은 완전한 답변은 아니지만, 처음에는이 문제를 피하기 위해 최선의 조언을 제공합니다. 그래서 나는 당신에게 현상금과 답을주었습니다 (유용한 정보이므로 어쨌든) – Moncader

+0

고마워요! 진정한 "duh"스타일의 나의 유일한 제안은 매 프레임마다 값을 변경하지 않는 것입니다. 무엇이 바뀌고 있습니까? 메쉬가 변형 되었습니까? 변경 버퍼와 정적 버퍼를 구분하고 모든 변경 데이터를 해당 버퍼의 동일한 영역 내에 보관할 수 있습니까? (= 처음에는 모두 예를 들어) – EboMike

0

실제로 할 수있는 유일한 일은 일자리를 배치하고 벌금이 잠김과 잠금 해제로 인해 발생하기 때문에 휴대 전화의 구현이 적절하길 바란다는 것입니다. 전화를 배치하면 드라이버가 잠기고 잠금을 해제해야합니다. "자발적으로"수행하면 항상 잠금 및 잠금 해제되므로 상당한 성능 저하가 발생합니다. 드라이버가 각 호출 대신 버퍼에 한 번만 맵핑 할만큼 충분히 똑똑하지 않은 경우 가장 좋은 방법은 단순히 put 수를 최소화하는 것입니다.

+0

드라이버가 Java의 네이티브 버퍼로해야 할 일은 무엇입니까? 느린 부분은 버퍼를 OpenGL 메모리로 업로드하지 않고 실제 Java 버퍼 자체를 업로드하는 것입니다. – Moncader

1

나는 자바와 JOGL을 통합 비슷한 문제가 발생했습니다 - 내 솔루션은 C에서 버퍼 자원을 관리하고, 방법

jobject NewDirectByteBuffer(JNIEnv * env, void * address, jlong capacity); 

를 사용하여 Java로 버퍼 포인터를 전달하는 JNI를 사용하는 것이 었습니다 jni.h에 있습니다. 오프셋을 버퍼로 업데이트해야하는 경우 리플렉션을 사용하여 java.nio.Buffer에있는 "address"필드를 수동으로 수정하십시오. 더 많은 요소를 추가하면 C의 버퍼 용량을 초과하게되므로 C의 배열 목록을 사용하고 직접 버퍼가 목록의 배열 백업을 가리 키도록하십시오.

+0

매우 흥미로운 솔루션입니다. 그러나 나는 네이티브 코딩에서 멀리하고 싶습니다. 나는 나중에 이것을 염두에두고있을 것이다. – Moncader

관련 문제