高效地将 Swift Array 复制到 iOS Metal 的内存缓冲区

2024-04-01

我正在使用 Apple 的新 Metal 框架编写 iOS 应用程序。我有一个 Matrix4 对象数组(请参阅Ray Wenderlich 的教程 http://www.raywenderlich.com/81399/ios-8-metal-tutorial-swift-moving-to-3d)我需要通过 MTLDevice.newBufferWithLength() 方法传递给着色器。 Matrix4 对象利用 Apple 的 GLKit(它包含 GLKMatrix4 对象)。

我正在利用 GPU 调用进行实例化。

稍后我会将其更改为一个结构,其中每个实例包含更多数据(不仅仅是 Matrix4 对象)。

  1. 如何有效地将 [Matrix4] 对象数组复制到此缓冲区中?

  2. 有一个更好的方法吗?同样,我将在将来扩展它以使用包含更多数据的结构。

下面是我的代码的一个子集:

let sizeofMatrix4 = sizeof(Float) * Matrix4.numberofElements()

// This returns an array of [Matrix4] objects.
let boxArray = createBoxArray(parentModelViewMatrix)

let sizeOfUniformBuffer = boxArray.count * sizeOfMatrix4
var uniformBuffer = device.newBufferWithLength(sizeofUniformBuffer, options: .CPUCacheModeDefaultCache)
let bufferPointer = uniformBuffer?.contents()

// Ouch - way too slow.  How can I optimize?
for i in 0..<boxArray.count
{
    memcpy(bufferPointer! + (i * sizeOfMatrix4), boxArray[i].raw(), sizeOfMatrix4)
}

renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, atIndex: 2)

笔记: boxArray[i].raw() 方法在 Objective-C 代码中定义如下:

- (void *)raw {
    return glkMatrix.m;
}

您可以看到我循环遍历每个数组对象,然后执行 memcpy。我这样做是因为我在将数组视为一组连续的内存时遇到问题。

Thanks!


Swift 数组被承诺是连续的内存,但您需要确保它确实是一个 Swift 数组,而不是秘密的 NSArray。如果您想完全确定,请使用 ContigiousArray。即使其中的对象可以桥接到 ObjC,这也将确保连续的内存。如果您想更多地控制内存,请查看ManagedBuffer.

