我有一个小组,可以吸引很多东西。为了使绘图有效,我使用的是BufferedImage,这样每次发生事情时我都不必绘制所有内容。
我的paintComponent只需要'if'语句:
if(!extraOnly) //paint something
paint something
if(listener.getRectangle() != null) // Paint something
我喜欢使用状态模式的想法,但我不确定它是否适合使用它?我不喜欢为extraOnly设置一个布尔值的想法,也许在我身上也有模式发烧:)。每个州只有一个方法,draw(Graphics g)
由于这是我在MVC模式中应用程序的视图部分,我也不确定使用状态模式是错误的。不应该声明模型的一部分而不是视图?
答案 0 :(得分:1)
我认为在视图中拥有状态并没有错。这显然与模型中的状态不同。
一个例子是webbrowser。在这种情况下,模型是网页DOM,浏览器视图将DOM呈现为屏幕呈现。在向下滚动网页时,在每个帧上渲染DOM将是非常低效的。显然,缓冲状态是解决此问题的方法。如果底层DOM被更改,则只需要更新状态。
答案 1 :(得分:0)
一个drawable列表怎么样,每个都有一个z级别和一个脏标志? 所以你的油漆看起来像:
paint()
{
sort(drawables, by z-level)
foreach(drawable in drawables)
if (drawable.isDirty())
drawable.paint()
}
您需要考虑弄脏重叠的对象,但通常这种方法实现起来非常简单。
编辑: 嗯,不是那么简单。 如果移动一个物体,则需要重新绘制它下面的表面。 如果你对背景元素和forground元素有明确的区别,你可能想要将它们绘制到不同的图像缓冲区中,这样你就可以快速重新绘制背景而不再渲染它。
答案 2 :(得分:0)
一般更大的问题似乎是如何进行有效的绘画?
如果绘图很慢,部分绘画是提高性能的好方法。
然而,首先证明绘图很慢!如果分析表明绘图是个问题,那么您可以迁移到部分更新。
一种方法是使用“脏矩形跟踪”。这是一个非常广泛使用的东西,术语是'invalidation'(需要重绘的区域)和'validation'(绘制脏位的行为)。窗口系统几乎肯定已经这样做了,所以你可以背负这个例子。 Java Swing RepaintManager保留脏区域的边界矩形。
但是,您可以轻松自己动手。您可以拥有一个成员变量 - 一个“区域”,或者只是一个向量中的矩形列表,或一个边界矩形 - 来表示下一个绘图上要更新的区域。在构造函数或大小更改的处理程序中,将其初始化为整个区域。每当您想要重绘部分面板时,通过将矩形添加到脏区域来使该部分无效。绘画时,只在脏区绘制零件,然后清除脏区。例如,以这种方式的部分绘图适用于作为中介的缓冲图像。简单!