我的课程是在屏幕外渲染图像.我认为重复使用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图像而不是绘制图像.
用户右键单击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)
尝试编写文件会导致这些控制台通知:
我正在编辑一些CGImages并且很奇怪,直到现在我才开始在绘制它们之前NSImage从那些CGImages中创建s .所以我试着改变代码,以便我CGImage直接将s 绘制成NSGraphicsContext.currentContext().graphicsPort.如你所见,我在这里使用Swing但是我认为Objective-C也存在同样的问题.
看一下我看到的文档graphicsPort将在10.10中被弃用,但我找不到另一种方法来获取当前的CGContext,NSGraphicsContext也没有办法创建一个CGContext来自NSGraphicsContext.
有谁知道检索上下文的正确方法是什么?如果不是 - 有没有办法将graphicsPort's COpaquePointer,显然是一个初始化的NSPipe对象)转换为CGContextRef?虽然使用已被标记为已弃用的代码会非常不令人满意,但我会考虑它,直到有更好的解决方案.
在可编辑的前元素上,只有在按下回车键时才运行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"
我在这做错了什么?
cgcontext ×2
cocoa ×1
deprecated ×1
findersync ×1
macos ×1
objective-c ×1
preact ×1
quartz-2d ×1
reactjs ×1
read-write ×1
sandbox ×1