【问题标题】:Create() or Render() for creating instancesCreate() 或 Render() 用于创建实例
【发布时间】:2013-09-06 17:31:06
【问题描述】:

我正在通过使用项目和教程来学习 Java、LibGDX、Box2D,我目前正在学习一个教程,我想提出一个关于 render() 循环和 create() 方法的问题。

所以总是先调用create(),然后调用render()。如果我正在创建一堆实例,例如:

public class Game implements ApplicationListener {

    World world;
    Box2DDebugRenderer debugRenderer;
    OrthographicCamera cam;
    BodyDef bodyDef;
    CircleShape circle;
    FixtureDef fixtureDef;

我应该在这里使用new 构造函数吗?还是我应该在 create() 方法中这样做?

@Override
public void create() {

    world = new World(new Vector2(0, -10), true);
    debugRenderer = new Box2DDebugRenderer();
    cam = new OrthographicCamera(800 / 2, 480 /2);
    bodyDef = new BodyDef();
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(100, 300);
    circle = new CircleShape();
    circle.setRadius(6f);
    fixtureDef = new FixtureDef();

还是应该放在 render() 方法中?

我有点不确定哪个是最好的,在渲染中这样做似乎有点笨拙,这不会导致游戏在每次循环迭代时不断创建新实例导致性能问题吗?

哦,我想问一下,当我定义一个对象的属性时,比如 circle.setRadius(),create 方法会是正确的地方吗?

【问题讨论】:

  • 在声明属性时不要使用new,因为有些类,如果我没记错的话,比如SpriteBatch,需要初始化LibGDX的核心类,尤其是Gdx.graphics字段,然后才能被实例化否则会抛出异常。

标签: java libgdx jbox2d


【解决方案1】:

你应该明确在你的render循环中使用很多new。在桌面上这并不是什么大问题,但在手持设备上这会过于频繁地调用垃圾收集器,从而导致游戏延迟。

无论您是在属性声明中还是在create 中执行此操作都没有太大区别。在您的应用程序的生命周期中,两者都只执行一次。

【讨论】:

  • 谢谢。我正在查看一些代码 sn-ps 并且这个人正在一个方法中创建它们,在方法 circle.dispose(); 的末尾;被调用,如果你这样做,这会阻止垃圾收集器发疯吗?
  • @Gibbo 不,调用dispose() 不会阻止垃圾收集器。它甚至可能间接调用它,因为某些对象可能被设置为null。垃圾收集器何时启动并不是真正可预测的。一般来说,您应该尽量避免使用new,而是尽可能使用Pools。
  • 好的,谢谢,我还在学习,所以我的代码无论如何都会低效/废话,需要学习如何使用 libGDX 的池类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多