ios搭建OpenGL环境

前言

本篇文章介绍在ios搭建OpenGL开发环境
在app的启动文章中,讲述了一个ios应用是如何启动的以及在IOS 13之后苹果公司推出的多窗口功能,通过app的启动这篇文章,我们基本能随心所欲的搭建一个app应用环境,搭建完成后的基本文件列表如下:
在这里插入图片描述

ViewController

接下来,我们要开始准备OpenGL环境,苹果默认提供了支持OpenGL的视图界面。

  • 首先我们需要让主界面绑定的ViewController遵循GLKViewDelegate协议
    注意:需要#import <GLKit/GLKit.h>

    #import <GLKit/GLKit.h>
    #import <
    @interface ViewController : 	UIViewController<GLKViewDelegate>
    @end
    

    GLKViewDelegate协议有一个必须遵守的接口,该接口是GLKView对象进行绘制的时候会调用的接口

    - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;
    
  • 接下来,需要定义GLKView变量,并且要进行初始化

    @property (nonatomic, strong) GLKView        * glkView;-(void)glkInit
    {// 获取当前窗体UIWindow* window = [[UIApplication sharedApplication] windows].firstObject;// 获取显示的范围CGRect bound = CGRectMake(0, window.safeAreaInsets.top, self.view.frame.size.width, self.view.frame.size.height-window.safeAreaInsets.top);// 初始化GLKView_glkView = [[GLKView alloc] initWithFrame:bound];// 初始化EAGLContext上下文_glkView.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];// 设置代理_glkView.delegate = self;_glkView.enableSetNeedsDisplay = YES;// 添加glkView到当前视图[[self view] addSubview:_glkView];
    }
    

    这个时候已经可以执行了,我们在-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect加入代码

    - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
    {glClearColor(1, 0, 0, 1);glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    }
    

    运行发现屏幕确实变红了

  • 但是,如果我们在上面绘制的方法里边打印一条日志,会发现日志不会一直在刷新打印。一般来说,对于游戏,我们需要一个帧率。而当前的绘制方法无法满足我们对帧率的需求。
    我们可以使用CADisplayLink来控制,CADisplayLink是一种定时器类型,它可以让你在每秒钟屏幕更新时执行一段代码。CADisplayLink定时器的精度非常高,因为它是和屏幕刷新频率同步的,所以可以确保动画的流畅度。另外,CADisplayLink定时器的调用方法是通过RunLoop进行的,所以它是线程安全的。
    使用CADisplayLink定时器的步骤如下:

    • 创建CADisplayLink对象。
    • 设置定时器的目标和选择器。
    • 将CADisplayLink添加到RunLoop中。

    我们在新建一个timerInit方法来使用CADisplayLink定时器,代码如下:

    -(void)timerInit
    {if(!_displayLink){_displayLink  = [CADisplayLink displayLinkWithTarget:self selector:@selector(render:)];[_displayLink setPreferredFramesPerSecond:60];[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode: NSRunLoopCommonModes];}
    }- (void)render:(CADisplayLink *)displayLink
    {[_glkView display];
    }
    
  • 然后我们需要设置

    _glkView.enableSetNeedsDisplay = NO;
    

这个时候再次运行发现日志能够一直打印了。

  • 接下来就可以在实现引擎刷新的逻辑了

gitlab地址

代码已经上传到gitlab
地址:https://gitlab.com/lingyanTools/sk_ios_gl.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/252115.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 快捷键ctrl+shift+f失效的解决方案

文章目录 搜狗输入法快捷键冲突微软输入法快捷键冲突 idea的快捷键ctrlshiftf按了没反应&#xff0c;理论上是快捷键冲突了&#xff0c;检查搜狗输入法和微软输入法快捷键。 搜狗输入法快捷键冲突 不需要简繁切换的快捷键&#xff0c;可以关闭它&#xff0c;或修改快捷键。 微…

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…

图解支付-金融级密钥管理系统:构建支付系统的安全基石

经常在网上看到某某公司几千万的个人敏感信息被泄露&#xff0c;这要是放在持牌的支付公司&#xff0c;可能就是一个非常大的麻烦&#xff0c;不但会失去用户的信任&#xff0c;而且可能会被吊销牌照。而现实情况是很多公司的技术研发人员并没有足够深的安全架构经验来设计一套…

简单的JavaScript去下载转换为Base64的PDF文件

