2012-01-03 5 views
4

17 픽셀 및 17 개의 버텍스 쉐이더를 사용하는 Android 용 OpenGL 라이브 벽지를 작성했습니다. 내 HTC Legend에서로드 및 컴파일하는 데 약 3 초가 걸립니다. 적재 시간은 약 20 %이며, 나머지는 컴파일 중입니다.Android에서 쉐이더로드/컴파일 속도를 높이는 방법

라이브 벽지는 전체 화면 앱이 실행될 때마다 파괴 된 OpenGL 컨텍스트를 가지고 있으며, 배경 화면이 다시 표시되면 모든 쉐이더, 텍스처 등을 다시로드해야하므로 화면이 약 3 시간 동결됩니다 초

:(나에게 받아 들일 때마다, 나는 약간의 독서를 한 적이 분명히, 그것은 쉐이더를 미리 컴파일 할 수 없습니다. 나는이 문제를 해결하기 위해 할 수있는 다른 무엇인가?로드에서 쉐이더를 컴파일하는 것이 가능 배경 스레드? 그럴 경우 일종의 진행 애니메이션을 보여줄 수 있습니다. 위대하지는 않지만 아무것도 아닌 것보다 더 좋을 것입니다 ...

[EDIT1] 속도를 높이는 또 하나의 큰 이유 이것은 OpenGL 기반 라이브 배경 화면 라이프 사이클 전체가 모든 장치에서 제대로 작동하기 어렵다는 것을 의미합니다 (이는 과소 평가입니다). 컨텍스트가 손실되거나 재생성 될 때마다로드 시간이 오래 걸리므로 원하는 것보다 더 많은 골칫거리를 추가합니다. 어쨌든 :

답변 1에서 알 수 있듯이 GL_OES_get_program_binary 확장 프로그램을 사용하여 일종의 컴파일 된 버전의 컴파일 된 컴파일 된 응용 프로그램을 만들려고했지만이 확장이 얼마나 광범위하게 설치 될지 걱정됩니다. 구현됩니다. 예를 들어 내 Tegra2 태블릿은 지원하지 않는 것 같습니다. 내가 고려하고

다른 접근 방법 :

1) Ubershader : 스위치 또는 문 경우, 하나 개의 큰 쉐이더에 모든 픽셀 쉐이더를 넣어. 이렇게하면 픽셀 쉐이더가 크게 느려지겠습니까? 셰이더가 너무 커서 커다란 레지스터/명령 수/텍스처 룩업 한계를 초과하게 만들까요? 버텍스 쉐이더도 마찬가지입니다. 이렇게하면 내 전체 셰이더 카운트가 1 픽셀과 1 버텍스 쉐이더로 줄어들고 잘하면 컴파일 링/링크를 더 빠르게 할 수 있습니다. 아무도 이것을 시도 했습니까? [EDIT2] 방금 시도했습니다. 하지마. 컴파일/링크가 막연한 "링크 실패"오류를 포기하기 전에 8 초가 걸립니다. (

2) 맨 처음에 쉐이더를로드/컴파일하지 않고 하나의 쉐이더를로드/컴파일합니다 처음 17 프레임에 대한 프레임 업데이트. 적어도 나는 디스플레이를 새로 고칠 것이고, 사용자에게 어떤 일이 일어나고 있음을 알리는 진행 바를 보여줄 수있다. 이것은 느린 장치에서는 잘 작동하지만, 빠른 장치에서는 전체 쉐이더가로드/컴파일 단계를 느리게 만들 수 있습니다.

+0

더 많은 해결책을 찾았습니까? – Zammbi

+1

Nope. 이제 모든 쉐이더를 하나의 프레임에로드하고 glViewport와 glClear를 사용하여 진행 막대를 그립니다. 슬프지만 작동합니다. –

답변

3

구현이 OES_get_program_binary을 지원하는지 확인하십시오.

+0

나는 그것을 할 것이다, 고마워! 내가 처음 컴파일 할 때 바이너리를 저장하고 다음 번에 다시로드하라는 제안을 한 것으로 가정합니다. SD 액세스에 대한 추가 권한이 필요하지만 그걸로 살 수 있다고 생각합니다. 일단 내가 더 많이 알고 있으면이 질문/답변을 업데이트 할 것입니다. –

+0

OK, 내가 소유 한 두 장치 (HTC 범례 및 Asus EEE 변환기)에서 시도해보십시오. 결과가 약간 놀랍습니다. 오래된 HTC Legend가이 확장을 지원하면 최신 "최고"NVidia Tegra2는 지원하지 않습니다. 반면 Asus에서 쉐이더를 컴파일하는 데는 훨씬 적은 시간이 걸립니다 (아직 시간을 정하지 않았지만 1 초 미만 임). 이 명령이 다양한 하드웨어 공급 업체에서 얼마나 광범위하게 구현되었는지,이 전체 캐싱 체계를 구현할 가치가 있는지 여부에 대해 조금 걱정이됩니다. –

+0

드라이버에서 바이너리를 어떻게 구합니까? – Zammbi

관련 문제