小编Eni*_*nie的帖子

重用CGContext导致奇怪的性能损失

我的课程是在屏幕外渲染图像.我认为重复使用CGContext而不是一次又一次地为每个图像创建相同的上下文将是一件好事.我设置了一个成员变量,_imageContext所以我只需要创建一个新的上下文,如果_imageContext是这样的话:

if(!_imageContext)
    _imageContext = [self contextOfSize:imageSize];
Run Code Online (Sandbox Code Playgroud)

代替:

CGContextRef imageContext = [self contextOfSize:imageSize];
Run Code Online (Sandbox Code Playgroud)

当然我不再发布CGContext了.

这些是我所做的唯一改变,结果是重用上下文减慢了从大约10ms到60ms的渲染速度.我错过了什么吗?在重新插入之前,我是否必须清除上下文或其他内容?或者它是重建每个图像的上下文的正确方法?

编辑

找到最奇怪的连接..

当我在应用程序开始渲染图像时,我正在寻找应用程序内存难以置信地增加的原因,我发现问题在于我将渲染图像设置为NSImageView.

imageView.image = nil;
imageView.image = [[NSImage alloc] initWithCGImage:_imageRef size:size];
Run Code Online (Sandbox Code Playgroud)

看起来ARC并没有发布以前的版本NSImage.避免这种情况的第一种方法是将新图像绘制成旧图像.

[imageView.image lockFocus];
[[[NSImage alloc] initWithCGImage:_imageRef size:size] drawInRect:NSMakeRect(0, 0, size.width, size.height) fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
[imageView.image unlockFocus];
[imageView setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

内存问题已经消失了,并且CGContext-reuse问题发生了什么?不重复使用上下文现在需要20ms而不是10ms - 当然,绘制到图像所需的时间比设置它要长.重用上下文也需要20ms而不是60ms.但为什么?我没有看到可能有任何连接,但我可以重现旧的状态,重用只需要设置NSImageView图像而不是绘制图像.

cocoa core-graphics objective-c cgcontext

17
推荐指数
2
解决办法
1465
查看次数

沙盒环境中FinderSync扩展的读写访问权限

场景

用户右键单击Finder中的目录并查找自定义MenuItem.单击该项将告诉我的应用程序打开一个用户可以完成其工作的窗口.完成后,需要通过右键单击将文件写入他选择的文件夹.

问题

我现在一切都工作了,但最后一部分.扩展程序无法写入所选文件夹.

选择他想与之交互的文件夹的用户似乎不属于Powerbox的一部分 - 我的理解方式 - 只能用openPanel和激活savePanel.如何获得与用户通过菜单项选择的文件夹进行交互的权限?我无法在开发人员库中找到对该问题的任何可能解决方案的引用.不在沙盒指南中,而不在扩展指南中.

如果无法使用所选文件和文件夹,添加自定义菜单项的可能性将毫无用处,因此我确信必须有一种方法来访问它们.

也许我试图写的方式是错的.我的主应用程序将临时文件写入共享组文件夹.之后,它会发送扩展程序监听的通知:

func copyFile(notification:NSNotification)
{
    NSLog("write file")

    if let target = tmpTarget
    {
        let secureContainer = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.de.enie.Nu")
        let contents = NSFileManager.defaultManager().contentsOfDirectoryAtURL(secureContainer!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles | NSDirectoryEnumerationOptions.SkipsPackageDescendants | NSDirectoryEnumerationOptions.SkipsSubdirectoryDescendants , error: nil)

        for content in contents as! [NSURL]
        {
            NSLog("tmp data: \(content.path!)")
            if content.lastPathComponent!.stringByDeletingPathExtension == "SharedData"
            {
                NSLog("found shared file")

                NSFileManager.defaultManager().copyItemAtURL(content, toURL: target.URLByAppendingPathComponent(content.lastPathComponent!), error: nil)

                NSFileManager.defaultManager().removeItemAtURL(content, error: nil)
            }
        }
        tmpTarget = nil
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试编写文件会导致这些控制台通知:

  • 打开/Users//Desktop/SharedData.png:不允许操作 …

macos sandbox read-write findersync

7
推荐指数
1
解决办法
890
查看次数

SDK 10.10中的graphicsPort的Quartz 2D替代

场景:

我正在编辑一些CGImages并且很奇怪,直到现在我才开始在绘制它们之前NSImage从那些CGImages中创建s .所以我试着改变代码,以便我CGImage直接将s 绘制成NSGraphicsContext.currentContext().graphicsPort.如你所见,我在这里使用Swing但是我认为Objective-C也存在同样的问题.

看一下我看到的文档graphicsPort将在10.10中被弃用,但我找不到另一种方法来获取当前的CGContext,NSGraphicsContext也没有办法创建一个CGContext来自NSGraphicsContext.

问题:

有谁知道检索上下文的正确方法是什么?如果不是 - 有没有办法将graphicsPort's COpaquePointer,显然是一个初始化的NSPipe对象)转换为CGContextRef?虽然使用已被标记为已弃用的代码会非常不令人满意,但我会考虑它,直到有更好的解决方案.

deprecated cgcontext quartz-2d

6
推荐指数
1
解决办法
582
查看次数

React(Preact)渲染内容两次

在可编辑的前元素上,只有在按下回车键时才运行onKeyDown脚本,以避免文本中不需要的HTML元素.

render({}, {content}) {
        console.log("render: "+content);
        return <p contenteditable onKeyDown={this.handleKeyDown}>{content}</p>
}
Run Code Online (Sandbox Code Playgroud)

handleKeyDown函数中,段落内容被更改setState(content: newText)并被调用,以便再次呈现内容.这导致新文本被写入两次.

当我输入"hello world"并在"hello"之后打破它将导致"hello
worldhello
world"

即使handleKeyDown和render函数记录正确的字符串:
"hello
world"

我在这做错了什么?

reactjs preact

2
推荐指数
1
解决办法
286
查看次数