OpenGL ES iOS 入门实例

OpenGL ES iOS 入门实例,第1张

运行效果: 变成了倒立,这是因为CoreGraphics的坐标的问题,解决方法则是在 option 中添加坐标变换就可以了

遗留问题: 如何纹理并没有按照比例显示, 如何使得等比例填充

顶点坐标系中的u,v坐标和纹理坐标的s,t是一一映射的关系

纹理混合其实类似OC中的加载 UIImage , 填充纹理后直接使用 glEnable(GL_BLEND) 和 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 函数就可以直接进行纹理混合 *** 作

多重纹理: 从至少两个纹理缓存中取纹素; 目的是替代纹理混合,提高性能, 原因是纹理混合是通过多次读写像素颜色渲染缓存,所以每次更新界面图形都需要渲染多次,需要从帧缓存读取颜色数据和片元数据混合,再次回帧缓存,所以这样的方式多次内存读写的 *** 作就决定了混合在性能上的不佳所以采用多重纹理方式替代

疑问: 纹理的绘制的标准位置在哪网上有的实例在 viewDidLoad() 中,有的在 glkView:drawRect: 中他们的区别在哪里 如何更好的使用绘制的相关函数

在开发中我们常常会看到一些图像失真,模糊的情况,造成这现象的原因很有可能就是缺少灯光照射,灯光照射可以让图形更加立体清晰其原理是计算机在模拟光照时, GPU会为每个三角形的顶点进行光线计算,再把结果进行插值,从而得出每个片元的最终颜色

OpenGL ES 的灯光模拟包含: 环境光 , 漫反射光 , 镜面反射

一个渲染三角形中的每个光线组成部分取决于三个互相关联的因素

光线的计算依赖于表面法向量,法向量可以通过矢量进行计算

表面法向量决定了平面的方向,通过光线和法向量的角度可以计算出漫反射光,环境光,镜面反射光的模拟,可以使用GLKit,系统会内置模拟计算出灯光效果

平面法线: 假设一个三角形的三个顶点都被赋予了相同的法向量

同样可以把灯光烘焙到纹理中,GPU模拟灯光需要做出很大的运行量,所以烘焙到纹理可以避开模拟灯光的矢量运算,但是相应的光烘焙到纹理仅仅适用于静态的场景,不适于动态场景

使用iOS模拟器

1 下载示例应用程序TestAutomationxcodeproj,并打开它。这个项目是一个很简单的包含2个tab的tabbar应用程序。

2 确保选中如下图所示的“TestAutomation > iPhone 50

Simulator”模式(或许已经切换成51了,因此它可能是iPhone51模拟器)。

3 启动Instruments(Product > Profile),或者通过⌘I。

4 选择左边的iOS Simulator,然后再选择Automation模板,然后点击“Profile”。

5 Instruments就已经启动好后,然后直接开始录制了。这里先停止录制,(红包按钮或者⌘R)。

6 在左边的Scripts窗口,点击“Add > Create”创建新的脚本。

7 在脚本编辑器里,输入下面的代码

var target = UIATargetlocalTarget();

var app = targetfrontMostApp();

var window = appmainWindow();

targetlogElementTree();

8 重新运行这段脚本⌘R(不需要保存)。脚本跑起来后,可以在日志打完后停止它。

赞一个!就这样完成了第一个UIAutomation测试用例。

使用iOS设备

除了将测试用例运行模拟器上,也可以将它运行在一个真实的设备上。不过,自动化测试用例只能运行在支持多任务的:iPhone 3GS,iPad,iOS

> 40等设备上。遗憾的是不管iPhone 3G的系统版本是什么,都不支持。

下面是如何 *** 作:

1 通过USB接口连接上iPhone。

2 选择 “TestAutomation > iOS Device”模式。

3 确保Developper profile设置成Release模式(而不是Ad-Hoc Distribution

profile)。默认情况下,profiling是设置成Release模式的(因为没有必要将profile设置成Debug模式)。

4 启动测试 (⌘I)

5 后面的步骤请参考前面模拟器部分

在iOS运行时系统中,调用方法的本质就是利用objc_msgSend进行消息发送:

