OpenGL ES 在 iOS 平台上原生开发环境的 Xcode 工程建立

简介: OpenGL ES 在 iOS 平台上原生开发环境的 Xcode 工程建立 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

OpenGL ES 在 iOS 平台上原生开发环境的 Xcode 工程建立

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



以下构建过程基于的软硬件环境:

开  发  机:Mac Book Air 2012 版 8G内存 128G固态硬盘

操作系统:os x 10.9.1

开发工具:Xcode 5


1、在 Xcode 中创建空的 iOS 工程


点下一步,出现如下图工程信息填写窗口,按图上说明进行填写即可


点按下一步,选择工程存储的磁盘位置,下方有个git版本库管理,建议先留空,此版本xcode的版本控制功能稍显繁杂,如果熟悉可以勾选。


点 Create 按钮就会在目标位置创建如下目录结构的工程:


其中 AppDelegate.h 和 AppDelegate.m 是应用代理类,后续要在该类中加载 OpenGL ES 的视图控制器及视图。


至此,一个空的待用工程建立完成。接下来创建与 OpenGL ES 相关的类,注意与上面工程结构中的差异,以便清楚了解 OpenGL ES 所需的文件。

需要对 iOS 白哥白弟们说明一下,.h 是 objective-c 类的头文件,与 c、c++ 用的扩展名是一样的,但声明不同;.m 是 objective-c 的实现文件。

对 c++ 熟悉的 objective-c 白兄白弟,可以参垢一下 《c++大学教程》,其中对很好地基于对象开发时,声明与实现的分离有很好的描述,这不是语言的内容,但是确是良好基于对象编程所必须知道的。而 objective-c 原生就这样做了,正所谓 “约定重于配置” ,好的约定值得去遵守和铭记。


2、建立 OpenGL ES 视图控制器类 GLESViewController 和 OpenGL ES 视图类 GLESView并呈现

在 xcode 工程导航器中找到 demo 分组,在其下建立 GLES 分组,该部分是 EGL 部分,真正 OpenGL ES 部分,再另建分组,以便后续用 C++ 重写。

在 GLES 分组下建立 GLESViewController 控制器类,继承自 UIViewController,另建立 GSESView 视图类。


以上分组和类建立完成后的工程导航器结构如下:


OpenGL ES 的视图控制器和视图均已建立完成,符合了 iOS 开发的习惯,我们先不考虑 OpenGL ES 部分,先把两者组合起来,在上面的空工程中呈现出来。

敏捷开发就这一点好,每做一件事情之后,都亲测一下,尽早地让程序运行起来,以验证所添加功能的可用性,以避勉把问题带到后续步骤中,增加问题排查的困难,这也是持续集成的主要方法,确保问题划分成小块,实现一块,就集成一块,测试一块,确定没有问题了,再继续向下进行。

就象盖房子一样,和混凝土之前,一定要先对水泥、砂子和碎石以及钢筋做充分的检验,合格后,才能向下施工,要不然,真正和出混凝土,浇注出房屋后,如果房屋出现倒塌,那真的就不知道是哪一环节出了问题了,是施工配比问题,还是水泥或碎石指标不够,你能知道吗?反正我是不各道。

我们这里使用 xib 来构建视图,所以要将初始化方法 initWithFrame 换成 initWithCoder ,代码如下所示:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        
        // 后续要在这里进行相关初始化操作
    }
    return self;
}

另需更改 GLESViewController.xib 中 File's Owner 的类型为 GLESViewController 视图控制器类,View 的类型更改为 GLESView 。

GLESViewController 类头文件中增加一属性,用于按 GLESView 类型引用视图控制器的视图,不用在使用时再现转换,而且由控制器控制其生命周期:

// 弱引用 UIViewController 持有的视图
@property (nonatomic, weak) IBOutlet GLESView *glesView;

GLESView 类头文件中增加一属性,不用在使用时再现转换,而且由视图控制其生命周期:

// 弱引用当前视图类持有的 Layer 对象
@property (nonatomic, weak) CAEAGLLayer *glesLayer;

重载 UIView 的如下方法:

+ (Class)layerClass {
    
    return [CAEAGLLayer class];
}

