2014-10-22 2 views
0

그래서 첫 번째 게임을 만들었습니다. 컴퓨터에서 작동하지만 (60FPS) 내 모바일에서는 50FPS가 있고 때로는 30으로 점프하고 다시 돌아옵니다. 지연과 같이 보입니다. 모든 객체를 ArrayList에 저장했습니다. 그래서 저는 생각합니다. 왜냐하면 저는 모든 것을 렌더링하고 있기 때문에 카메라 시각에있는 것만 렌더링하는 방법을 알고 싶습니다. 뷰포트를 사용하려고했으나 여전히 렌더링 중이지만 볼 수는 없습니다. 그래서 내 질문은 어떻게 카메라보기에서 뭔가 계산하는 것입니다.LibGDX는 카메라에서만 볼 수있는 경우에만 렌더링합니다.

카메라보기에있는 경우 렌더링하려고했습니다. 나는 그것으로 문제를 겪고있다.

public void render() { 
      if (space == 1){ //if you are alive.. space 1 means you are alive, 0 means you are in menu 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      sb.setProjectionMatrix(cam.combined); 
      camera.position.x = player1.x + player1.getSize()/2; 
      camera.position.y = player1.y + player1.getSize()/2; 
      camera.update(); 
      sb.setProjectionMatrix(camera.combined); 
      sb.begin(); 
      sb.draw(bg, 0, 0, 1920 , 1080); 
      //HP //it means food 
      if (HP > 12.4f) 
      { 
       sb.draw(Jedlo2, player1.x + (450 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP < 0.5f) 
      { 
       sb.draw(Jedlo, player1.x + (450 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP < 12.5f) 
      { 
       sb.draw(Jedlo3, player1.x + (450 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      //kornut 2 
      if (HP > 37.4f) 
      { 
       sb.draw(Jedlo2, player1.x + (500 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP > 24 && HP < 37.5f) 
      { 
       sb.draw(Jedlo3, player1.x + (500 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP < 25) 
      { 
       sb.draw(Jedlo, player1.x + (500 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      //kornut 3 
      if (HP > 62.4f) 
      { 
       sb.draw(Jedlo2, player1.x + (550 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP > 49.9f && HP < 62.5f) 
      { 
       sb.draw(Jedlo3, player1.x + (550 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP < 50) 
      { 
       sb.draw(Jedlo, player1.x + (550 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      //kornut 4 
      if (HP > 87.4f) 
      { 
       sb.draw(Jedlo2, player1.x + (600 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP > 74.9f && HP < 87.5f) 
      { 
       sb.draw(Jedlo3, player1.x + (600 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      else if (HP < 75) 
      { 
       sb.draw(Jedlo, player1.x + (600 + player1.seeSize()/2), player1.y + (320 + player1.seeSize()/2), 50, 50); 
      } 
      //HP 
      font.draw(sb, "Score: " + player1.getScore(), player1.x - (620 - player1.seeSize()/2), player1.y + (370 + player1.seeSize()/2)); 
    h.draw(sb, "FPS: " + Gdx.graphics.getFramesPerSecond(), player1.x - (620 - player1.seeSize()/2), player1.y + (300 + player1.seeSize()/2)); 
      sb.end(); 
     //entities 
     for (Entity e : entities) 
      { 
       e.render(sb); 
      } 
     //entities 
     //Touchpad 
      player1.setrlx(player1.pos(true) + touchpad.getKnobPercentX()*blspeed); 
      player1.setrly(player1.pos(false) + touchpad.getKnobPercentY()*blspeed); 
      if (touchpad.getKnobPercentX()*blspeed > 0.0f && touchpad.getKnobPercentY()*blspeed > -1.5f && touchpad.getKnobPercentY()*blspeed < 1f) 
      { 
       player1.an.setRow(0); 
      } 
      else if (touchpad.getKnobPercentX()*blspeed < 0.0f && touchpad.getKnobPercentY()*blspeed < 1.0f && touchpad.getKnobPercentY()*blspeed > -1.5f) 
      { 
       player1.an.setRow(1); 
      } 
      else if (touchpad.getKnobPercentY()*blspeed > 0.0f) 
      { 
       player1.an.setRow(3); 
      } 
      else if (touchpad.getKnobPercentY()*blspeed < 0.0f) 
      { 
       player1.an.setRow(2); 
      } 
      //Touchpad 
      Gdx.input.setInputProcessor(stage); 
      stage.act(Gdx.graphics.getDeltaTime()); 
      stage.draw(); 
      HP -= 0.05f; 
      time += Gdx.graphics.getDeltaTime(); 
      time2 += Gdx.graphics.getDeltaTime(); 
      if (time >= period) 
      { 
       time -= period; 
       update(); 
      } 

      if (time2 >= p2) 
      { 
       time2 -= p2; 
       updatemobs(); 
      } 
      } 
      else if (space == 0) //if you are in menu, my problem is if you are not in menu so you dont need to check this //right now, in this code, the menu is not updated, but there is only small things, you dont need to check that. 
      { 
       Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
       entities.clear(); 
       JukeBox.stop("water"); 
       if (player1.getScore() > lastscore) 
       { 
        Bin.create(player1.getScore()); 
        lastscore = player1.getScore(); 
       } 
       sb.setProjectionMatrix(camera.combined); 
       sb.setProjectionMatrix(cam.combined); 
       sb.begin(); 
       sb.draw(but, 1280/2.3f, 720/2.4f, 200, 100); 
       if (player1.getScore() > 0) 
       { 
        offx2 = h.getBounds("Your Score: " + player1.getScore()).width/2f; 
        h.draw(sb, "Your Score: " + player1.getScore(), 1280/2-offx2, 600); 
       } 
       offx = fo.getBounds("Your highscore: " + player1.getScore()).width/2f; 
       fo.draw(sb, "Your highscore: " + lastscore, 1280/2-offx, 700); 
       sb.end(); 
       if (Gdx.input.isButtonPressed(0)) 
       { 
        x = Gdx.input.getX(); 
        y = Gdx.input.getY(); 
        if (x > 1279/2.3f && x < 1725/2.3f && y > 775/2.4f && y < 1000/2.4f) 
        { 
         JukeBox.play("button"); 
        space = 1; 
        player1.setScore(); 
        player1.setPos(); 
        player1.SetrlSize(); 
        // cr(); 
        cr(); 
        } 
       } 
      } 
     } 

실제로 이러한 업데이트 호출을 제거하려고했지만 도움이되지 않으므로 문제가 없습니다.

+0

자세한 내용이 필요합니다. 이것은 2 차원 또는 3 차원 게임입니까? 2D라면 scene2d를 사용하고 있습니까? 그것은 직교 카메라 또는 원근 카메라입니까? 퍼포먼스 문제가 그려지는 객체의 수보다는 가비지 컬렉션 때문이 아닌가? – Tenfour04

+0

3D로 문제가 생길 경우를 대비하여 [this] (http://pixelscientists.com/blog/posts/quick-solution-for-3d-culling-in-libgdx) 매우 간단한 방법을 사용할 수 있습니다. – noone

+0

2D입니다. Scene2D를 사용하고 있지 않습니다. :) Ortographic 카메라. 나는 모른다. 그러나 나는 이것이 문제라고 생각한다. 그러나 나는 그것이 쉬운 일이라고 생각하고 있었다. : D 나는 그것을 3D로하는 법을 알고 싶다. : D Btw. 나는 그 링크를 살펴볼 것이다. – Kalir4488

답변

1

카메라의 위치와 크기를 알면 다양한 물체의 위치를 ​​알 수 있습니다. 따라서 무엇을 그리고 무엇을 그리지를 계산할 수 있습니다. 사물의 위치를 ​​확인하기 만하면 훨씬 효율적으로 그림을 그릴 수 있습니다.

미리 그리는 부분을 알고 있으면 모든 개체 좌표를 탐색 할 필요가 없습니다. 위치에 고정되어있는 타일 맵의 경우 타일을 그리는 것과없는 것을 결정하기 쉽습니다. 좀 더 동적 인 객체의 경우 객체를 목록에 배치하고 위치에 따라 정렬 할 수 있습니다. 객체가 많은 경우 효율적으로 정렬하려면 해시 맵이나 쿼드 트리를 조사해야합니다.

화면 밖에서 많은 일을하는 경우 게임 세계를 조각으로 나누고 실제 화면 가까이에서 조각을 업데이트/그릴 수 있습니다. 즉, 세계의 조각/섹션에서 동적 개체를 제거하고 추가해야합니다. 실제로 너비가 4 화면 너비로 움직여야 할 필요가 있다면 고려해보십시오.

추 신 : 그리기 호출로 인해 FPS에 문제가 있습니까? 스프라이트 시트, 과도한 루프 등을 사용하고 있습니까?

편집 각 프레임을 많이 그리는 위치를 지정했지만 어디에서이 루프를 찾을 수 없는지를 명시하셨습니다. 나는 어떤 hud 요소만을 보았고 Jedlojedlo2jedlo3이 그려지는데, 이것은 분명히 병목 현상이 될 수 없습니다.

단계별로 조금 더 연습하십시오. 화면과 무대에 익숙해 지도록하십시오. 이러한 단계를 통해 허/UI를 그릴 수 있기 때문입니다. 대신 jedlo1 to 3 대신 프레임을 사용하여 메서드 또는 심지어이 작업을 수행하는 클래스를 만들 수 있습니다. 이렇게하면 방법과 주 수업을 깨끗하고 체계적으로 유지할 수 있습니다.

+0

이 스프라이트 시트가 무슨 뜻인지 잘 모르겠지만, 내 애니메이션은 그림처럼 구성되어 있습니다. 그래서 애니메이션처럼 생겼습니다. 그것은 TextureRegion.split (...); 과도한 루프? 내가 아닐 것 같아. : D 아마도 게임의 핵심을 내 렌더링 func에있는 모습으로 공유 할 수 있지만, 엔티티를 그리는 비트 맵을 그릴 때만 이미지를 그려야합니다. 2 개의 스프라이트 배치가 있습니다. 이미지, 텍스트에 대한 호출 .. 두 번째 엔티티를 그리는 데 사용하고 – Kalir4488

+0

Google 스프 라이트 시트. 20 개의 스프라이트가있는 단일 이미지를로드하면 20 개의 이미지를로드하는 것이 더 효율적입니다. 그리기 스프라이트를 화면에서 제외 시키십시오. – Madmenyo

+0

Cant는 다음과 같이 이해합니다. D : 16 개의 작은 이미지 (스프라이트, 애니메이션 .. : D)가 있습니다. 16 개의 이미지 (모든 단계마다 1 개의 이미지)가로드되지 않습니다. 1 개의 이미지 만로드해야합니다. 네, 그렇습니다. – Kalir4488

관련 문제