图形和动画设计和编程模式

来源:互联网 发布:mac网站上传工具 编辑:程序博客网 时间:2024/05/12 01:39

   一  、  Layered Graphics 图形分层

        情景

                 图形程序经常需要实现图形之间的叠加。图形数据可能来自不同的数据源或使用不同的算法呈现。用户也可能需要在不同类型的可视图形数据间切换。

                 而一个管理和呈现可视图形数据所有的不同组合的单类将导致该类复杂到难以维护。

        方案

             具体化为图形层

                每一层负责获得该层类型需要的图形数据并呈现到显示单元上。显示单元只负责依照图形层的顺序和它们的可视性进行层的绘制。层还负责当它们的数据变化时或 用户切换它们的可视性时请求显示单元重新绘制。

             如果用户必须与图形层的数据交互,必须为每层编程来提供额外的支持,如检查用户是否在某层显示的图元上点击等。作为一种选择用户能够选择一个活动层,该层接收所有的输入(该方法由PHOTOSHOPGIMP使用)。

             已知应用:PHOTOSHOP和,GIMPVisio以及许多其它的应用。

   二 、Structured Graphics结构化图形

      情景

            为图形显示编程是复杂的。一个程序必须管理什么在显示上绘制,如何绘制和什么时候绘制。

            程序员仅对绘制什么感兴趣,而对如何绘制和什么时候绘制不感兴趣。

      方案

            允许用户通过对象的聚合定义绘制什么,并提供可重用的机制控制如何和什么时候把那些对象绘制到显示单元上。

            每个图形对象封装成一个显示元素(一个图片,圆,矩形,一片文本等)。提供可重用代码当需要时(例如作为事件的应答或图形对象的变化)把图形对象绘制到显示单元。

            然后程序员能够容易的定义绘制什么的代码和重用如何和什么时候绘制的代码。

            使用组合模式定义组合的图形对象也是容易的。多个图形对象的组合与独立的图形对象是没有区别的。如果需要复杂的图形组合,图形对象能够结构化为一个SceneGraph

            如果程序员需要定义作用到图形对象的新的操作,可以使用VisitorPattern模式。

            绘制算法能够使用DeferredUpdates,绘制到一个DoubleBuffer,当每次更新需要更新多个图形对象时可以使用BufferGraphicCommands  来优化显示更新。

            已知应用包括HotDraw,InterViews,UnidrawFramework,SceneBeans, Visio, Microsoft Powerpoint,以及大量的其它图形工具和应用。

   三、 Scene Graph场景图

        情景

              大多数图形API是有状态的。程序在显示管理器中设置绘制状态来定义绘制颜色、字体、转换操作、填充纹理等。这样能够减少每个绘制操作需要的跨内核边界或网络的数据量。

              但你如何组合结构化图形?

              如果你使用StructuredGraphics写一个图形程序,你可能想定义一个组合形状,然后在显示器的不同位置以不同的尺寸、旋转或不同的颜色绘制它。

      方案

             每个StructuredGraphics对象应当封装位于显示管理器中的绘制状态的修改操作,例如SingleTransform。组合图形对象使子对象继承由容器树创建的绘制状态。

             使用一个DirectedAcyclicGraph定义一个可视对象(树叶表示基本形状,中间结点要么封装一个单独的小的、状态可逆的子图,要么组合多个子图)。

             对各种类型节点通过深度优先算法执行如下绘制操作。

             中间节点:把状态改变作用于显示管理器,并绘制子图,然后恢复先前的状态。

             组合节点:依次绘制它们的每个子图,先进的系统能够实现其它的组合操作,例如构造区域(或立方体)形状(CAG or CSG)

             页节点:绘制基本形状。每个形状绘制将由作用到显示管理器上的所有改变后的状态影响。

             一个形状一旦定义然后通过联到图形的不同部分,能够使用不同的转换和其它操作绘制多次。在遍历图形时当每次访问到它可以使用不同的转换。

             场景图与一个简单的StructuredGraphics框架比较,难以从场景图的叶子节点映射到显示器的区域,因为任意的转换能够作用到图形的叶子形状。这些计算需要计算最小的刷新矩形RefreshRectangles或者来实现互动性。这样的映射必须通过遍历整个图形来实现,通过在每个遍历对象上执行矩阵乘法来保持转换的跟踪。即使它比简单的StructuredGraphics框架的算法需要更多的计算,但它仍能够在计算最小刷新矩形时候大大减少绘制时间。

             场景图经常用作组装CompiledGraphicCommands的高级接口。

               RenderGraph是场景图模式的优化。

            场景图模式经常在3D图形工具包中运用。尤其OpenInventor,OpenSceneGraph Java3D使用场景图来结构化场景。但很少在2D图形中用,例子包括在SelfLanguageSqueakSmalltalk中的MorphicInterface框架,SceneBeans Jazz toolkits for Java,GnomeCanvas显示小控件,以及SVG图形文件格式。

     四 、Paper Pen And Person 纸笔和人模式

       意图

                 从绘制行为中分离绘制机制

       动机

              在构建面向对象的图形系统时,你必须与一个已存在的主机窗口系统连接。主机窗口系统的API通常包含在一个窗口上绘制图形基元的操作(线、矩形、弧等)。映射这些API到一组对象通常依赖于人们画图的基本的方式。

       参与者

       笔

                执行图形基元的绘制命令(线、矩形、弧等)。

             维护一个内部状态(颜色、线宽等)

      纸

                指示要绘制的操作系统表面(位图、屏幕、窗口)

                常常负责创建笔

      人

                使用笔绘制有意义的形状和图形。

      协作

             人知道如何绘制一个特定的可视画面(一个长条图或一个简单一行文本)。这些绘制通过给笔发送绘制命令来完成。人们与特定类型的纸隔离,允许相同的图形可以画在位图、屏幕或打印机上。

             绘制命令与如何绘制相分离。

      实现

             笔常常直接封装必须的API调用来实现图形基元的绘制。大多数窗口系统需要一个窗口句柄来发送这些调用,所以它通过纸获得它。纸常常被子类化来表现不同类型的图形媒体(位图、屏幕和打印机)。人也被子类化表示每个特定类型的可视对象。

       已知应用

                Smalltalk/VVisualWorks在它们的图形系统中利用这个模式。在In Smalltalk/V, 笔由 Pen类表示,纸由GraphicsMedium和它的子类表示.人由SubPane的子类表示。在VisualWorks Pen GraphicsContext类。 PaperDisplaySurface类和它的子类。 PersonVisualComponent层次表示。 IBM Smalltalk有相似的概念,但它没有象Smalltalk/VVisualWorks那样做完全的映射。

    五 、Discrete Cartesian Geometry Primitives离散笛卡尔几何

    六、 Continuous Cartesian Geometry Primitives连续笛卡尔几何

    七、 Fixed Point Cartesian Geometry Primitives 定点笛卡尔几何

     八、 Window Per Task每个任务一个窗口

                为每个用户必须执行的任务创建一个特定的窗口,所有完成任务需要的信息应当在窗口的FewPanes上可以获得。

     、FewPanes 少量窗格

     十、Standard Panes

           问题

                  人们必须学习操作每个窗口FewPanes上提供的每个种类的pane

         方案

                  把每个pane格式化为几个标准的pane

