SwiftUI更新降低了金属窗的FPS

我正在尝试使用SwiftUI和Metal。我有2个窗口,一个带有各种列表和控件,另一个带有Metal窗口。

视窗

我让滑块数据更新了Metal窗口,但是当我将滑块移动时,FPS从60下降到大约25。我删除了视图之间的所有链接,并且移动滑块仍将FPS拖放到了金属窗口中。

列表视图似乎也降低了FPS。

我在启动时使用以下方法创建金属窗口:

    metalWindow = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
                           styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
                           backing: .buffered, defer: false)
    metalWindow.center()
    metalWindow.setFrameAutosaveName("Metal Window")
    metalWindow.makeKeyAndOrderFront(nil)

    mtkView = MTKView()
    mtkView.translatesAutoresizingMaskIntoConstraints = false
    metalWindow.contentView!.addSubview(mtkView)
    metalWindow.contentView!.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[mtkView]|", options: [], metrics: nil, views: ["mtkView" : mtkView!]))
    metalWindow.contentView!.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[mtkView]|", options: [], metrics: nil, views: ["mtkView" : mtkView!]))

    device = MTLCreateSystemDefaultDevice()!
    mtkView.device = device

    mtkView.colorPixelFormat = .bgra8Unorm

    commandQueue = device.makeCommandQueue()!

    mtkView.delegate    = self
    mtkView.sampleCount = 4
    mtkView.clearColor  = MTLClearColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 1.0)
    mtkView.depthStencilPixelFormat = .depth32Float

控制窗口是一个SwiftUI视图:

struct ControlPanelView: View {

    @ObservedObject var controlPanel = ControlPanel()

    @State private var cameraPos   = Floatx3()
    @State private var lightingPos = Floatx3()

    var body: some View {

        HStack{
            VStack{
                VStack{
                    Text("Objects")
                    List(self.controlPanel.objectFiles) { object in
                        Text(object.name)
                    }
                }
                VStack{
                    Text("Textures")
                    List(self.controlPanel.textureFiles) { texture in
                        HStack {
                            Image(nsImage: texture.image).resizable()
                                .frame(width: 32, height: 32)
                            Text(texture.name)
                        }
                    }
                }
            }
            VStack{
                HStack{
                   XYZControl(heading: "Camera Controls",   xyzPos: $cameraPos)
                   XYZControl(heading: "Lighting Controls", xyzPos: $lightingPos)
                }.padding()
                HStack{
                    Text("Frames Per Second:")
                    //Text(String(renderer.finalFpsCount))
                }
            }
        }.border(Color.red).padding()
    }
}

struct XYZControl: View {

    var heading : String
    @Binding var xyzPos : Floatx3

    var body: some View {

        VStack{
            Text(heading).padding(.bottom, 5.0)
            PositionSlider(sliderValue: $xyzPos.x, label: "X", minimum: -15.0, maximum: 15.0)
            PositionSlider(sliderValue: $xyzPos.y, label: "Y", minimum: -15.0, maximum: 15.0)
            PositionSlider(sliderValue: $xyzPos.z, label: "Z", minimum: -15.0, maximum: 15.0)
        }.border(Color.yellow).padding(.leading)
    }
}

struct PositionSlider: View {

    @Binding var sliderValue : Float
    var label   : String
    var minimum : Float
    var maximum : Float

    static let posFormatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.maximumFractionDigits = 3
        return formatter
    }()

    var body: some View {
        VStack{
            Text(label)
            HStack{
                Text("\(Self.posFormatter.string(from:NSNumber(value: minimum))!)")
                Slider(value: $sliderValue, in: minimum ... maximum)
                Text("\(Self.posFormatter.string(from:NSNumber(value: maximum))!)")
            }.padding(.horizontal).frame(width: 150.0, height: 15.0, alignment: .leading)
            Text("\(Self.posFormatter.string(from:NSNumber(value: sliderValue))!)")
        }.border(Color.white)
    }
}

谁能帮忙为什么帧率下降?

我删除了金属窗口,并使用NSViewRepresentable将其合并到控制窗口中,现在看起来像这样: 多合一视窗

这仍然有同样的问题。

渲染代码(做得不多!)。即使不渲染茶壶,它仍然会减慢速度。

    func draw(in view: MTKView) {

        if let commandBuffer = commandQueue.makeCommandBuffer() {

            commandBuffer.label = "Frame command buffer"

            if let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: view.currentRenderPassDescriptor!) {

                renderEncoder.label = "render encoder"

                renderEncoder.endEncoding()
            }

            commandBuffer.present(view.currentDrawable!)

            commandBuffer.addCompletedHandler { completedCommandBuffer in
                self.computeFPS()
            }
            commandBuffer.commit()
        }
    }

正如0xBFE1A8所说,SwiftUI阻塞了主线程。我使用CVDisplayLink .global(qos:.userInteractive)将draw函数移到了回调设置中。当移动滑块时,这将阻止渲染速度降低。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

React Navigation 5真的很慢并且在Expo上降低了JS FPS

来自分类Dev

BIOS升级降低了CPU温度

来自分类Dev

Android UI降低了视图setRotation

来自分类Dev

*无信号*并降低了定制PC的功耗?

来自分类Dev

更新查询需要删除并重新插入所有相关项目,这降低了我的应用程序的速度

来自分类Dev

Flash中的库项目降低了导出速度

来自分类Dev

OO Javascript继承降低了两个层次

来自分类Dev

OpenAM J2EE代理安装降低了tomcat

来自分类Dev

RabbitMQ严重降低了同时发布/消费的速度

来自分类Dev

CSS过渡-在线观看时降低了帧频

来自分类Dev

为什么应用高斯滤镜后图像的亮度降低了?

来自分类Dev

Gcc增加的优化降低了Cython执行速度

来自分类Dev

PdfSharp降低了我的jpg输入图像的质量

来自分类Dev

PdfSharp降低了我的jpg输入图像的质量

来自分类Dev

PdfSharp降低了我的jpg输入图像的质量

来自分类Dev

USB硬盘备份的可靠性降低了吗?

来自分类Dev

Android全屏主题降低了显示按钮的高度

来自分类Dev

OpenAM J2EE代理安装降低了tomcat

来自分类Dev

Pulseaudio在屏幕省电的情况下降低了HDMI输出

来自分类Dev

循环文件依赖降低了怪异性

来自分类Dev

Django smpt 电子邮件后端降低了性能

来自分类Dev

如何在Pygame中降低Sprite FPS?

来自分类Dev

使用python降低相机的FPS

来自分类Dev

照片修剪工具可降低剪辑的fps

来自分类Dev

AWS s3降低了与标准版相同的冗余成本?

来自分类Dev

Google是否降低了Google Apps脚本的电子邮件限制?

来自分类Dev

使用Scotty的网络I / O意外地降低了吞吐量

来自分类Dev

data.table中的unique错误地降低了一些价值

来自分类Dev

新的HTML5元素降低了CSS特异性

Related 相关文章

热门标签

归档