2.2、结合Cocoa Touch和OpenGL ES
OpenGLES_Ch2_1
是本章的第一个示例应用,为本书的示例提供了起始点。这个程序设置OpenGLES渲染一个图像到一个CoreAnimation层。之后由iOsCoreAnimation合成器自动地把渲染的层内容与其他层结合起来,产生保存在后帧缓存中的像素颜色数据,并最终显示到屏幕上。
图2-3显示了OpenGLES_Ch2_1
渲染出来的图像。虽然只有一个三角形,但是执行OpenGL ES渲染的步骤与更复杂场景的步骤是相同的。这个例子使用了苹果的CocoaTouch技术以及Xcode集成开发环境(IDE)。包含在Xcode中的苹果iOs开发者工具是iOS软件开发工具包(SDK)的一部分,其官方下载
网址为http://developer.apple.com/technologies/ios/

2.2.1 、Cocoa Touch
CocoaTouch由可重用的用于创建和运行应用的函数及软件对象组成。苹果的iOs由一个类似于MacOSX的近乎完全与UNIX相似的操作系统组成,MacOSX是运行在苹果的Macintosh系列电脑上的一个操作系统。谷歌的基于Linux的Android操作系统也与UNIX类似。CocoaTouch建立在UNIX系统的基础之,上,同时整合了许多不同的功能,从网络连接到Core Animation,再到用户用来开始、停止、观察、与应用交互的图形用户界面。不使用CocoaTouch而只使用ANSIC编程语言、UNIX命令行工具,以及UNIX应用程序编程接口编写一个iOs程序在技术上是可能的。但是,大部分用户不会这么写程序,因为苹果不接受这样的应用发布到苹果的 App Store.上。
Cocoa Touch主要是由Objective-C编程语言实现的。Objective-C向ANSIC编程语言添加了少量的语法元素和一个面向对象的运行时系统。CocoaTouch提供了对于包括OpenGL ES的底层ANSI C技术的人口,但即使是最简单的像OpenGLES_Ch2_1这样的例子应用也需要Objective-C。Cocoa Touch提供了很多用于iOs应用的标准功能,以及让开发者专注于让应用变得独一无二的功能。每一个iOS程序员都受益于对Cocoa Touch和Objective-C的学习和使用。但是,本书主要关注OpenGL ES,所以仅仅简要介绍Cocoa Touch技术。
2.2.2 、使用苹果开发工具
Xcode运行在Mac OS X上,包含可识别语法的代码编辑器、编译器、调试器、性能工具,以及一个文件管理用户界面。Xcode 支持使用ANSI C、C++、Objective-C 和Objective-C++语言做开发,同时它可以与各种外部源代码管理系统- -起工作。苹果使用Xcode开发自己的软件。更多信息可登录: http://developerapple.com/iphone/library/referencelibrary/GettingStarted/URL_ Tools_for_iPhone_OS_Development/index.html 查询。
图2-4显示的是Xcode,并且加载了用OpenGLE_Ch2_1.xcodeproj 配置文件定义的建立OpenGLES_Ch2_1例子所需要的资源。Xcode有与大部分其他的IDE相似的功能,例如开源Eclipse IDE和微软的Visual Studio IDE。图2-4中左边栏的列表指定了需要编译并链接到最终应用中的文件。在Xcode窗口顶部的工具栏提供了用于组建和运行开发中的应用的按钮。剩下的用户界面主要是由源代码编辑器组成。

2.2.3、Cocoa Touch应用架构
图2-5列出了所有使用OpenGLES的最新CocoaTouch应用的主要软件组件。箭头指示了组件之间的典型的信息流。在图2-5中CocoaTouch提供了灰色的组件,应用通常使用不需修改的灰色组件。图2-5中的白色组件对于每一一个应用来说都是独一无二的。较复杂的应用会包含专属的软件组件。不要被图2-5的复杂所迷惑。大部分情况下,只有应用委托(application delegate)和根视图控制器(root view controller) 这两个白色组件需要所有程序员的干预,其他组件是提供标准的iOS应用行为的基础结构的一部分,均不需要程序员做任何干预。
操作系统控制对硬件组件的访问,发送用户的屏幕触摸事件给基于CocoaTouch的应用。CocoaTouch实现了标准的图形组件,包括触摸键盘和状态栏,因此单独的应用不需要重新创建这些组件。苹果提供了一个图表以说明常用的CocoaTouch应用组件,图表地址为: http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhone-OSProgrammingGuide/AppArchitecture/ AppArchitecture.html。为简单起见,苹果的图表省略了OpenGL ES和Core Animation层,但是却为CocoaTouch应用设计提供了额外 的依据。

