these awesome tutorials을 사용하여 웹 GL을 배우려고 노력했습니다. 제 목표는 캔버스 기반의 jawsJS를 대체 할 수있는 매우 간단한 2D 게임 프레임 워크를 만드는 것입니다.내 간단한 webgl 데모가 너무 느린 이유
필자는 기본적으로 스프라이트를 만들고 주변을 움직일 수 있기를 원한다.
이 작업을 수행하는 데모를 정리했지만 성능 문제가 발생하여 추적 할 수 없습니다. 일단 화면에 ~ 2000 정도의 스프라이트가 생기면 프레임 속도 탱크와 나는 왜 작동하지 못합니다. 이 demo of the pixi.js webgl framework과 비교하면 ~ 30000 토끼 정도에서 (내 컴퓨터에서) 프레임을 잃기 시작합니다. 조금 실망합니다.
My demo (framework source)에는 5002 개의 스프라이트가 있으며 그 중 2 개는 이동하며 프레임 속도는 화장실에 있습니다.
pixi.js 프레임 워크를 통해 다르게 수행하려고 시도했지만, 500kloc이고 훨씬 더 많은 작업을 수행 할 수 없습니다.
this answer 나는 근본적으로 내가하고있는 일이 대략 옳다는 것을 확인했다. 나의 알고리즘은 대답과 거의 같지만 그 이상이 있어야한다.
지금까지 몇 가지를 시도해 보았습니다. 하나의 '프레임 버퍼'를 사용하여 정의 된 단일 모양으로 각 스프라이트에 대해 5000 번 번역되었습니다. 이것은 프레임 속도를 약간 도와 주었지만, pixi 데모를 닫을 수는 없었습니다 (모든 스프라이트가 같은 모양이어야한다는 것을 의미했습니다). 저는 모든 행렬 수학을 움직이지 않는 것으로 잘라 냈습니다. 그래서 그것도 아닙니다. 그것은 모두 drawArrays()
기능으로 내려 오는 것 같습니다. 단지 저를 위해 속도가 느려지지만, 단지 내 데모를 위해서입니다!
또한 텍스처 기반의 모든 항목을 제거해 보았습니다. 단편 쉐이더를 대신 간단한 블록 색상으로 대체했습니다. 그것은 사실상 아무런 차이가 없으므로 나는 dodgy 텍스처 처리를 범인으로 제거했습니다.
나는 정말로 어리석은 일을 추적하는 데 도움이 될 것입니다.
편집 : 여기 키를 잘못 이해하는 것이 틀림 없습니다. (0,0)
void main() {
gl_FragColor = vec4(0,1,0,1); // green
}
다음에 그릴까지 스프라이트를 설정합니다
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0, 1);
}
과 : 나는 슈퍼 간단한 정점과 프래그먼트 쉐이더로 변경, 기본에 바로 다시 전체를 제거 (1,1).
스프라이트가 5000 개이면 단일 프레임을 그리는 데 약 5 초가 걸립니다. 여기서 무슨 일이 일어나고있는거야?
업데이트 : 진행 중이지만 아직 할 일이 있습니다. 아래의 두 가지 대답이 모두 도움이되었습니다. 한 번에 많은 스프라이트에서 정점을로드하고 1 드로를 만드는 SpriteBucket 오브젝트를 작성함으로써 성능을 크게 향상 시켰습니다. 처음에는 5000 개의 스프라이트가 하나의 버퍼에로드되는 속도가 매우 느 렸지만 실제 속도는 가장 느 렸지만 스프릿을 여러 버킷에서 500 개까지 버리면 다시 ~60fps가됩니다. 이제는 모든 질감을 다시 넣을 필요가 있습니다! – MalphasWats