新建一个文件&#xff0c;内容填写如下&#xff0c;然后保存为 .html 类型的文件 再用浏览器打开&#xff0c;就会是下面这样子&#xff1a; 图一红色textarea里面&#xff0c;可以将PDF文件转换成BASE64位后的内容贴进去&#xff0c;点击下载时&#xff0c;就可以直接下载成PD…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束&#xff1a; &#xff08;鼠标在任务栏右击&#xff0c;出现任务管理器&#xff09; 2.windowr&#xff0c;输入services.msc 带有Google Update的服务&#xff0c;选择禁用。 3.windowr&#xff0c;输入taskschd.msc 任务计划程序…

MTK8365安卓核心板_联发科MT8365(Genio 350)核心板规格参数

MTK8365安卓核心板是一款高性能的嵌入式处理器产品&#xff0c;基于联发科领先的SoC架构和先进的12纳米工艺。它集成了四核ARM Cortex-A53处理器&#xff0c;每个核心频率高达2.0 GHz&#xff0c;搭载强大的多标准视频加速器&#xff0c;支持高达1080p 60fps的视频解码。此外&a…

C++_多态

目录 1、什么是虚函数 1.1 什么是虚函数重写 1.2 虚函数的继承 1.3 协变 1.4 析构函数的重写 2、override和final 2.1 final 2.2 override 3、纯虚函数/抽象类 3.1 接口继承和实现继承 4、多态的原理 前言&#xff1a; 在C中&#xff0c;多态指的是调用同一个类的…

Python算法题集_环形链表

Python算法题集_环形链表 题234&#xff1a;环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例 题234&#xff1a;环形链表 …

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

自学Java的第十九天

一&#xff0c;每日收获 1.排序 2.冒泡排序法 3.查找 4.多维数组-二维数组 二&#xff0c;新名词与小技巧 三&#xff0c;今天学习中所遇到的困难 一&#xff0c;每日收获 1.排序 ① 排序的介绍 排序是将多个数据&#xff0c;依指定的顺序进行排列的过程。 ② 排序的…

【Rust】——rust前言与安装rust

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话&#xff0c;可以帮助用户完成任务或寻求信息。随着深度学习的最新进展&#xff0c;聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人&#xff0c;涵盖模型架构、数据准备、训练循环…

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

初始数据库

华子目录 什么是数据库DBMS&#xff08;数据库管理系统&#xff09;数据库系统和文件系统的区别文件系统数据库系统对比区别优缺点总结 常见数据库关系型数据库ACID原则关系型数据库的优缺点优点缺点 非关系型数据库存储方式常见的非关系型数据库非关系型数据库的优缺点优点缺点…

BUU UPLOAD COURSE 1

进去之后是一个上传页面 尝试上传一句话木马的php代码&#xff0c;保存为一个1.php&#xff0c;然后上传 <?php eval($_POST[1]);?>发现后缀名被改为jpg了 访问一下 http://a82bcc09-b809-42c9-b5ad-5406b72e5707.node5.buuoj.cn:81/uploads/65bfa77eab1f6.jpg发现可…

代码生成器(新):mybatis-plus-generator使用指南

代码生成器&#xff08;新&#xff09;官网 后端代码&#xff1a;点击查看 LearnElementUiAndSpringBoot 提醒&#xff1a;LearnElementUiAndSpringBoot下载完后&#xff0c;在运行调试 Main.java里的main方法之前&#xff0c;除了utils包和Main.java文件&#xff0c;其他包需…

异地办公必不可缺的远程控制软件,原理到底是什么?

目录 引言远程桌面连接软件的作用与重要性 基本概念与架构客户端-服务器模型网络通信协议 核心技术组件图形界面捕获与传输输入转发会话管理 性能优化策略带宽优化延迟优化 引言 远程桌面连接软件的作用与重要性 在当今这个高度数字化和网络化的时代&#xff0c;远程桌面连接软…

红队渗透靶机:LORD OF THE ROOT: 1.0.1

目录 信息收集 1、arp 2、nmap 3、knock 4、nikto 目录探测 1、gobuster 2、dirsearch WEB sqlmap 爆库 爆表 爆列 爆字段 hydra爆破 ssh登录 提权 信息收集 内核提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, ty…

U形金属卡

方管不锈钢防盗网挂勾&#xff0c;没找到合适的&#xff0c;自己设计一个。 difference(){ cube([43,20,27]);translate([2,-1,2]) cube([42,29,23]);translate([32,10,-1]) cylinder(50,3,3,$fn360); }if(1){ color("gray") translate([2,-20,2]) cube([23,60,23])…

JAVA中的object类

一、equals方法 1.和equals的比较 既可以判断基本类型有可以判断引用类型 如果判断基本类型&#xff0c;判断的值是否相等 int num1 10; double num2 10.0; System.out.println(num1 num2); 如果判断引用类型&#xff0c;判断的地址是否相等&#xff0c;即判断是不是同一…