每秒调用许多 objects 多次方法
Calling many methods of many objects many times per second
我有这样的结构
abstract Class Entity {
//some variables...
//some methods ...
public abstract void render(Graphics g);
}
那就是 parent ..现在我有 3 children..
Class A extends Entity{}
Class B extends Entity{}
Class C extends Entity{}
每个 class 都有一些不同的渲染内容。一个是例如绘制黄色圆圈,第二个是绿色文本,第三个是显示图像。
但是……有一件事。
Class A have List<B>...
Class B have List<C>...
例如,一个实体有 10 个 B……每个 B 有 20 个 C……所以现在……我有一个每秒渲染 60x 的渲染方法……
而且我必须从每个 object 调用每个渲染方法。
所以我有这样的东西
for(A a : listOfAs){
for(B b : listOfBs){
for(C c : listOfCs){
c.render(g);
}b.render(g);
}a.render(g);
}
现在,如果您想象我有更多这样的 object 并且我每秒调用此方法 60x ...我发现这真的...非常糟糕的做法..我不知道如何更好地解决这个问题......我不认为每个循环的这个实际上是最好的解决方案。任何人有什么想法吗?
我正在考虑像那样实施 child :
Entity x = new A(); ...
Entity y = new B(); ...
等等,但是一些 classes 有其他方法必须像那样循环,我不能从 parent 调用它们。
对于 render 方法...只要坚持这样一个事实,你必须在很短的时间内多次循环一些东西很长一段时间。
我无法通过这个取得进展...我被困在这里很长时间了,我不确定如何解决这个问题。
由于您主要关心的似乎是渲染或不渲染某些实体,无论它们是否是子实体,您应该对一般图形编程优化和技巧以及渲染引擎如何提高性能进行一些研究。渲染引擎性能的一大提升是不做不必要的工作。
一个已经提到了,就是判断哪个真正改变了状态,只渲染它们。另一种方法是根据图形 canvas 上每个实体的边界检查视图的边界,并且只渲染边界内的东西。无论您是 2D 还是 3D,您都可能有重叠的东西,因此您可以确定哪些实体被遮挡并避免渲染它们。如果您的子实体在父实体的范围内,那么您可以避免渲染对象图的整个树并避免许多元素的迭代。
此外,这些事情可以通过检查必须重新渲染的实体部分、未被遮挡的部分等来部分完成。这可能需要对您的 API 进行一些更改将实体预期呈现的边界而不是整个图形上下文传递给每个项目。
如果您对任何可渲染实体一无所知,例如脏状态或边界,那么您将不得不迭代所有这些实体并为它们中的每一个调用渲染。
我不确定我是否完全理解...但是您是在创建一个由多个其他实体组成的实体吗?无论您对此考虑多少,您总是必须访问每个实体一次。选择什么样的循环并不重要。
但是,如果您有一个由一堆精灵组成的实体,我建议您创建一个新纹理并将这些精灵渲染到该纹理上一次。然后你只需要在每一帧渲染那个纹理。说得通?
我找到了一个工作的朋友,他看了看并帮助我稳定了它。谢谢大家的提示和帮助。我不认为 lambda 在这里可以提供很多帮助。
很难解释我在这个项目中所做的事情。这根本不是游戏......这是不同的东西。我得到了双重渲染,所以它实际上是每秒 2* 30 次。我只是在玩我以后可以在我的引擎中实际使用的对象负载。但是这个问题让我陷入了很长一段时间。
再次。谢谢大家。
我有这样的结构
abstract Class Entity {
//some variables...
//some methods ...
public abstract void render(Graphics g);
}
那就是 parent ..现在我有 3 children..
Class A extends Entity{}
Class B extends Entity{}
Class C extends Entity{}
每个 class 都有一些不同的渲染内容。一个是例如绘制黄色圆圈,第二个是绿色文本,第三个是显示图像。
但是……有一件事。
Class A have List<B>...
Class B have List<C>...
例如,一个实体有 10 个 B……每个 B 有 20 个 C……所以现在……我有一个每秒渲染 60x 的渲染方法…… 而且我必须从每个 object 调用每个渲染方法。
所以我有这样的东西
for(A a : listOfAs){
for(B b : listOfBs){
for(C c : listOfCs){
c.render(g);
}b.render(g);
}a.render(g);
}
现在,如果您想象我有更多这样的 object 并且我每秒调用此方法 60x ...我发现这真的...非常糟糕的做法..我不知道如何更好地解决这个问题......我不认为每个循环的这个实际上是最好的解决方案。任何人有什么想法吗?
我正在考虑像那样实施 child :
Entity x = new A(); ...
Entity y = new B(); ...
等等,但是一些 classes 有其他方法必须像那样循环,我不能从 parent 调用它们。
对于 render 方法...只要坚持这样一个事实,你必须在很短的时间内多次循环一些东西很长一段时间。
我无法通过这个取得进展...我被困在这里很长时间了,我不确定如何解决这个问题。
由于您主要关心的似乎是渲染或不渲染某些实体,无论它们是否是子实体,您应该对一般图形编程优化和技巧以及渲染引擎如何提高性能进行一些研究。渲染引擎性能的一大提升是不做不必要的工作。
一个已经提到了,就是判断哪个真正改变了状态,只渲染它们。另一种方法是根据图形 canvas 上每个实体的边界检查视图的边界,并且只渲染边界内的东西。无论您是 2D 还是 3D,您都可能有重叠的东西,因此您可以确定哪些实体被遮挡并避免渲染它们。如果您的子实体在父实体的范围内,那么您可以避免渲染对象图的整个树并避免许多元素的迭代。
此外,这些事情可以通过检查必须重新渲染的实体部分、未被遮挡的部分等来部分完成。这可能需要对您的 API 进行一些更改将实体预期呈现的边界而不是整个图形上下文传递给每个项目。
如果您对任何可渲染实体一无所知,例如脏状态或边界,那么您将不得不迭代所有这些实体并为它们中的每一个调用渲染。
我不确定我是否完全理解...但是您是在创建一个由多个其他实体组成的实体吗?无论您对此考虑多少,您总是必须访问每个实体一次。选择什么样的循环并不重要。
但是,如果您有一个由一堆精灵组成的实体,我建议您创建一个新纹理并将这些精灵渲染到该纹理上一次。然后你只需要在每一帧渲染那个纹理。说得通?
我找到了一个工作的朋友,他看了看并帮助我稳定了它。谢谢大家的提示和帮助。我不认为 lambda 在这里可以提供很多帮助。
很难解释我在这个项目中所做的事情。这根本不是游戏......这是不同的东西。我得到了双重渲染,所以它实际上是每秒 2* 30 次。我只是在玩我以后可以在我的引擎中实际使用的对象负载。但是这个问题让我陷入了很长一段时间。
再次。谢谢大家。