十一、 Short Menus  快捷菜单

         情景

                 弹出菜单的元素必须时常可视化搜寻。

         方案:使弹出菜单短、固定和单个级别。

十二、 Avoid Drawing 避免绘制

         情景

                   图形 API使用几个函数调用移动大量的数据。如执行位块传输(blit)、填充图形或绘制大量的线条,呈现带纹理的3D多边形,所有的操作通过增加占用的时间来呈现一个单帧。大的显示器,更高的颜色深度,反锯齿,alpha通道(透明)和其它的对我们的用户骄傲的东西加剧了性能问题。

           方案

                  尽可能的避免绘制操作。

                  尽可能的预计算来减少屏幕需要更新的次数。例如,计算包含显示器任意绘制变化的最小的刷新矩形和剪切显示器的最小刷新矩形绘制区域。作为一个通用经验法则,做更多的计算来减少blitting的次数将能够从中获得好处,尤其如果你绘制到一个DoubleBuffer,然后再blit到显示器上。

                 使用DeferredUpdates和尽可能的预计算来避免对每帧得相同的点绘制多次。能执行的预计算包括在3D图形中移出隐藏的绘制面或在2D图形中的剪切。

                 另外利用图形驱动的优势。使用聚合的图形命令AggregateGraphicCommands来避免多个基元图形命令,这样能够减少在你的程序和驱动之间的通信过载。例如,大多数显示管理提供显和多线段基本操作。后者也是直接到呈现器,所以一个多线段请求比多个单线请求更快。

                3D图形应用能够使用ViewFrustumCulling算法来避免绘制不在视图区域的多边形,使用BackFaceCulling来避免绘制背对观察者的实体对象的表面(因为被其它面挡着)。更多的精致的算法包括使用QuadTreeBinarySpacePartitionTree来预计算确定可视性的空间关系。

                多数空间环境以应用特定的方式被分割成区域,并仅对可视者来说是同一区域的对象才被绘制,例如带着关着的门的房间之间的区域。

 十三、 Deferred Update  延迟更新

          用Deferred Update来最小化显示过载和闪烁。与老式的图形列表显示引擎概念上相似,一个显示处理器接收和处理显示请求,消除应用写屏幕本身的需要。

          显示处理器知道物理显示几何的属性,计算请求的交集,维护需要更新的显示区域的列表。绘制相同区域多次的请求能够在不需要对显示器实际存取被调度和优化。显示处理器然后作为对来自窗口系统或硬件请求的应答能够重绘显示器的部分(或整个)。

          该方法在调度来自多个进程或线程的显示请求尤其有帮助。

