ios搭建OpenGL环境

news/2024/7/20 22:05:56 标签: ios

前言

本篇文章介绍在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.niftyadmin.cn/n/5362932.html

相关文章

编程笔记 html5cssjs 073 JavaScript Object数据类型

编程笔记 html5&css&js 073 JavaScript Object数据类型 一、创建 Object二、Object 类型的属性与方法三、示例四、参考小结 JavaScript 中的 Object 数据类型是该语言中最复杂也最灵活的数据类型之一&#xff0c;它是其他所有内置对象和用户自定义对象的基础。在 JavaS…

深度学习图像分类相关概念简析+个人举例2(CNN相关原理概念与计算)

&#xff08;2&#xff09;卷积神经网络&#xff1a;英文全称Convolutional Neural Network,简称 CNN 是一种常用于图像分类的深度学习模型&#xff0c;其主要特点是包含了卷积层和池化层&#xff0c;能够提取图像的局部特征。输入层、卷积层、池化层、全连接层和输出层都是卷积…

【24.2.3笔记】C++ Primer 自学Day 20

四、表达式 12、bitset 操作 操作功能用法test(pos)pos位是否为1&#xff1f;a.test(4)any()任意位是否为1&#xff1f;a.any()none()是否没有位为1&#xff1f;a.none()count()值是1的位的个数a.count()size()位元素的个数a.size()[pos]访问pos位a[4]flip()翻转所有的位a.fl…

计算机视觉中的目标跟踪

从保护我们城市的监控系统到自动驾驶车辆在道路上行驶&#xff0c;目标跟踪已经成为计算机视觉中的一项基础技术。本文深入探讨了目标跟踪&#xff0c;探索了其基本原理、多样化的方法以及在现实世界中的应用。 什么是目标跟踪&#xff1f; 目标跟踪是深度学习在计算机视觉中广…

[349. 两个数组的交集](C语言)(两种解法:双指针+排序,哈希)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 前提&#xff1a; 看本文章之前&#xff0c;建…

docker安装定制gocd-agent

一、定制gocd-agent FROM gocd/gocd-agent-alpine-3.12:v21.1.0 MAINTAINER xxx "xxx163.com" # 切换到 root 用户 USER root # 安装 expect、jdk、docker RUN apk update && apk add expect && apk add openjdk8 && apk add docker &&…

【Android-Compose】手势检测实现按下、单击、双击、长按事件,以及避免频繁单击事件的简单方法

目录&#xff1a; 1 不需要双击事件 规避频繁单击事件2 需要双击事件&#xff08;常规写法&#xff09;3 后记&#xff1a;不建议使用上面的代码自定义按钮 1 不需要双击事件 规避频繁单击事件 var firstClickTime by remember { mutableStateOf(System.currentTimeMillis()…

HarmonyOS学习第二章:初识ArkTs/ArkUI,常用组件(待补充)

文章目录 一、ArkTs1.1 简介1.2 关键特性1.3 基础代码结构1.3.1 示例&#xff1a;1.3.2 页面组件1.3.3 自定义组件 二、ArkUI2.1 ArkUI介绍2.2 开发范式 三、常用组件的使用3.1 Text组件3.2 Column 列组件3.3 Row 行组件3.4 Flex 以弹性方式容器组件3.5 Grid 网格布局组件3.6 B…