2012-03-26 6 views
3

저는 현재 Touhou-esque 총알 지옥 사수 게임을 개발 중입니다. 화면은 총알로 채워질 것입니다. (인스턴스화는 내가 원했던 것입니다.)하지만 저는 이것을 오래된 하드웨어에서 사용하기를 원합니다. 그래서 저는 지금이 라인을 따라 뭔가를하고 있습니다. 색상, 텍스처, 등등. 내가 이것을 알아낼 때까지.OpenGL 2D 성능 팁

glVertexPointer(3, GL_FLOAT, 0, SQUARE_VERTICES); 
for (int i = 0; i < info.centers.size(); i += 3) { 
    glPushMatrix(); 
    glTranslatef(info.centers.get(i), info.centers.get(i + 1), info.centers.get(i + 2)); 
    glScalef(info.sizes.get(i), info.sizes.get(i + 1), info.sizes.get(i + 2)); 
    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, SQUARE_INDICES); 
    glPopMatrix(); 
} 

이전 하드웨어에서 작동하기를 원하기 때문에 셰이더와 기타 등을 피하려고합니다. 거기에 설치가 약 80 다각형에 나를 실패합니다. 나는 이것에서 적어도 몇 백을 얻으려고합니다. info은 렌더링을위한 모든 장점을 가진 구조체입니다. 몇 가지 벡터 외에는 그다지 유용하지 않습니다.

저는 OpenGL을 처음 접했지만 적어도 할 수있는 모든 것을 들었습니다. 이 게임은 2D 게임입니다. SDL에서 Opengl으로 바꿨습니다. 더 재미있는 효과를 더 쉽게 만들어주기 때문입니다. 분명히 SDL은 다르게 작동하지만,이 문제는 결코 그것을 사용하지 못했습니다.

여기까지 뭔가 잘못되었습니다. 이전 하드웨어 (OpenGL 1.x)의 인스턴스를 올바르게 구현하려면 어떻게해야합니까? 또한 성능 향상을위한 조언을 제공하십시오.

+0

GDebugger와 같은 도구를 사용하여 프로필을 만들었습니까? 그러면 병목 현상이 나타날 것입니다. – Pubby

+0

가능한 한 드로우 콜을 사용하고 모든 것을 VA에 넣으십시오 (모든 번역은 CPU 측에서 직접하십시오). – harold

답변

9

또한 성능 향상을위한 조언을 제공해주십시오.

당신이 스프라이트를 사용하려고하는 경우

....

  1. 로드 하나의 거대한 질감에 모든 스프라이트. 적합하지 않으면 텍스처를 여러 개 사용하고 텍스처를 많이 사용하지 않도록 텍스처 수를 줄이십시오.
  2. 텍스처를 전환하고 OpenGL 상태를 가끔 변경하십시오. 이상적으로는 텍스처를 한 번 설정하고 가능한 한 모든 것을 그려야합니다.
  3. 텍스쳐 글꼴을 텍스트로 사용하십시오. FTGL 글꼴은 멋지지만 복잡한 글꼴에서는 성능이 매우 떨어질 수 있습니다.
  4. 가능하면 알파 블렌딩을 피하고 알파 테스트를 사용하십시오.
  5. 알파 블렌딩을 할 때는 항상 알파 테스트를 사용하여 그리는 픽셀 수를 줄이십시오. 알파 == 0 인 픽셀이 많은 텍스처는 알파 테스트로 잘라냅니다.
  6. 매우 큰 스프라이트 수를 줄입니다. 거대한 화면 정렬/픽셀 정렬 스프라이트 (1024 * 1024)는 매우 우수한 하드웨어에서도 FPS를 떨어 뜨립니다.
  7. 비 2 크기 텍스처는 사용하지 마십시오. 특정 ATI 카드에서 성능이 크게 떨어졌습니다.

2D 스프라이트 기반를 들어 glTranslatef

(아마도, 카메라/투영 행렬 제외) 완전히 행렬을 피할 수있는 게임 (즉 중요합니다). 매트릭스가 2D 게임에서 당신에게 큰 도움이 될 것이라고 저는 생각하지 않습니다.

2d 게임을 사용하면 주 병목 현상이 GPU 메모리 전송 속도가되어 텍스처에서 화면으로 데이터를 전송할 수 있습니다. 따라서 "그리기 호출을 거의 사용하지 않음"과 "VA에 모든 것을 넣으십시오"는 도움이되지 않습니다. 하나의 스프라이트로 성능을 저하시킬 수 있습니다.그러나

, 당신은 벡터 그래픽을 사용하려고하는 경우 텍스처를 사용하지 않는, 그 조언의 대부분은 위 적용되지 않습니다 (area2048 (youtube) 또는 rez 참조), 이러한 게임은하지 않습니다 3D 게임과 매우 다르다. 이 경우 정점 배열, 정점 버퍼 객체 또는 표시 목록 (사용할 수있는 항목에 따라 다름)을 사용하고 행렬 함수를 사용하는 것이 합리적입니다. 병목 현상은 정점 처리가 될 것이기 때문입니다. 여전히 상태 스위치의 수를 최소화해야합니다.

+0

위대한 팁! "매우 큰 스프라이트의 수를 줄여라. 거대한 스크린 정렬/픽셀 정렬 스프라이트 (1024 * 1024)는 매우 우수한 하드웨어에서도 FPS를 떨어 뜨릴 것이다." - 예를 들어 정적 배경으로 사용하기위한 크고 고화질 스프라이트가 있고 그것 없이는하고 싶지 않은 경우 어떻게해야합니까? 어떤 대안? – nietaki

+0

글 머리 기호가 화면을 범람하는 한 처음부터 그려지는 벡터 그래픽이됩니다. 그렇다면이 문제를 해결하는 현재의 방법으로 무엇을 할 수 있습니까? 답변을 기다리는 동안 버텍스 배열로 전환하여 눈에 띄게 개선되지는 않았지만 다소 빨리 완료되었습니다. 정확히 내가 뭘 잘못하고 있니? 이제 area2048을 살펴볼 것입니다. 게임은 대부분 벡터 그래픽으로 구성됩니다. – SpaceFace

+0

"VA에 모든 항목 넣기"는 여전히 텍스처가있는 스프라이트에 적용됩니다. 믿지 않니? 시도 해봐. 백만명의 무승부로 실제 성적이 좋지 않습니다. – harold