小编Pat*_*yer的帖子

Swift Dictionary即使在优化的情况下也会变慢:执行uncessary retain/release?

下面的代码将简单的值持有者映射到布尔值,在Java中的运行速度比Swift 2 - XCode 7 beta3,"最快,最具侵略性的优化[-Ofast]"以及"快速,整体模块优化"开启速度快20倍.我可以在Java中获得超过280M的查询/秒,但在Swift中只有大约10M.

当我在Instruments中查看它时,我发现大多数时间都会进入与地图查找相关的一对保留/释放调用.任何关于为什么会发生这种情况或解决方法的建议都将受到赞赏.

代码的结构是我的真实代码的简化版本,它具有更复杂的密钥类,并且还存储其他类型(尽管布尔值是我的实际情况).另外,请注意我使用单个可变键实例进行检索以避免在循环内分配对象,根据我的测试,这在Swift中比在不可变键中更快.

编辑:我也试过切换到NSMutableDictionary,但当与Swift对象一起使用时,它看起来非常慢.

EDIT2:我已经尝试在objc中实现测试(它没有可选的解包开销)并且速度更快但仍然比Java慢一个数量级...我将把这个例子作为另一个问题提出来看看是否有人有想法.

EDIT3 - 答案.我在下面的答案中公布了我的结论和解决方法.

public final class MyKey : Hashable {
    var xi : Int = 0
    init( _ xi : Int ) { set( xi ) }  
    final func set( xi : Int) { self.xi = xi }
    public final var hashValue: Int { return xi }
}
public func == (lhs: MyKey, rhs: MyKey) -> Bool {
    if ( lhs === rhs ) { return true }
    return lhs.xi==rhs.xi …
Run Code Online (Sandbox Code Playgroud)

performance swift swift2

11
推荐指数
1
解决办法
2759
查看次数

NSMutableDictionary比Java Map慢得多......为什么?

下面的代码将简单的值持有者映射到一个对象,使用XCode 7 beta3,"最快,最具侵略性的优化[-Ofast]",在Java中的运行速度比Objective-C快15倍.我可以在Java中获得超过280M查询/秒,但在objc示例中只能获得大约19M.(我在这里发布了相应的Java代码,因为这开始是一个Swift比较:Swift Dictionary甚至在优化时缓慢:执行uncessary retain/release?).

这是我的实际代码的简化版本,它肯定受哈希查找时间的约束,并且也展示了这种整体性能差异.在下面的测试中,我正在测试null的值,只是为了确保编译器不会优化掉查找,但在实际应用程序中,我会在大多数情况下使用该值.

当我查看乐器时,我发现在保留/释放,msgSend以及一些我不理解的锁定调用上花费了大量时间.

任何可以解释这个问题的想法比Java或任何变通方法慢10-15倍,我们将不胜感激.我实际上可以像下面那样实现一个完美的哈希,所以我可以使用一个快速的int-object字典用于iOS,如果我找到一个.

@interface MyKey : NSObject <NSCopying>
    @property int xi;
@end

@implementation MyKey
    - (NSUInteger)hash { return self.xi; }
    - (BOOL)isEqual:(id)object    { return ((MyKey *)object).xi == self.xi; }
    - (id)copyWithZone:(NSZone *)zone { return self; }

@end

    NSMutableDictionary *map = [NSMutableDictionary dictionaryWithCapacity:2501];
    NSObject *obj = [[NSObject alloc] init];

    int range = 2500;
    for (int x=0; x<range; x++) {
        MyKey *key = [[MyKey alloc] init];
        key.xi=x;
        [map setObject:obj forKey:key];
    }

    MyKey *key = [[MyKey …
Run Code Online (Sandbox Code Playgroud)

performance objective-c

10
推荐指数
1
解决办法
349
查看次数

使用ngModel和普通的ngController而不是指令?

在我的应用程序中,我想保留对代码的某些部分使用普通控制器的选项 - 而不是为永远不会重复使用的一次性事物创建指令.

在这些情况下,我经常想要从控制器发布一些数据,以便在包含的部分中使用.现在,我知道我可以简单地绑定控制器范围内的项目,但是我想明确指定"模型"位置,以使代码更易于维护和更易于阅读.我想要使​​用的是ng-model,因为它将用于自定义指令,但只是在我的普通控制器旁边:

<div ng-controller="AppController" ng-model='fooModel'>
  {{fooModel}}
</div>
Run Code Online (Sandbox Code Playgroud)

但是,我没有办法在不使用指令和'require'注入的情况下获得对生成的ngModelController的引用.

我知道我可以通过将$ attr注入到我的控制器中来轻松地创建自己的属性,并执行以下操作:

<div ng-controller="AppController" my-model='fooModel'>
  {{fooModel}}
</div>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只需手动获取或解析myModel值,并将我的模型粘贴到该名称下的$ scope中.但是在这种情况下感觉不对 - 我真的只需要一个控制器的"模型",并且我宁愿不必在ngModel存在时将这个样板添加到每个控制器.(这是事情的原则!)

我的问题是:

1)有没有办法使用ngModel和普通控制器来获得上述效果?

2)我一直在试图弄清楚ngModelControllers的存储位置,以便我可以查看调试器中的情况,但是无法找到它们.在使用ngModel指令时,我应该在范围或父范围内看到这些吗?(他们住在哪里?!?)

更新:如下面的答案所示,$ element.controller()可用于获取控制器.这工作(http://plnkr.co/edit/bZzdLpacmAyKy239tNAO?p=preview)然而,它有点不满意,因为它需要使用$ evalAsync.

angularjs angularjs-directive angularjs-scope

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

Angular.Dart如何动态地将组件添加到DOM?

我的项目中有一个自定义的@NgComponent,如果我将它放在应用程序的静态HTML中,它就可以工作.我想弄清楚的是如何动态地向DOM添加一个?如果我构造我的Component的一个实例,它似乎不是Element类型,因此它不能直接添加到DOM中元素的子元素.是否有另一种方法来构造我的组件或将其包装以便注入DOM?

例如,我天真地期望能够做类似的事情:

dom.Element holderEl = dom.document.querySelector("#my-holder");
holderEl.children.add( new MyComponent() ); 
Run Code Online (Sandbox Code Playgroud)

但我也试过使用innerHTML将包含我的自定义元素的HTML附加到元素上

holder.innerHtml="<my-component></my-component>"
Run Code Online (Sandbox Code Playgroud)

并使用document.createElement()创建元素

dom.Element el = dom.document.createElement("my-component");
dom.document.body.append(el);
Run Code Online (Sandbox Code Playgroud)

但添加时似乎没有实现该组件.

谢谢,帕特

dart angular-dart

5
推荐指数
1
解决办法
1678
查看次数

如何调试 Metal 计算着色器中难以理解的“内部错误”?(任意代码更改触发)

我有一个适用于 iOS 的 Metal 计算着色器,它已开始生成: "Error Domain=AGXMetal Code=1 "Compiler encountered an internal error" newComputePipelineStateWithFunction() 期间出现错误。

这些错误在每次运行时都是一致的,但似乎是由对不相关代码的几乎任意修改触发的。我的意思是 - 在自然地尝试调试为什么我添加最新的代码块表面上导致了这个问题时,我发现删除看似任意且不相关的代码或构造行将消除错误。

我想知道我是否可能达到了编译器的某些大小或复杂性限制。

我的着色器函数总共不到 200 行代码,结构为几个 C 函数,并且不分配太多内存,但它确实有一些循环并传递一些缓冲区指针。在某种程度上,一切都工作得很好,最近添加的代码也更加相似。

我的问题是:

1)首先 - 计算管道的编译器到底在做什么(生成我的default.metallib时没有完成)以及是否有希望从中收集更多调试信息?

2)如果这是代码的某种大小或复杂性问题,是否有人知道我如何重组以减轻这种情况?这些有道理吗?