图2-5中显示了第1章介绍的OpenGL ES和帧缓存组件的作用。本章介绍了Core Animation层和Core Animation合成器。图2-5中剩下的组件实现了标准的Cocoa Touch行为。
- UIApplication: 每个应用都包含一个单一的UIApplication类的实例。UIApp-lication是一个Objective-C Cocoa Touch对象,它提供了应用与iOS之间的双向通信。应用向iOs请求服务,系统为正在运行的应用提供信息,例如显示器的当前方向。UIApplication 会与一个或更多个Cocoa Touch UIWindow实例通信,还会与一个用于路由用户输人事件到正确的对象的委托(delegate) 通信。
- 应用委托(application delegate): 委托对象提供了一个响应另一个对象的变化或者影响另-个对象的行为的机会。基本思路是两个对象协调解决一个问题。对象(如UIApplication)是非常常见并可以在各种情况下重用的。它保存了一个对于另一个对象(它的委托)的引用,并且在关键时刻发送消息给委托。可能只是通知委托发生了一些事情并给予委托一个执行额外处理的机会的消息,或者是要求委托返回能够控制发生什么的关键信息的消息。委托通常是一个特定的应用所特有的自定义对象。应用委托会接收关于Cocoa Touch应用所运行的环境的所有重要改变,包括应用完成启动和结束这样的改变。
- UIWindow:CocoaTouch应用总是有至少一个自动创建的覆盖整个屏幕的UIWindow实例。UIWindow实例控制屏幕的矩形区域,并且它们能够被重叠和分层以便-一个窗口覆盖另一个窗口。除了覆盖整个屏幕的窗口, Cocoa Touch应用很少直接访问窗口。Cocoa Touch会按需自动使用其他的UIWindows来向用户显示警告和状态信息UIWindows会包含一个或多个提供窗口图形内容的UIView实例。应用架构内的窗口的一个重要的作用是从UIApplication实例收集用户的输入事件,然后根据实际情况把这些事件重新发送给正确的UIView实例。例如,UIWindow确定哪--个UIView实例被用户触摸,然后直接发送合适的事件到那个实例。
- 根视图控制器:每一个窗口都有一个可选的根视图控制器。视图控制器是CocoaTouch UIViewController类的实例并把大部分iOs应用的设计联系起来。视图控制器会调节一个相关的视图的外观并支持在设备方向变化时旋转视图。根视图控制器指定填充整个窗口的UIView实例。UIViewController 类的默认行为控制了iOs应用的标准可视化效果。GLKViewController 类是支持OpenGL ES特有的行为和动画计时的UIViewController的内建子类。OpenGLES_Ch2_1例子创建了一个GLKViewController的子类OpenGLES_Ch2_1ViewController 来提供所有例子所特有的行为。
- GLKView :这是Cocoa Touch UIView类的内建子类。GLKView简化了通过用CoreAnimation层来自动创建并管理帧缓存和渲染缓存共享内存所需要做的工作。GLKView相关的GLKViewController实例是视图的委托并接收当视图需要重绘时的消息。创建你自已的UIView或者GLKView的子类来实现应用特有的绘图是可能的,但是OpenGLESCh2_1采用了简单的方法,使用未经修改的GLKView。OpenGLES Ch2 1例子实现了所有应用特有的行为,包括在OpenGLES Ch2_ IViewController 类中的绘画。
注意
GLKView和GLKViewController类名字中的GLK前缀表明这些类是iOS 5引入的GLKit框架的一部分。框架是指被编译后的代码所使用的编译后的代码、接口声明,以及类似图像和数据的资源文件的集合。框架高效地组织可重用共享库并且在一些情况下可能包含库的多个版本。GLKit为简化iOs中OpenGL ES的使用提供了类和函数。GLKit是Cocoa Touch以及多个其他的框架(包含UIKit)的一-部分,UIKit 包含许多类如UIApplication、UIWindow和UIView。