Jan*_*ina 5 java for-loop game-engine
我有这样的结构
abstract Class Entity {
//some variables...
//some methods ...
public abstract void render(Graphics g);
}
Run Code Online (Sandbox Code Playgroud)
那是父母..现在我有3个孩子..
Class A extends Entity{}
Class B extends Entity{}
Class C extends Entity{}
Run Code Online (Sandbox Code Playgroud)
每个类都有一些不同的东西做渲染.例如,绘制黄色圆圈,第二个绿色文本,第三个是显示图像.
但是......有一件事.
Class A have List<B>...
Class B have List<C>...
Run Code Online (Sandbox Code Playgroud)
一个实体有例如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);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你想象我有更多这样的对象,我称这种方法每秒60次......我发现这真的......真的很糟糕...我不知道如何更好地解决这个问题......我不要认为每个循环的这个实际上是最好的解决方案.任何想法?
我正在考虑像这样实施这个孩子:
Entity x = new A(); ...
Entity y = new B(); ...
Run Code Online (Sandbox Code Playgroud)
所以但是有些类有其他方法必须像那样循环,我不能从父级调用它们.
对于渲染方法......只要坚持一个事实,你必须在很短的时间内多次循环一段时间.
我无法通过这个...我被困在这里很长一段时间,我不知道如何解决这个问题.
小智 1
由于您主要关心的似乎是渲染或不渲染某些实体,无论它们是否是子实体,因此您应该对一般图形编程优化和技巧以及渲染引擎如何提高性能进行一些研究。渲染引擎性能的巨大提升是不做不必要的工作。
前面已经提到过,那就是确定哪些状态实际发生了变化并只渲染它们。另一种方法是根据图形画布上每个实体的边界检查视图的边界,并仅渲染边界内的内容。无论您使用 2D 还是 3D,都可能会有重叠的事物,因此您可以确定哪些实体被遮挡并避免渲染它们。如果您的子实体位于父实体的范围内,那么您可以避免渲染对象图的整个树并避免许多元素的迭代。
此外,这些事情可以通过检查必须重新渲染的实体的一部分、未被遮挡的部分等来部分完成。这可能需要对 API 进行一些更改以传递实体预期的边界渲染每个项目而不是整个图形上下文。
如果您对任何可渲染实体一无所知,例如脏状态或边界,那么您将不得不迭代所有实体并调用每个实体的渲染。