12.1、概述

例子OpenGLES_Ch12_1是基于第10章中的例子扩展来的,具体是通过向iOs标准Model-View-Controller(MVC)应用体系结构的Mode!和View子系统中添加类来实现的。新的TECart和TEParticleEmitter类会扩展Model子系统以呈现悬空车和封装发射粒子的3D位置。在View子系统中,OpenGLES_Ch12_1会添加一个新的UtilityBillboardParticleEffect类以及OpenGL ES 2.0 Shading Language程序来渲染由公告牌组成的粒子。公告牌特效会渲染朝向观察者的纹理几何对象,如第8章所述。

模型视图控制器

模型视图控制器应用体系结构是最悠久、最成功的复用软件设计模式之一。 这种模式是20世纪70年代首先在Smalltalk编程语言中提出的。模型视图控制器模式定义了CocoaTouch框架的整体组织结构。模型视图控制器模式是把大量的协作对象组织为不同的子系统的一个高级模式,子系统包括:模型、视图和控制器。

对于常见应用的功能和行为的分析有助于理解这些子系统在模型视图控制器模式中所起的作用。大部分应用会存储信息、恢复信息、向用户呈现信息,以及让用户编辑或者操作信息。在面向对象的应用中,信息并不只是字节;对象封装了信息以及使用信息的方法。一个复杂应用中的每个对象都应该属于下述子系统中的一个。

  • 模型。模型子系统包含用于实现一个应用的独特功能和信息存储的对象。不要混淆了3D图形中的模型概念与模型子系统中的模型概念。MVC的模型子系统会包含处理应用数据的所有规则。最重要的是模型子系统可以单独存在,不用依赖于视图或者控制器子系统。在例子OpenGLES_Ch12_1 中,地形高程数据是存储在模型子系统中的。高程数据以及执行在这些数据上的操作可以独立于形象化地形的很多可能的方式而存在,其中地形是指从平面地形图到交互性纹理3D网格的地形。
  • 视图。视图子系统会呈现从模型子系统收集来的信息,并会为用户提供一个与信息进行交互的途径。可以存在呈现相同模型的多个视图子系统。例如,可能会有一个3D视图、一个2D视图、一个由表格组成的视图、一个打印报表视图、一个命令行视图、一个基于Web的视图和一个脚本语言视图与同一个模型进行交互。在第7章和第10章介绍的COLLADAViewer和TerrainEditor应用演示了数据的多个视图,包括3D渲染和图表。
  • 控制器。控制器子系统会让模型与视图脱钩。用户与视图子系统的交互会产生对于控制器子系统的请求,控制器可能转而改变在模型子系统中的信息。控制器还操作着呈现给用户的数据的转换和格式化。例如,一个模型子系统可能是以米来存储数据的,但是根据用户偏好,控制器子系统可能会转换数据的单位为尺或者像素。一个模型子系统可能会以无序的集合来存储对象,但是在向视图子系统提供这些对象以呈现给用户之前,控制器可能会排序这些对象。

MVC确保了在修改模型子系统的实现时不会影响视图子系统,反之亦然。在例子OpenGLES_Ch12_1中,用户会按下“Boost”按钮,这个按钮是视图子系统的一部分。

这个按钮会向一个OpenGLES_Ch12_1ViewController实例发送一个Objective-C消息*-startBoosting:” ,这个实例接着会向模型子系统内的玩家控制的TECart实例发送一个 消息。作为响应,TECart实例会重新计算加速矢量,这个加速矢量用于在物理模拟中为火箭车计算出一个新的速度和位置。下次视图子系统渲染场景时,玩家的车会由于这 个加速度而出现在一个新的3D位置。

在MVC体系结构中,火箭车会应用自已的物理规则来计算加速度、速度和位置,不会考虑开始加速的原因和火箭车将会被可视化呈现的方式。在3D场景内的一个位置对于火箭车的渲染与用来确定火箭车的位置所做的运算是无关的。对于火箭车物理效果实现代码的改变不会影响火箭车的渲染代码,对于渲染代码的改变不会影响火箭车物理效果的实现代码。图12-2描绘了在例子OpenGLES_Ch12_1中的MVC关系。图中的箭头代表了子系统间的通信。

图 12-2

Cocoa Touch通过引人模型控制器和视图控制器的概念改进了MVC结构。在例子OpenGLES_Ch12_1中,OpenGLES_Ch12_1AppDelegate 类起到了模型控制器的作用。它是有责任加载和保存类似地形和火箭车的模型子系统对象的控制器子系统的一部分。OpenGLES_Ch12_1ViewController 类起到了视图控制器的作用,用于协调模型子系统和视图子系统间的通信。OpenGLES_Ch12_1ViewController 用于管理时间、命令模型子系统对象更新内部状态,以及接收来自GLKView实例的消息以协调渲染。

results matching ""

    No results matching ""