gpt4 book ai didi

objective-c - subview 中的 NSView TouchesMovedWithEvent 正在暂停带有内置触控板的 SKScene,但不是魔术触控板?

转载 作者:行者123 更新时间:2023-12-03 17:21:27 24 4
gpt4 key购买 nike

我有一个自定义 NSView 子类,在我的项目中用作 subview https://github.com/torchie/TrackKit 。它检测 NSTouches 并收集它们的物理数据,然后在其 drawRect 的详细模式方法中绘制这些内容。同时,SpriteKit 场景渲染它所渲染的内容。

但是,当我在内置触控板上移动手指时,SpriteKit View 中的所有渲染都会暂停,直到触摸再次静止。 Magic Trackpad,帧率下降,但渲染并未完全停止。在这两种情况下, subview 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,而不是外置妙控板。我发现设备之间对 TouchMoved 的解释没有相关差异。

最佳答案

最初的假设:对于touchesMoved事件,内置触控板的轮询率明显高于魔法触控板,导致drawRect数量较多,并中断SpriteKit View 的绘制线程。

失败 - 增加 TouchMovedWithEvent 调用次数和来自 setNeedsDisplay 的 DrawRect 调用次数的计数器,结果表明同一时间段内内置触控板和 Magic Trackpad 之间的数量没有显着差异。

解决方案:

touchesMovedWithEvent 在方法末尾为自定义 View 调用了 setNeedsDisplay。

消除 TouchMovedWithEvent 中的 setNeedsDisplay 调用,而是在 SpriteKit 场景的更新方法中调用自定义 View 的 setNeedsDisplay,从而“从上方”操作该 subview 解决了该问题。

TKMyScene:

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

而不是TKDetectorView

-(void)touchesMovedWithEvent {
[self setNeedsDisplay:YES];
}

关于objective-c - subview 中的 NSView TouchesMovedWithEvent 正在暂停带有内置触控板的 SKScene,但不是魔术触控板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475953/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com