swift - 有没有更快的方法在 MacOS Cocoa swift 应用程序中绘制 NSImage?

标签 swift macos cocoa

我有一个 ImageView 定义为:

@IBOutlet weak var imgView: NSImageView!

写入的图像数据定义为:

var imageData = [[Int?]](
    repeating: [Int?](repeating: nil, count: 256),
    count: 240
)

我正在从计时器调用 onDraw 方法。绘制耗时最长的核心部分是:

    let image = NSImage(size: NSSize(width: 240, height: 256))

    image.lockFocus()

    for y in 0..<240 {
        for x in 0..<256 {
            let n = imageData[y][x]
            let scaledY = 255 - y
            let c = NSColor(red: CGFloat(((n! & 0xFF000000) >> 24)) / 255.0, green: CGFloat((n! & 0x00FF0000) >> 16) / 255.0, blue: CGFloat((n! & 0x0000FF00) >> 8) / 255.0, alpha: 1.0)
            c.drawSwatch(in: NSRect(x: x, y: scaledY, width: 1, height: 1))
        }
    }

    image.unlockFocus()

    imgView.image = image

我尝试更改计时器速度,但绘图部分似乎花费了太长的时间。尝试达到 30 FPS,但由于绘制图像数据需要时间,最终会跳帧。

注释掉 NSColor 对象和 c.drawSwatch 的创建,它运行得非常快。但显然什么也没画。

那么有没有更快的方法来绘制 NSImage 呢?抱歉,我对 Swift 和 Cocoa 开发还很陌生。

最佳答案

很难从你的问题中准确说出你想要做什么。

我的猜测是你应该create a CGImage from a data provider with the proper bitmap metadata然后create an NSImage from that 。如果您想要缩放,请不要在创建CGImage时尝试这样做。只需尽可能直接地向其提供原始图像数据即可。稍后,在从中创建 NSImage 时指定大小。

无论如何,请避免重新创建这些图像对象,除非底层图像数据已更改。例如,不要在每次要求 View 自行绘制时重新创建图像。

关于swift - 有没有更快的方法在 MacOS Cocoa swift 应用程序中绘制 NSImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57764795/

相关文章:

ios - 在哪里使用 Userdefaults

macos - Cocoa有类似WinAPI的DrawThemeBackground(绘制 native 控件的函数)之类的东西吗?

ios - 德尔福,FireMonkey : How to find unique hardware id in OSX and iOS

objective-c - 制作不受管理的 NSManagedObject 的副本

cocoa - 如何对 CGPath 的绘图进行动画处理?

ios - 合并托管对象上下文后,托管对象属性变为 nil

ios - 从数组返回的属性创建常量

swift - 将 Swift 2.3 转换为 Swift 3.0 - 错误,无法使用类型为'的参数列表调用 'dataTask'

swift - dispatch_semaphore_signal 不会调用 PHImageManager requestImageDataForAsset

C++:32 位到 64 位迁移