十四、 Logical Alpha 逻辑透明度

          与DeferredUpdateAvoidDrawing配合使用。

          标准的,alpha通道当每个图形基元绘制时一个像素一个像素的计算。如果硬件支持加速,这样没有大的性能损失。如果无论什么原因你必须通过软件这样做,那么速度将会慢的象蜗牛。

          就像上面别处提到的,如果你先于实际绘制作一些计算,你能够避免冗余的操作,通常能够加速绘制。

          保持已执行的每个绘制操作的记录,然后对每个新的操作,与以前的操作进行检查。如果有一个交集,分离新操作成一序列的操作来表现与各种以前的操作的交集。为每个操作,计算屏幕对应的适当的颜色,记录它作为一个分离的操作。

十五、 Idle Updates 空闲更新模式

         情景

               你正使用DeferredUpdates写一个图形程序来优化显示刷新。你的程序使用事件驱动的显示管理,例如X窗口系统或WIN32  API

                    你如何控制DeferredUpdates什么时候绘制呢?

               更新通常产生于用户输入。用户输入的速度与计算机的速度比较是慢的,如果图形更新延迟100毫秒用户不会注意到。

        方案

                      当没有更多的用户输入事件要处理时执行每个DeferredUpdate

                      这通过查询事件队列是否为空来容易的检测。

十六、 Double Buffer 双缓冲模式

十七、 Triple Buffer  三倍缓冲

十八 、 Refresh Rectangles刷新矩形或脏矩形

十九 、Avoid Multiple Primitive Graphic Commands避免多个基本图形命令。

二十 、Aggregate Graphic Commands集合图形命令

二十一、 Buffer Graphic Commands 缓冲图形命令

二十二  、Compiled Graphic Commands编译的图形命令

二十三 、 Single Transform单一转换

二十四、 Abstract Session Pattern 抽象会话模式

               用作为相同的显示表面维护多个绘制上下文。