这样,您应该使用newBufferWithBytesNoCopy(length:options:deallocator)在现有内存周围创建 MTL 缓冲区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效地将 Swift Array 复制到 iOS Metal 的内存缓冲区 的相关文章

  • 在 React Native 中将 Swift 事件发送到 Javascript 的正确流程

    我一直在尝试使用 Swift 构建全面的蓝牙功能 我目前陷入了如何将事件从 Swift 发送回 React Native 的困境 我尝试过this https stackoverflow com questions 31870775 rea
  • 如何在 Firebase Analytics 事件中报告参数

    我用过Fabric with iOS在此之前 在同一分析事件中报告自定义参数非常容易 如下所示 Answers logCustomEvent withName saved border customAttributes image inde
  • ReactNative - 未处理的 JS 异常:SyntaxError

    当我尝试在 iOS 8 上启动 RUN 应用程序时 出现这个奇怪的错误 Unhandled JS Exception SyntaxError仅此而已 不再有更多信息 有any1偶然发现这个问题吗 在 iOs 9 上应用程序运行正常 x代码版
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 使 iOS 应用程序与 iPhone 6 和 iPhone 6 尺寸兼容 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我创建了一个应用程序 其中使用 xib 进行布局 目前我使用两种不同的 xib 一种用于iPhone4 320 480 一种用于iPh
  • 启动深色或浅色模式的图像

    如何为深色模式和浅色模式选 择一组不同的启动图像 我有一个 LaunchImages 集 当应用程序启动时 会显示一个图像 对于浅色模式 这似乎不错 但是如果我尝试在设置为深色模式 iOS 13 的设备上打开我的应用程序 则该图像看起来很糟
  • 为什么在迭代字典时会出现“类型 [object] 的值没有成员 'lowercaseString'” 错误? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有几个对象 Struct object var title String var one object green v
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • 如何解决malloc_error_break?

    我在 iOS 3 0 模拟器上遇到此错误 但在 3 1 3 和 3 2 模拟器上没有遇到此错误 创建符号断点后malloc error break 我在日志中看到了这一点 Session started at 2010 02 13 19 1
  • 为什么 UITableViewCell 不可访问(对于 VoiceOver)

    我并不是想解决任何问题 当然你可以设置isAccessibilityEnabled true它有效 我的问题是 为什么它默认关闭并且界面生成器中没有适当的部分 在我看来 不建议使 UITableViewCell 子类可访问 有没有更好的方法
  • 为 Swift 对象/属性设置观察者

    我一直在寻找一种在连接到 Mac 的显示器数量发生变化时触发方法的方法 我知道我可以获得 NSScreen screens count 的值 但我需要找到一种方法来在该值发生变化时创建通知或其他内容 或者指示所连接的显示器数量发生变化的其他
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • 如何重新定位或移动 Google Maps SDK 上的当前位置按钮?

    如何将 Objective C 中的当前位置按钮移至我的偏好 现在 我已启用它 但底角有东西挡住了它 Thanks 您可以使用 padding 将按钮向上移动 self mapView padding UIEdgeInsets top 0
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • 不明白 Swift 中的闭包示例

    我正在尝试了解 swift 和闭包 我被这个例子困住了 numbers map number Int gt Int in let result 3 number return result 什么是 number Int gt Int 它是一
  • Cordova 在 iOS 中显示警告“线程警告:[您的函数]花了 [n] 毫秒”

    THREAD WARNING Console took 81 661865 ms Plugin should use a background thread 在跑步的时候iOS 手机差距项目 对于一些剩余的插件 例如地理位置和文件系统 也是
  • 沙盒尝试恢复消耗性 IAP

    我一直在尝试在 iOS 上测试一些消耗性 IAP 但遇到了一个奇怪的错误 弹出一条警报 其中包含以下文本 此应用内购买已被购买 它将恢复为 自由的 环境 沙盒 我已经检查过 并且确定我的 IAP 可以在 iTunesConnect 中使用
  • 将 UIButton 中的图像缩放到 AspectFit?

    我想将图像添加到 UIButton 并且还想缩放图像以适合 UIButton 使图像变小 请告诉我该怎么做 这是我尝试过的 但它不起作用 将图像添加到按钮并使用setContentMode self itemImageButton setI
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt

