그래서 첫 번째 게임을 만들었습니다. 컴퓨터에서 작동하지만 (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();
}
}
}
}
실제로 이러한 업데이트 호출을 제거하려고했지만 도움이되지 않으므로 문제가 없습니다.
자세한 내용이 필요합니다. 이것은 2 차원 또는 3 차원 게임입니까? 2D라면 scene2d를 사용하고 있습니까? 그것은 직교 카메라 또는 원근 카메라입니까? 퍼포먼스 문제가 그려지는 객체의 수보다는 가비지 컬렉션 때문이 아닌가? – Tenfour04
3D로 문제가 생길 경우를 대비하여 [this] (http://pixelscientists.com/blog/posts/quick-solution-for-3d-culling-in-libgdx) 매우 간단한 방법을 사용할 수 있습니다. – noone
2D입니다. Scene2D를 사용하고 있지 않습니다. :) Ortographic 카메라. 나는 모른다. 그러나 나는 이것이 문제라고 생각한다. 그러나 나는 그것이 쉬운 일이라고 생각하고 있었다. : D 나는 그것을 3D로하는 법을 알고 싶다. : D Btw. 나는 그 링크를 살펴볼 것이다. – Kalir4488