为此发布示例代码将很困难,但如果解决方案没有首先出现,我将尝试使用它进行更新。

编辑:

因此,我所做的就是煞费苦心地减少和简化我的代码,直到我有一个相对紧凑的示例来说明问题。这并不像听起来那么简单,因为许多看似微小的变化会导致问题消失,但当复杂性增加时,问题总是会回来。

请记住,这与下面的代码的作用无关在计算管道运行之前很长时间内设置计算管道时会发生故障。如果您发现明显错误的内容,请告诉我,但除此之外,该代码仅具有代表性。

下面的着色器在 A9 处理器(iPhone 6s 或 6s plus)上失败,但在 A7(iPad Air 第一代)上运行。

void myFunc( device int *ibuff0, thread int *ibuff1)
{
    int counter = 0;
    float fbuff0[8];
    for( int i = 0; i<8; i++) {
        if ( ibuff0[0] == 42 ) {
            fbuff0[counter++] = 0.0;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

ios metal

5
推荐指数
0
解决办法
1124
查看次数

如何从Maya导出简单的装配模型以在Scenekit中使用?

我试图通过添加带有简单动画(例如“ panda.scn”和“ walk.scn”资产)的模型来尝试苹果公司的Fox游戏SceneKit示例(下面的链接)。

在此处输入图片说明 在此处输入图片说明

我可以创建一个没有任何关节或动画的静态模型,例如,在Maya(2017)中,我添加一个简单的球体,将选择内容导出到FBX_DAE(COLLADA)文件,将其拖到XCode中的项目中,然后将其转换为SCN文件。然后,我可以将该模型拖到“ level.scn”中,按我的期望进行定位和缩放。

但是,一旦在模型中添加任何动画或关节,我就无法在XCode中定位和缩放模型。

在Maya中,将两个关节添加到我的球体中,选择球体和关节并如上所述进行导出。当我检查XCode中的模型SCN时(孤立地或作为另一个场景中的参考),我发现我无法应用任何平移或缩放。XCode使我可以在GUI中移动xyz定位器并更新比例,但是模型不会改变。我可以在大纲视图中看到网格和关节,并且尝试移动关节而不是网格,但是它们无能为力。我什至尝试忽略GUI并在代码中放置模型,就像设置了熊猫角色一样,但是将位置或变换应用于节点无济于事-它始终以原点和默认比例显示。

暂时忽略这一点,从查看“ walk.scn”文件可知,动画只是带有关键帧的关节的输出。我试图通过仅将关节导出到单独的DAE并将其导入,然后像使用“ walkAnimation”一样在代码中应用它来重现该问题。这似乎也无济于事。

我已经尝试了FBX_DAE导出对话框的各种设置,包括烘焙动画(顺便说一句-在导出时烘焙动画与在Maya中烘焙动画之间有什么区别?测试。)

我非常喜欢在Maya中创建一些简单的角色动画并将其放入SceneKit的工作流程。任何帮助是极大的赞赏。

以供参考:

苹果的来源:https : //developer.apple.com/library/content/samplecode/Fox/Introduction/Intro.html

我的普通球模型的Maya场景具有两个关节:http//pat.net/misc/ball1.mb 和Maya的DAE输出:http : //pat.net/misc/ball1.dae

更新:

Mnuages的答案似乎是正确的,因为当我在几何图形和关节上添加了父控件并使用SceneKit允许我移动它们时。但是即使在我对这些节点及其转换在Maya中如何关联的理解有所了解之后,我仍然没有真正了解SceneKit如何解释它们。(如果有的话,很乐意阅读一些文档,这将进一步阐明这一点)。

更新#2:

我终于可以通过执行以下操作来创建动画:1)导出整个场景或仅导出动画的关节,并确保在DAE导出对话框中选择“烘焙动画”选项,或使用Key- >烘焙动画。2)仅当我在场景工具箱中加载DAE文件而不是将其转换为SCN时,它才起作用。转换为SCN格式似乎会丢失动画。

xcode maya collada ios scenekit

5
推荐指数
1
解决办法
2009
查看次数

如何从由 CMSampleBuffer 数据生成的 CIImage 有效地读取像素值?

我正在从 iOS AVCaptureSesion 读取示例缓冲区,对它们执行一些简单的图像处理,然后分析结果图像中的像素。我已经使用 openCV 进行图像处理,但我想切换到核心图像,我希望对于这些简单的操作会更有效。但是,我完全坚持如何从生成的 CIImage 中读取像素值。

当我有一个由 CGImage 支持的 UIImage 时,我可以使用 cgImage dataProvider 来访问底层像素数据(下面的示例)。但是 CIImage 的模拟是什么?

这是我的一般流程:

    // Getting sample video data
    var session : AVCaptureSession = AVCaptureSession()

    // processing the sample buffer with core image
    func handleSampleBuffer(sampleBuffer: CMSampleBuffer) 
    {      
       let cvImage: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
       let ciImage: CIImage = CIImage(cvPixelBuffer: cvImage)

       let filteredImage = processWithCoreImage(image: ciImage)

       //
     // How can I efficiently get pixel values from filtered image here?
       //
    }

    func processWithCoreImage(image: CIImage) -> CIImage
    {
      // …
Run Code Online (Sandbox Code Playgroud)

core-image ios avcapturesession

5
推荐指数
0
解决办法
1684
查看次数

为什么我的 CGContext 被剪裁到边界?

我是否应该能够重写 drawInContext() 并在 CALayer 的边界之外进行绘制?即使我的图层的 maskToBounds 设置为 NO(默认值),我的 drawInContext() 也会被调用,并将剪辑设置为我的图层边界,但我无法在其外部进行绘制。

我的测试层做了这样的事情:

-(void)drawInContext:(CGContextRef)context 
{   
    [super drawInContext:context];      
    NSLog(@"mask to bounds=%d", self.masksToBounds); // NO  
    CGRect clip = CGContextGetClipBoundingBox(context);
    NSLog(@"clip=%f,%f,%f,%f", clip.origin.x, clip.origin.y, clip.size.width, clip.size.height); // reports the bounds

    CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]);  
    CGContextBeginPath(context);
    CGContextSetLineWidth(context, 5.0);
    CGContextMoveToPoint(context, 0, 0);
    CGContextAddLineToPoint(context, 500, 0.0); // wider than my layer...
    CGContextStrokePath(context);
}
Run Code Online (Sandbox Code Playgroud)

这是我的设置方法:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    CALayer *layer = [[MyLayer alloc] init];
    layer.needsDisplayOnBoundsChange=YES;
    layer.frame = CGRectMake(50, 50, 200, 200);
    [self.view.layer addSublayer:layer];
}
Run Code Online (Sandbox Code Playgroud)

这只是核心动画层的限制吗?(需要在这层之上的图层中绘制吗?)

谢谢。

iphone quartz-2d ipad

3
推荐指数
1
解决办法
3494
查看次数