随机推荐

  • 在尽可能小的区域内拟合矩形

    IOI 95 四个矩形的六种基本布局 给出了四个矩形 找到最小的封闭 新 矩形 可以将这四个矩形安装到其中而不重叠 最小矩形是指面积最小的矩形 所有四个矩形的边都应与封闭矩形的相应边平行 图 1 显示了将四个矩形拼接在一起的六种方法 这六种
  • nginx 已卸载,localhost:8080 仍显示 nginx 欢迎页面

    我使用从brew卸载了nginxbrew uninstall nginx 但是当我去http localhost 8080 我仍然收到 欢迎使用 Nginx 消息 我已经做了什么 重新启动我的电脑 3次 使用删除了额外的 nginx 文件夹
  • 由于许可证问题,在 Jenkins 上构建 Android 失败

    我有一个应用程序 当我使用命令汇编等时 它构建成功 一切正常 我决定使用 Jenkins 但在构建时出现错误 其中显示 What went wrong 25 A problem occurred configuring project ap
  • 如何在 React 中使用引导工具提示?

    我之前有工具提示 并且正在尝试将我的组件迁移到 React 我还没有使用react bootstrap 因为我不确定是否会使用 因为它仍在大力开发中 而且还不是1 0 这是我的渲染代码的片段 span span
  • MySQL选择昨天的日期

    如果我有这样的约会 2013 03 25 我想写一个 MySQL 查询WHERE是 昨天 我该怎么办 这应该可以做到 WHERE date CURDATE INTERVAL 1 DAY
  • 如何更改Android中的数字选择器样式?

    I want to use the NumberPicker component widget but Instead in the default Holo theme I need to replace the blue color w
  • 使用 Logback 屏蔽密码?

    目前 我们一般都会记录进出系统的所有 XML 文档 其中一些文档包含明文密码 我们希望能够配置执行此操作的 logback 记录器 附加程序来进行一些模式匹配或类似操作 并且如果它检测到存在密码则将其替换 最有可能使用星号 请注意 我们不想
  • 尝试使用 CURL 连接到 ASPX 站点?

    我正在尝试登录此网址 http www kalahari com marketplace default aspx 正在提交的两个字段带有标签 ctl00 ctl00 ucMarketPlaceSupportNavigation txtMP
  • 如何在 BSD sed 中使用换行符替换?

    您好 我如何在 BSD sed 中执行以下操作 sed s n g 从手册页来看 它指出 n 将在替换字符串中按字面意思处理 如何避免这种行为 有替代方案吗 我使用的是 Mac OS Snow Leopard 我可以安装 fink 来获取
  • create-react-app 期间的 ENOENT(错误 -4058)

    当我输入 npm 命令 create react app my app 时 出现如下错误 npm ERR code ENOENT npm ERR syscall spawn C Windows System32 npm ERR path C
  • WebView 返回错误的 window.innerHeight

    我有一个使用 Android WebView 以及一些 JavaScript 的应用程序 当我的 WebViewClient 调用时onPageFinished 我提醒 JavaScript 运行初始化方法 我的 JavaScript 在我
  • MediaInfo Helper.Get Basic Video Info() 对于视频流失败

    我需要播放网络流视频 http www wowza com h264 Butterfly 256K mp4 http www wowza com h264 Butterfly 256K mp4 使用 LibVLC 我完成了代码和必要的事情
  • 如何在 Postgres 中获取序列名称列表?

    我想获取 Postgres 中的序列名称列表 在 Oracle 中 我可以使用 select sequence name from user sequences 但在 Postgres 中 当我使用该语句时 它总是会抛出错误 未找到用户序列
  • 如何使用 LTRIM/RTRIM 搜索和替换前导/尾随空格?

    我正在尝试清除充满价格的 NVARCHAR MAX 列中的前导空格和尾随空格 使用 NVARCHAR 由于从多个操作系统导入带有奇数字符的数据 此时 我有一个 t sql 命令可以从静态价格中删除前导 尾随空格 然而 当谈到利用同一个命令来
  • 在为 HTC VIVE 进行 Unity 工作时如何将一个对象粘贴到另一个对象位置

    我想创建一个场景 其中电线 子级 进入套接字 父级 然后电线成为父级的子级 并且它的位置与父级固定 即使我移动父级 电线也应该随之移动用它 该项目基于unity3D FOR HTC Vive 我已经使用 ontriggerenter 事件来
  • 如何使用 Eclipse PDT(xdebug 和 zend 调试器)调试 PHP 应用程序

    我正在开发一个应用程序 我正在使用 Eclipse php Helios IDE 来开发 php 应用程序 I 想知道以下事情与这个IDE相关 这样我就可以立即高效地实现PHP应用程序 1 如何使用Eclipse PHP Helios ID
  • Django 管理界面中的只读模型?

    如何在管理界面中使模型完全只读 它是一种日志表 我使用管理功能来搜索 排序 过滤等 但不需要修改日志 如果这看起来像重复的 这里是not我正在尝试做什么 我不是在寻找只读fields 即使将每个字段设为只读 您仍然可以创建新记录 我不想创建
  • 在导出为 .csv 文件之前连接两个数据框

    我正在制作一份大型调查问卷 并且为不同问题 例如 df1 和 df2 生成频率汇总表 a lt c 1 5 b lt c 4 3 2 1 1 Percent lt c 40 30 20 10 10 df1 lt data frame a b
  • 如何为订单中的位置设置动画?

    我想按顺序移动拼图块 而不是立即移动 这是我的脚本 document ready function left click function for var i 1 i lt length i var string s i toString
  • 高效地将 Swift Array 复制到 iOS Metal 的内存缓冲区

    我正在使用 Apple 的新 Metal 框架编写 iOS 应用程序 我有一个 Matrix4 对象数组 请参阅Ray Wenderlich 的教程 http www raywenderlich com 81399 ios 8 metal