金属着色语言 - 更改缓冲区大小

2024-05-26

是否可以在运行时更改缓冲区大小?我们在注册期间分配缓冲区大小device:

device = MTLCreateSystemDefaultDevice()
queue = device!.makeCommandQueue()
        do {
            let library = device!.newDefaultLibrary()!
            let kernel = library.makeFunction(name: "compute")!
            cps = try device!.makeComputePipelineState(function: kernel)
        } catch let e {
            Swift.print("\(e)")
        }
        paramBuffer = device!.makeBuffer(length: MemoryLayout<Float>.size*2, options: [])

然后我们在运行时相应地更新它:

override public func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        if let drawable = currentDrawable {
            let command_buffer = queue.makeCommandBuffer()
            let command_encoder = command_buffer.makeComputeCommandEncoder()
            command_encoder.setComputePipelineState(cps)
            command_encoder.setTexture(drawable.texture, at: 0)
            command_encoder.setBuffer(paramBuffer, offset: 0, at: 0)

目前有效。但是,如果我有一个场景,即具有不同状态的粒子有不同的计数。例如,一开始我有 500 个粒子,过了一段时间,粒子慢慢地一次增加 10 个,比如 510、520、530,...

我应该如何处理这种情况?我应该重做queue每次粒子计数发生变化时?:

queue = device!.makeCommandQueue()
            do {
                let library = device!.newDefaultLibrary()!
                let kernel = library.makeFunction(name: "compute")!
                cps = try device!.makeComputePipelineState(function: kernel)
            } catch let e {
                Swift.print("\(e)")
            }
            paramBuffer = device!.makeBuffer(length: MemoryLayout<Float>.size*particleCount, options: [])//<--particleCount

或者有更好的方法来做到这一点?


不可以,缓冲区创建后就无法更改其大小。

为什么您认为每次都需要获取新的命令队列?命令队列与缓冲区大小无关。

您唯一需要重新创建的是缓冲区本身。

但是,如果粒子数量有上限,您可以简单地从一开始就以该最大大小创建缓冲区。没有要求缓冲区是exactly目前需要的大小。即使其中一部分暂时被浪费,它也可能比需要的大。

或者,如果您确实想随着粒子数量的增加将其重新分配得更大,我不一定每次都将其重新分配到足够大。相反,我会将当前所需的大小舍入为页面大小(4096 字节)的倍数。这样,你就有了一些余地。粒子计数可以增加一段时间,而无需重新分配缓冲区。

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

金属着色语言 - 更改缓冲区大小 的相关文章

  • 捕获 Camera2 预览帧返回空缓冲区

    我一直在开发一个简单的 Android 应用程序 旨在将流式相机帧从 Android Camera2 API 管道传递到我的算法 我已经制作了几个应用程序 忠实地使用 Android Camera1 API 执行此操作 但即使在检查 Goo
  • 使用 AVAssetReader 读取视频文件时由于内存利用率高而导致应用程序崩溃

    我正在尝试使用此问题中接受的答案中的方法来读取视频帧 使用 AVPlayer 访问单个帧 https stackoverflow com questions 39570745 accesing individual frames using
  • python pyaudio 使用多处理

    我正在尝试从音频流中获取样本并将它们放入共享队列中 我有另一个进程从该队列中提取 当我运行时 我收到此错误 recording Traceback most recent call last File record py line 43 i
  • 有什么办法可以查看标准输入缓冲区吗?

    我们知道stdin默认情况下是缓冲输入 证明这一点的证据是使用任何 留下数据 的机制stdin 例如scanf int main char c 10 0 scanf 9s c printf s and left is d n c getch
  • 如何在 ActionScript 3 中从缓冲区(ByteArray/Stream)播放 MP3 声音?

    所以 我有一个MP3 数据缓冲区 如果我保存此缓冲区并将其命名为 buffer mp3 它就会播放 但在这种情况下我不应该将其保存到文件系统 我必须玩 但我不能 我该怎么办 我尝试了下一个代码来播放该缓冲区 ByteArray Stream
  • 使用 Metal 进行屏幕撕裂和相机捕捉

    为了避免同时从 gpu 和 cpu 写入常量缓冲区 Apple 建议在信号量的帮助下使用三重缓冲系统 以防止 cpu 领先于 gpu 太多 这很好 并在现阶段至少有三个金属视频 然而 当常量资源是 MTLTexture 并且 AVCaptu
  • 为什么改变 SO_RCVBUF 的值不起作用?

    我正在制作一个程序 它创建一个原始套接字以读取所有流量 在调用socket 和recvfrom 之间 最后一个在循环中从缓冲区中取出所有数据包 我等待了5秒 当我运行该程序时 我使用 hping3 命令以 更快的模式 以快速填充缓冲区 向我
  • 在 JavaScript 或 Node 中将 Blob 数据转换为原始缓冲区

    我正在使用插件jsPDF https github com MrRio jsPDF它生成 PDF 并将其保存到本地文件系统 现在在 jsPDF js 中 有一些代码可以生成 blob 格式的 pdf 数据 如下所示 var blob new
  • Xcode GPU 着色器分析器

    Xcode gt GPU Capture 框架 gt GPU 着色器分析器无法工作 我运行 Capture 框架 并通过 GPU 着色器分析器打开 Metal 计算着色器源代码 但我看不到这样的着色器代码性能概况GPU 着色器分析器 htt
  • 金属顶点着色器绘制纹理的点

    我想执行 Metal 或 OpenGLES 3 0 着色器 通过混合绘制点基元 为此 我需要将纹理的所有像素坐标作为顶点传递给顶点着色器 该顶点计算要传递给片段着色器的顶点的位置 片段着色器仅输出启用混合的点的颜色 我的问题是 是否有一种有
  • Node.js 中的缓冲区是什么?

    正如您可以在有关 Buffer 类的 Node js 文档 http nodejs org api buffer html 一个缓冲区 类似于整数数组 但对应于 V8 堆外部的原始内存分配 到目前为止 一切都很好 现在让我困惑的是 从技术上
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 使用 FileInputStream 时如何确定理想的缓冲区大小?

    我有一个从文件创建 MessageDigest 哈希 的方法 我需要对很多文件 gt 100 000 执行此操作 用于读取文件的缓冲区应该设置多大才能最大限度地提高性能 大多数人都熟悉基本代码 为了以防万一 我将在这里重复一遍 Messag
  • System.Reactive:基于时间戳字段的基于时间的缓冲区

    我在 C 项目中使用 Reactive 库根据配置的策略对数据进行分组 所有这些数据都实现了以下接口 public interface IPoint object Value get DateTimeOffset Timestamp get
  • 金属着色语言 - 更改缓冲区大小

    是否可以在运行时更改缓冲区大小 我们在注册期间分配缓冲区大小device device MTLCreateSystemDefaultDevice queue device makeCommandQueue do let library de
  • 如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?

    我在 debian Jessie 上使用 mod proxy fcgi 和 apache 2 4 以及我的 C 应用程序 该应用程序使用 libfcgipp 执行 ServerSentEvents 我的问题是 apache 仍然缓冲我的响应
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 将屏幕(程序)输出保存到文件

    我需要保存整个输出Screen https en wikipedia org wiki GNU Screen到一个文件以便稍后检查所有内容 原因是我通过串行端口转储闪存 使用 Screen 与其交互 我想将其保存到文件中以检查内存结构 我试
  • iOS上数组的Swift Metal并行求和计算

    基于 Kametrixomanswer https stackoverflow com questions 38164634 compute sum of array values in parallel with metal swift
  • 如何通过 Web-Workers 传递自定义类实例?

    由于 Web Worker JSON 在线程之间序列化数据 因此这样的方法不起作用 worker js function Animal Animal prototype foobar function self onmessage func

随机推荐