0

我有一个画了很多东西的面板。为了提高绘图效率,我使用了 BufferedImage,这样我就不必在每次发生某些事情时都绘制所有内容。

我的paintComponent 只需要'if' 语句:

if(!extraOnly) //paint something

paint something

if(listener.getRectangle() != null) // Paint something

我喜欢使用状态模式的想法,但我不确定使用它的正确时机?我不喜欢必须为 extraOnly 设置布尔值的想法,也许我也有模式发烧 :)。每个状态只有一个方法,draw(Graphics g)

由于这是我的应用程序在 MVC 模式中的视图部分,我也不确定使用状态模式是错误的。状态不应该是模型而不是视图的一部分吗?

4

3 回答 3

1

我认为在视图中有状态没有任何问题。不过,这显然与模型中的状态不同。

一个例子是网络浏览器。本例中的模型是网页 DOM,浏览器视图将 DOM 呈现为屏幕演示。在向下滚动网页时,在每一帧上渲染 DOM 会非常低效。显然,缓冲状态是解决此问题的方法。仅当底层 DOM 发生更改时,才需要更新状态。

于 2009-05-02T09:31:31.633 回答
0

一个drawables列表怎么样,每个都有az level和一个dirty flag?所以你的油漆看起来像:

paint()
{
    sort(drawables, by z-level)
    foreach(drawable in drawables)
       if (drawable.isDirty())
           drawable.paint()
}

您将需要考虑弄脏重叠的对象,但通常这种方法很容易实现。

编辑:嗯,没那么简单。如果你移动一个物体,你需要重新绘制它下面的表面。如果您对背景元素和前景元素有明确的区分,您可能希望将它们绘制到不同的图像缓冲区中,这将允许您快速重绘背景而无需再次渲染。

于 2009-05-02T09:28:05.887 回答
0

一般更大的问题似乎是如何进行高效绘画?

如果绘制速度较慢,局部绘制是提高性能的好方法。

但是,首先证明绘图很慢!如果分析表明绘图是一个问题,那么您可以迁移到部分更新。

一种方法是使用“脏矩形跟踪”。这是一个非常广泛使用的东西,术语是“无效”(需要重绘的区域)和“验证”(绘制脏位的行为)。窗口系统几乎肯定已经在这样做了,因此您可能可以搭载它,例如 Java Swing RepaintManager 保持脏区域的边界矩形。

但是,您可以轻松地自己滚动。你可以有一个成员变量——一个“区域”,或者只是一个向量中的矩形列表,或者一个边界矩形——来表示下一次绘制时要更新的区域。在您的构造函数或大小更改的处理程序中,将其初始化为整个区域。任何时候您想重绘面板的一部分,通过将矩形添加到脏区来使该部分无效。绘画时只画脏区的部分,然后清除脏区。例如,以这种方式进行局部绘制可以很好地使用缓冲图像作为中介。简单的!

于 2009-05-02T09:38:04.660 回答