- (void)layoutSubviews {
    
    // 清除背景颜色
    glClearColor(0.0f, 1.0f, 0.0f, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    // 设置视口
    glViewport(0, 0, self.frame.size.width, self.frame.size.height);
    
    // 准备顶点及纹理缓冲区、灯光及转换矩阵,绘制图形到桢缓冲区
    
    
    // 显示桢缓冲内容
    [_glesContext presentRenderbuffer:GL_RENDERBUFFER];
}

要在应用启动时,调用呈现该视图控制器的内置视图,需要在应用代理类中做如下代码修改:

#import "AppDelegate.h"
#import "GLESViewController.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 创建 GLESViewController 实例
    GLESViewController *controller = [[GLESViewController alloc] initWithNibName:@"GLESViewController" bundle:nil];
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // 将上面创建的 GLESViewController 实例设为窗口的根视图控制器用于显示初始内容
    self.window.rootViewController = controller;
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    return YES;
}

@end

记得加上两个框架:OpenGLES.framework 和 QuartzCore.framework 分别对应 GLES 和 EGL 两部分功能。


也难怪老罗的博客中写出的描述直接按着弄,会有粗犷的感觉,俺这一步一步地建,一步一步地调,也还是晕了,不知上面的代码建立完是否能运行起来。

这里只是为了疏理重建工作,有个记录,也是为了别把自已弄晕,所以才按步就班地写这么个搭建过程,有空时再按上面来做一遍,看看哪里不妥,再行修正。























目录
相关文章
|
1月前
|
缓存 编解码 测试技术
基于iOS平台的高效图片处理技术实践
【4月更文挑战第7天】 在移动应用开发领域,图片处理是一个常见且要求高性能的功能模块。特别是在iOS平台上,由于其封闭的生态系统和用户对流畅体验的高期待,开发者需采用高效的图片处理技术以满足应用的性能需求。本文将探讨一种针对iOS平台优化的图片处理流程,涉及图像加载、缓存策略、异步处理以及图形渲染等关键技术点,旨在为iOS应用提供一个低内存消耗、高效率的图片处理解决方案。
|
7月前
|
数据安全/隐私保护 iOS开发
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
使用HBuilder平台打包并上传iOS应用到App Store的完整教程
|
8月前
|
iOS开发
Flutter与iOS原生通信方式
Flutter与iOS原生通信方式
321 2
|
9月前
|
监控 Android开发 iOS开发
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
参考代码:弹性扩缩容如何实现?System.out.println("扩容:增加直播平台实例"); currentCapacity++; } private void scaleDown() { System.out.println("缩容:减少直播平台实例");
盘点一对一直播源码iOS系统维持平台稳定功能(一):弹性扩缩容
|
2月前
|
API 开发工具 Android开发
iOS 和 Android 平台的开发有哪些主要区别?
iOS与Android开发区别:iOS用Objective-C/Swift,App Store唯一下载渠道;Android用Java/Kotlin,多商店发布(如Google Play、华为市场)。设计上,iOS简洁一致,Android灵活可定制。开发工具,iOS用Xcode,Android用Android Studio。硬件和系统多样性,iOS统一,Android复杂。权限管理、审核流程及API各有特点,开发者需依据目标平台特性进行选择。
36 3
|
19天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
18天前
|
存储 缓存 编解码
实现iOS平台的高效图片缓存策略
【4月更文挑战第23天】在移动应用开发领域,尤其是图像处理密集型的iOS应用中,高效的图片缓存策略对于提升用户体验和节省系统资源至关重要。本文将探讨一种针对iOS平台设计的图片缓存方案,该方案通过结合内存缓存与磁盘缓存的多层次结构,旨在优化图片加载性能并降低内存占用。我们将深入分析其设计理念、核心组件以及在实际场景中的应用效果,同时对比其他常见缓存技术的优势与局限。
|
19天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
23天前
|
存储 缓存 监控
实现iOS平台的高效图片缓存策略
【4月更文挑战第18天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。特别是对于iOS平台,合理设计图片缓存策略不仅能够提高应用的响应速度,还能降低内存消耗和网络流量。本文将探讨一种针对iOS环境的图片缓存方案,该方案通过多级缓存机制、内存管理和磁盘存储策略相结合,旨在提升图片加载效率并优化性能。
|
1月前
|
存储 缓存 iOS开发
实现iOS平台的高效图片缓存策略
【4月更文挑战第4天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的关键因素之一。尤其对于iOS平台,由于设备存储和内存资源的限制,设计一个高效的图片缓存机制尤为重要。本文将深入探讨在iOS环境下,如何通过技术手段实现图片的高效加载与缓存,包括内存缓存、磁盘缓存以及网络层面的优化,旨在为用户提供流畅且稳定的图片浏览体验。