【发布时间】:2015-08-05 00:44:47
【问题描述】:
我有这样的结构
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(); ...
等等,但是有些类有其他方法必须像这样循环,我不能从父级调用它们。
对于渲染方法...只要坚持一个事实,你必须在很长一段时间内在短时间内循环多次。
我无法通过这个...我被困在这里很长一段时间,我不知道如何解决这个问题。
【问题讨论】:
-
我觉得 Lambda 在这里循环会更快,因为嵌套的 foreach 循环将发生
listOfAs.count*listOfBs.count*listOfCs.count次,而 lambda 使用某种形式的 hashjoin 或内部正确完成加入可以做到listOfAs.count+listOfBs.count+listOfCs.count次。我会写它的证明,但这不会回答你的问题。 -
这听起来像是首先将您的实体渲染为临时图像,然后在paint/paintComponent中绘制它的情况......而且,您真的不需要每秒渲染60倍;眼睛只有大约 24 倍的效果
-
@Adam 我不确定你指的是什么,但恐怕如果没有一个好的解释,我不相信!有许多对象需要迭代;没有多少加入可以减少这个数字,当然?我的直觉是考虑利用并发性。另一个优化可能是确定哪些像素将被重绘并仅绘制最后一个值,尽管这样做的成本最终可能会超过收益。
-
您是否需要一直重新渲染它们?一个经典的解决方案是跟踪真正发生变化的内容并仅重新渲染。
-
您确定 A、B 和 C 相关吗?或者他们是依赖关系?
标签: java for-loop game-engine