2014-06-12 2 views
0

타일을 사용하여 작은지도를 렌더링하는 데 사용하는 메서드가 있지만 렌더링이 끝나고 다른 메서드를 사용하여 "transY"변수를 변경하지 않으려면 아무 것도 발생하지 않으므로 RenderTesture()를 다시 만듭니다. 더 많은 수의 타일을 사용하면 응용 프로그램 속도가 느려지므로 어떻게 불필요한 렌더링을하지 않고이 작업을 수행 할 수 있습니까?OpenTK ES 1.1 텍스처 렌더링

void RenderTexture() 
{ 
    MakeCurrent(); 
    GL.Clear((int)All.ColorBufferBit | (int)All.DepthBufferBit); 
    GL.MatrixMode(All.Modelview); 
    GL.LoadIdentity(); 

    GL.Translate(-transX, transY, -10); 

    for (int i = 0; i < tileRows; i++) 
    { 
     for (int j = 0; j < tileColumns; j++) 
     { 
      GL.BindTexture(All.Texture2D, textureIds [i*tileColumns + j]); 
      GL.EnableClientState(All.VertexArray); 
      GL.EnableClientState(All.TextureCoordArray); 
      GL.PushMatrix(); 
      GL.Translate(j*2, -i*2, 0); 
      GL.VertexPointer(3, All.Float, 0, frontV); 
      GL.TexCoordPointer(2, All.Float, 0, frontT); 
      GL.DrawArrays (All.TriangleFan, 0, 4); 
      GL.PopMatrix(); 
     } 
    } 
    GL.DisableClientState(All.VertexArray); 
    GL.DisableClientState(All.TextureCoordArray); 

    SwapBuffers(); 
} 

아무에게 나 조언 해 주시면 매우 감사하겠습니다. 사전에

감사합니다!

답변

0

병목 현상은 상태 변경 량 (GL.BindTexture)과 그리기 통화량 (GL.DrawArrays)에 있습니다. 일반적으로 한 번의 그리기 호출에서 최대한 많이 그려야합니다.

간단한 방법의 고원은 "텍스처 아틀라스"를 사용하는 :

  • 의 모든 타일 정점을 결합 (이것은 "텍스처 아틀라스"입니다)

    1. 가 하나의 큰 텍스처에 모든 타일 텍스처를 결합 하나의 정점 배열로
    2. 전화 GL.BindTexture는 한 번에 모든 타일을 렌더링하기 위해 한 번 텍스처 아틀라스에게
    3. 전화 GL.DrawArrays를 결합하는
    ,536,

    다른 타일 텍스처를 어떻게 렌더링합니까? 간단 : 버텍스 텍스쳐 좌표를 변경하여 텍스쳐 아틀라스 안에서 올바른 타일을 가리 키도록합니다.

    단일 1024x1024는 256 개의 별개의 64x64 타일을 수용 할 수 있습니다. 게임에서 고유 한 타일의 양에 따라 여러 텍스처 토공을 사용해야 할 수도 있습니다. 또한지도의 크기에 따라 각각에 대해 별도의 정점 배열을 사용하여 "지역"으로 분할 할 수도 있습니다 (모니터에 1000 개의 타일 만 표시 할 수있는 경우 모든 프레임에 1 백만 개의 타일을 렌더링하지 않으려합니다).

    그 자체로 측정 가능한 성능 향상을 제공합니다. 이 작업이 끝나면 VBO (Vertex Buffer Objects)를 통해 GPU에 버텍스 배열을 저장하여 두 번째 큰 효과를 얻을 수 있습니다.

  • 0

    대단히 감사합니다.

    "질감 아트라스"전략은 아주 좋은 아이디어 일 수 있습니다. 어젯밤에 구현했는데 렌더링 속도가 빨라지고있는 것처럼 보입니다. I는 단일 텍스쳐를 이용하여 하나의 큰 N × M 개의 타일 비트 맵을로드하여, 별도의 텍스처를 사용하여 N × M 개의 타일의 로딩을 감소했고 I는 (새로운 맵 치수에 관해서 - N × M 개의) 정점 배열을 변경하는 방법을 구현 한

    public void UpdateFrontVertex(int rowNumber, int columnsNumber) 
        { 
         for (int i = 0; i < 12; i++) { 
          if (i % 3 == 0) 
           frontVertex [i] = defaultFrontVertex[i] * rowNumber; // x-axis 
          else if (i % 3 == 1) 
           frontVertex [i] = defaultFrontVertex[i] * columnsNumber; // y-axis 
          else if (i % 3 == 2) 
           frontVertex [i] = defaultFrontVertex[i]; // z-axis 
         } 
        } 
    

    후을 그, 나는 나의지도를 가지고있다!

    새 구현 전략을 사용하기 위해 패닝 및 확대/축소 기능을 변경해야하기 때문에 구현 전에 성능을 비교할 수 없습니다. 예를 들어, 내 중앙 타일 인 타일을 알아 내기 위해 계산을 확대하기위한

    //zoom in 
    transY = (transY * 2 + 1); 
    transX = (transX * 2 + 1); 
    
    //zoom out 
    transX = ((transX - 1)/2); 
    transY = ((transY - 1)/2); 
    

    을 사용했습니다, 그 후 모든 둥근 타일을로드 할 수 있습니다.

    큰 도움을 다시 한번 감사 드리며, 이제 팬 및 확대/축소 구현으로 진행하겠습니다.

    +0

    기꺼이 도와 드리겠습니다. :) –