【发布时间】:2014-10-22 12:05:04
【问题描述】:
所以,我创建了我的第一个游戏。在计算机上它可以工作(60FPS),但在我的手机上,我有 50FPS,有时它会跳到 30 又回来,你会看到它像一个滞后。我已将所有对象存储在 ArrayList 中。所以,我认为,这可能是因为我正在渲染所有东西,所以我想知道,只有当它们在相机视图中时如何渲染它们。我尝试使用视口,但它们仍在渲染,但您看不到它们。所以我的问题是,如何计算相机视图中是否有东西。
如果它们在相机视图中,我会尝试渲染它们。我遇到了麻烦。
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();
}
}
}
}
实际上,我尝试删除那些更新调用,但它没有帮助,所以问题不在那里。
【问题讨论】:
-
需要更多细节。这是2d还是3d游戏?如果是 2d,您是否使用 scene2d?它是正交相机还是透视相机?您确定您的性能问题不是由于垃圾收集而不是绘制的对象数量吗?
-
如果您在 3D 中遇到问题,您可以使用 this 非常简单的方法。
-
它是 2D,我没有使用 Scene2D。 :) 正交相机。我不知道,但我认为这是问题所在。但我认为这很容易.. :D 我也想知道如何在 3D 中做到这一点。 :D 顺便说一句。我会看看那个链接。
-
也许这会有所帮助:stackoverflow.com/a/18701998/1663265
-
我做到了,我的 FPS 没有改变,所以我不知道 :D
标签: java optimization camera libgdx render