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 프레임에 대한 프레임 업데이트. 적어도 나는 디스플레이를 새로 고칠 것이고, 사용자에게 어떤 일이 일어나고 있음을 알리는 진행 바를 보여줄 수있다. 이것은 느린 장치에서는 잘 작동하지만, 빠른 장치에서는 전체 쉐이더가로드/컴파일 단계를 느리게 만들 수 있습니다.
더 많은 해결책을 찾았습니까? – Zammbi
Nope. 이제 모든 쉐이더를 하나의 프레임에로드하고 glViewport와 glClear를 사용하여 진행 막대를 그립니다. 슬프지만 작동합니다. –