iOS 中所有的类都是继承于 NSObject,一个对象所具有的方法分为实例方法和类方法,编译完成后的对象中,存在一个实例方法链表、一个缓存方法链表。当实例调用方法经objc_msgSend时:首先,在相应 *** 做的对象中的缓存方法列表中找调用的方法,若找到,转向相应的实现并执行;若没找到,在对象的方法列表中查找,若是找到,转向相应的实现并执行;若是没找到,则递归的去父类指针所指向的类对象方法列表中查找;以此类推,若是一直到根类都没有找到,转向拦截调用,走消息转发机制;若是没有重写拦截调用方法,程序报错;

消息转发也被称为拦截调用,就是在找不到调用的方法后,且在程序崩溃以前,有机会经过重写NSObject的四个方法来补救处理:

若以上都不中,调用 NSObject 的 doesNotRecognizeSelector 方法抛出异常:

利用以上机制,可以对resolveInstanceMethod 和 resolveClassMethod 两个方法进行方法交换,拦截可能出现的 iOS 崩溃,然后自定义处理。

消息转发机制依次的三个过程:1)动态方法解析;2)转发给其他备用的接收对象;3)消息所有相关内容封装成一个NSInvocation对象,再做最后的尝试。

第一阶段,先征询接收者所属的类,是否需要动态的添加方法,用来处理当前未找到的方法。对象在无法解读消息时会首先调用所属类的下列类方法,来判断是否能接收消息:

例:

第二阶段,如果动态方法解析没有发现添加的方法,那么尝试转发给其他对象来处理这个方法。该步骤调用的方法是:

例:

第三阶段,如果没有可用的备选者,那么系统就会把消息所有相关内容封装成一个NSInvocation对象,再做最后的尝试,启动完整的消息转发。先调用methodSignatureForSelector:获取方法签名,然后再调用forwardInvocation:进行处理,这一步的处理可以直接转发给其它对象,即和第二步的效果等效,但是很少有人这么干,因为消息处理越靠后,就表示处理消息的成本越大,性能的开销就越大。所以,在这种方式下,一般会改变消息内容,比如增加参数,改变选择子等等,具体根据实际情况而定。

例:

这里就是利用了消息转发机制的第三个阶段,将NSIvocation分发给多个代理去响应。

>

单例是 iOS 设计模式之一

一般情况下,初始化一个类 会使用 init,假如使用 init 创建,是否还是只有一个实例

1: 0x600002d5b950

2: 0x600002d5b950

3: 0x600002d642e0

4: 0x600002d60060

1 和 2 是一样的,但是和 3 与 4 都不一样

所以这样写是不完善的

再次打印,得到结果

得到的都是同一个对象

使用 init 方法时,每次都会调用 init ,都会执行 init 方法

Singleton init 方法

每次都会调用 init 方法

这样处理后,不管怎样,都只会调用一次 init,每次得到的对象也同一个对象

测试一下

得到四个指针地址是一样的

我们把Objective-C中写在类声明的大括号中的变量称之为成员变量(也称为属性,实例变量)。

我们无法从外界(比如其他类和文件中)直接访问定义在类中的成员变量。为了能够从外界 *** 作成员变量,我们需要为调用者提供相应的方法来对成员变量进行访问、赋值等 *** 作。而定义这些方法都需要有一个有意义的名字,所以就有了getter-setter方法。

getter-setter方法格式和写法是固定的,这也是程序员之间的一种规范,只要有人想要访问成员变量或给成员变量赋值,就会立刻想到getter-setter方法,这样就降低了程序员之间的沟通成本。

如果给成员变量提供了getter和setter方法,就可以通过 点语法 来访问成员变量

有时我们需要获取某个类对应的属性,实例方法,类方法等,下面就是个人做的简单总结:

导入:

协议方法的获取

类属性的获取

实例方法的获取

类方法的获取

demo

参考资料:

OC运行时

Objective-C 中的元类(meta class)是什么

以上就是关于OpenGL ES iOS 入门实例全部的内容,包括:OpenGL ES iOS 入门实例、如何使用UIAutomation进行iOS自动化测试、—— iOS 运行时中方法的调用流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10090789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存