1

プロジェクトhttps://github.com/torchie/TrackKitでサブビューとして使用されているカスタム NSView サブクラスがあります。NSTouches を検出し、物理データを収集し、drawRect の詳細モード メソッドでそれらを描画します。一方、SpriteKit シーンは、レンダリングするものをレンダリングします。

ただし、組み込みのトラックパッドで指を動かすと、タッチが再び静止するまで、SpriteKit ビューでのすべてのレンダリングが一時停止します。Magic Trackpad では、フレームレートが低下しますが、レンダリングは完全に停止しません。どちらの場合も、サブビュー TKDetectorView は引き続きタッチ ポイントをレンダリングします。

問題の touchesMoved メソッド:

-(void)touchesMovedWithEvent:(NSEvent *)event {
    for(NSTouch* touch in [event touchesMatchingPhase:NSTouchPhaseAny inView:self]) {
        [touch_identities setObject:touch forKey:[touch identity]];
    }
    [self phys_record];

    if(![self needsDisplay]) {
        [self setNeedsDisplay:YES];
    }   
}

内蔵トラックパッド (#0) と Magic Trackpad (#1) を同時にタッチした詳細モード機能のブレークポイントからのデータ:

touch_identities    __NSDictionaryM *   2 key/value pairs   0x0000608000055bd0
    [0] (null)  (no summary) : (no summary) 
        key NSConcreteValue *   0x600000054b80  0x0000600000054b80
        value   NSTouch *   0x6000000b2480  0x00006000000b2480
        NSObject    NSObject        
        _index  NSInteger   10  10
        _identity   NSConcreteValue *   0x600000054b80  0x0000600000054b80
        _phase  NSTouchPhase    2   2
        _normalizedPosition NSPoint (x=0.4923553466796875, y=0.4602508544921875)    
            x   CGFloat 0.4923553466796875  0.4923553466796875
            y   CGFloat 0.4602508544921875  0.4602508544921875
        _privateFlags   NSInteger   0   0
        _view   TKDetectorView *    0x6000001ff900  0x00006000001ff900
        _device NSObject *  0x600000013300  0x0000600000013300
        _deviceSize NSSize  (width=368.50393709999997, height=311.81102370000002)   
        previous_positions  NSMutableArray *    nil 0x0000000000000000
        _isResting  BOOL    YES '\xad'
[1] (null)  (no summary) : (no summary) 
    key NSConcreteValue *   0x60800005ea50  0x000060800005ea50
    value   NSTouch *   0x6080000b3740  0x00006080000b3740
        NSObject    NSObject        
        _index  NSInteger   1   1
        _identity   NSConcreteValue *   0x60800005ea50  0x000060800005ea50
        _phase  NSTouchPhase    2   2
        _normalizedPosition NSPoint (x=0.7928314208984375, y=0.3984222412109375)    
        _privateFlags   NSInteger   0   0
        _view   TKDetectorView *    0x6000001ff900  0x00006000001ff900
        _device NSObject *  0x600000014d70  0x0000600000014d70
        _deviceSize NSSize  (width=297.63779534999998, height=215.43307092000001)   
        previous_positions  NSMutableArray *    nil 0x0000000000000000
        _isResting  BOOL    YES '\xad'

指が動いているときに位置の配列が絶えず変更されることによって、SpriteKit レンダリング スレッドが中断された結果である可能性があると思いましたが、それではなぜ MacBook Air の内蔵トラックパッドでのみ発生しているのか説明できません。外付けの Magic Trackpad ではありません。デバイス間の touchesMoved の解釈に関連する違いは見つかりませんでした。

4

1 に答える 1

0

元の仮説: 組み込みのトラックパッドのポーリング レートは、touchesMoved イベントのマジック トラックパッドよりも大幅に高く、多くの drawRects が発生し、SpriteKit ビューの描画スレッドが中断されます。

失敗 — touchesMovedWithEvent 呼び出しの数と setNeedsDisplay からの drawRect 呼び出しの数の両方のカウンターをインクリメントすると、同じ期間にビルトインと Magic Trackpad の間に顕著な違いは見られませんでした。

解決:

touchesMovedWithEvent は、メソッドの最後でカスタム ビューの setNeedsDisplay を呼び出します。

touchesMovedWithEvent で setNeedsDisplay 呼び出しを削除し、代わりに SpriteKit シーンの更新メソッドでカスタム ビューの setNeedsDisplay を呼び出すことで、そのサブビューを「上から」操作することで問題が修正されました。

TKMyScene:

-(void)update {
    [detector setNeedsDisplay:YES];
}

TKDetectorView の代わりに

-(void)touchesMovedWithEvent {
    [self setNeedsDisplay:YES];
}
于 2014-08-27T05:25:38.493 に答える