每秒多次调用许多对象的许多方法

时间:2015-08-03 19:30:03

标签: java for-loop game-engine

我有这样的结构

  abstract Class Entity {
    //some variables... 
    //some methods ...
    public abstract void render(Graphics g);
    }

那是父母..现在我有3个孩子..

Class A extends Entity{}
Class B extends Entity{}
Class C extends Entity{} 

每个类都有一些不同的东西可以渲染。例如,绘制黄色圆圈,第二个绿色文本,第三个是显示图像。

但是......有一件事。

Class A have List<B>... 
Class B have List<C>... 

一个实体有例如10个B ...每个B有20个C ...所以现在..我有一个渲染方法,每秒渲染60x .. 我必须从每个对象调用每个渲染方法。

所以我有类似的东西

for(A a : listOfAs){
   for(B b : listOfBs){
      for(C c : listOfCs){
         c.render(g);
      }b.render(g);
   }a.render(g);
}

现在,如果你想象我有更多这样的对象,我称这种方法每秒60次......我发现这真的......真的很糟糕......我不知道如何更好地解决这个问题。 ..我不认为每个循环的这个实际上是最好的解决方案。任何想法?

我正在考虑像这样实施这个孩子:

Entity x = new A(); ... 
Entity y = new B(); ... 

等但是有些类有其他方法需要像这样循环,我不能从父级调用它们。

对于渲染方法......只需坚持一个事实,即你必须在很短的时间内多次循环一段时间。

我无法通过这个...我被困在这里很长一段时间,我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

由于您的主要关注点似乎是渲染或不渲染某些实体,无论它们是否为子实体,您都应该对一般图形编程优化和技巧以及渲染引擎为提高性能所做的工作进行一些研究。渲染引擎的性能大幅提升并不是不必要的工作。

已经提到了一个,即确定哪个实际改变了状态并且只渲染它们。另一种方法是根据图形画布上每个实体的边界检查视图的边界,并仅渲染边界内的内容。无论您是2D还是3D,都可能会使事物重叠,因此您可以确定哪些实体被遮挡并避免渲染它们。如果您的子实体在父级的范围内,那么您可以避免渲染对象图的整个树,并避免迭代许多元素。

此外,通过检查必须重新渲染的实体的一部分,未被遮挡的部分等,可以部分地完成这些事情。这可能需要对API进行一些更改以传递实体中的边界。期望为每个项目渲染而不是整个图形上下文。

如果你不知道任何关于任何可渲染实体的信息,比如脏状态或边界,那么你就不得不迭代它们并且每个都调用渲染一个。

答案 1 :(得分:0)

我不确定我是否会遵循...但你是否正在制作一个由其他几个实体组成的实体?无论你多么想到这一点,你总是必须访问每个实体一次。你选择什么样的循环并不重要。

但是,如果你有一个由一堆精灵组成的实体,我建议创建一个新的纹理并将这些精灵渲染到该纹理上一次。然后你只需要在每帧渲染纹理。说得通?

答案 2 :(得分:0)

我找到了一位工作的朋友,他看了看并帮助我稳定了它。谢谢大家的提示和帮助。我不认为lambdas在这里可以提供很多帮助。

很难解释我在这个项目中做了什么。它根本不是游戏......它有所不同。我有双重渲染,所以每秒真的是2 * 30次。我只是在玩我以后可以在我的引擎中使用的物体。但是这个问题让我陷入了困境。

再次。谢谢大家。