草庐IT

ios - OpenGL ES 2/iOS GLKit 的设计建议

coder 2024-01-27 原文

我想使用新的 GLKit 框架构建一个应用程序,我需要一些设计建议。我想创建一个应用程序,最多可以显示几千个“砖 block ”(具有非常简单几何形状的对象)。大多数将具有相同的纹理,但多达几百个将具有独特的纹理。我希望砖 block 每隔几秒出现一次,移动到位然后留在原地(在世界坐标中)。我想模拟一个位置和方向由用户手势控制的相机。

我需要的建议是关于如何组织代码。我希望我的模型是砖 block 的集合,这些砖 block 所关联的不仅仅是图形数据:

  • 将类似 View 的对象与每个 handle 几何形状、纹理等相关联是否有意义?
  • 每 block 砖都应该有自己的顶点缓冲区吗?
  • 每个人都应该有自己的 GLKBaseEffect 吗?
  • 我正在寻求帮助来组织什么对象在设置期间应该做什么,然后是渲染。

我希望我能接近典型的 MVC 模式,我的 GLKViewController 观察模型状态变化,根据手势控制眼睛坐标,等等。

如果您能提供一些建议或引导我找到一个好的例子,将不胜感激。提前致谢!

最佳答案

关于模型,我认为类似于 UIImageUIImageView 之间关系的方法是合适的。所以每种类型的砖 block 都有一个顶点缓冲区、GLKBaseEffect、纹理和其他任何东西。每个积木可能会出现多次,就像多个 UIImageViews 可能使用相同的 UIImage 一样。在保留多个引用框架方面,构建一个本质上等同于 UIView 的层次结构实际上是一个非常好的主意,每个层次结构都包含一些相对于父级的转换和一种能够显示模型的类型。

根据 GLKit 文档,我认为保留所需相机类型(以及对象位置)的最佳方法是将其直接存储为 GLKMatrix4GLKQuaternion — 因此您不会从相机的其他一些描述中导出矩阵或四元数(加上位置),而是矩阵或四元数直接是相机的存储。

这两个类都有内置的方法来应用旋转,GLKMatrix4 可以直接处理平移。因此,您可以直接将相关手势映射到这些功能。

在以这种方式处理相机时,我能想到的唯一一点不明显的事情是你想将 inverse 发送到 OpenGL 而不是事物本身。假设你使用一个矩阵,原因是如果你想在那个位置绘制一个对象,你会直接加载矩阵然后绘制对象。当您在与相机相同的位置绘制对象时,您希望它最终被绘制在原点。因此,您必须为相机加载的矩阵是您要加载以在该位置绘制的矩阵的逆矩阵,因为您希望两者相乘成为单位矩阵。

我不确定您的积木模型有多复杂,但如果它们很简单并且完全独立移动,您可能会遇到性能瓶颈。处理 OpenGL 时的一般规则是一次可以提交的几何体越多,一切进行得越快。因此,例如,在大多数游戏中,一个完全静态的世界比所有事物都可以独立移动的世界更容易有效地绘制。如果您正在绘制六面立方体并独立移动它们,那么您可能会发现性能比您预期的要差。

如果您有任何一致移动的砖 block ,那么将它们绘制为一个单一的几何体会更有效。如果您有任何绝对不可见的积木,那么甚至不要尝试绘制它们。从 iOS 5 开始,GL_EXT_occlusion_query_boolean 可用,这是一种将一些几何图形传递给 OpenGL 并询问它是否可见的方法。您可以通过构建描述数据的层次结构(如果您直接遵循 UIView 类比,您将已经拥有)在实时场景中使用它,为每个 View 计算或存储一些边界几何图形和仅当遮挡查询表明至少某些边界几何体可见时才进行绘制。通过遵循这种逻辑,您通常可以在提交几何图形之前很久就丢弃它。

关于ios - OpenGL ES 2/iOS GLKit 的设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940261/

有关ios - OpenGL ES 2/iOS GLKit 的设计建议的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  9. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