2012-02-15 2 views
4

Mac OS X Lion의 CARemoteLayerServer 및 CARemoteLayerClient가 QuartzCore에 추가되었습니다. 여러 프로세스간에 그래픽 응용 프로그램을 분할하는 데 적합할지 조사하려고했지만 성공하지는 못했습니다. 좋은프로세스간에 CAREMoteLayerServer 및 CARemoteLayerClient를 사용할 수 있습니까?

- (void)buildLayerSingleProcess 
{ 
    CARemoteLayerServer *server = [CARemoteLayerServer sharedServer]; 

    self.client = [[CARemoteLayerClient alloc] initWithServerPort: server.serverPort];  
    uint32_t clientID = self.client.clientId;  

    CALayer *layer1 = [CALayer layer]; 
    layer1.bounds = CGRectMake(0.0, 0.0, 100.0, 100.0); 

    CGColorRef color = CGColorCreateGenericRGB(0.4, 0.2, 0.3, 1.0); 
    [layer1 setBackgroundColor: color]; 
    CFRelease(color); 

    [layer1 setOpacity: 0.75]; 
    [layer1 setBorderWidth: 5.0f]; 

    layer1.position = CGPointMake([[self.window contentView] frame].size.width/2.0, [[self.window contentView] frame ].size.height/2.0); 

    self.client.layer = layer2; 

    CALayer *servedLayer = [CALayer layerWithRemoteClientId: self.client.clientId];  
    [[[self.window contentView] layer] addSublayer: servedLayer]; 
} 

을, 그러나 나는 시도하고 프로세스 간의 유사한 일을하고 싶습니다 :

나는이의 라인을 따라 몇 가지 코드로, 하나의 프로세스 내에서 성공적으로 사용할 수 있습니다. server.serverPort가 mach_port_t 유형이라는 사실은 프로세스간에 사용하기에 적합하다는 것을 의미합니다.

그러나 두 프로세스 (두 개의 개별 응용 프로그램 또는 주 프로세스와 XPC 서비스)에서 실행되도록이 코드를 분할하면 다른 프로세스의 서버에서 mach_port_t를 사용하여 CARemoteLayerClient를 초기화하려고 할 때 내가 얻을 :

unable to register with server: 0x10000003 

그것은 잘 그들이 무작위적인 과정 사이에 적합하지 않을 수 있지만, mach_port_t의 사용은 좀 것을 의미한다.

누구나 프로세스간에 이러한 클래스를 사용하여 성공한 사람이 있습니까?

답변

4

예, 가능합니다. 예를 들면 다음과 같습니다. https://github.com/krevis/RemoteLayerDemo

앱을 실행하고 "원격 레이어 가져 오기"버튼을 누르면 서비스가 시작되고 앱에 녹색 원격 레이어가 제공됩니다. (이상하게도, 나타나는 데 몇 초가 걸립니다. 이유는 모르겠습니다.)

그 후 "색상 변경"버튼을 누르면 레이어 색상을 변경하라는 메시지가 서비스에 전송되며 이는 즉시 적용됩니다. 움직입니다. "Remove Remote Layer"버튼은 레이어를 제거합니다. 몇 초 동안 유휴 상태로두면 서비스가 종료됩니다.

어려운 부분이 프로세스 사이에 CARemoteLayerServer의 Mach 포트를 통과하고 있습니다. 귀하의 과정에서 볼 수있는 mach_port_t은 숫자입니다. 그것은 당신의 과정 내에서만 의미가 있습니다. (포인터와 같은 생각 : 포인터는 숫자 일 뿐이지 만 한 프로세스에서 다른 프로세스로 포인터를 전달할 수는 없다.)

XPC가 Mach 포트를 보낼 수 있다고 생각할 것입니다. , 그러나 그것은 할 수 없다. 이것을 훨씬 쉽게 할 수 있습니다!

대신 Mach API를 사용하여 기본 Mach 포트를 보내야합니다. 데모에서는 앱에 bootstrap_register을 사용하고 서비스에 bootstrap_look_up을 동의어로 사용합니다. 동일한 부트 스트랩 컨텍스트에있는 다른 응용 프로그램이 포트를 찾을 수 있기 때문에 보안되지 않습니다.하지만 데모에서는 충분합니다. 실제로는 dive down to some uglier Mach calls을 원할 것입니다.

+0

특히 작업 데모에서 많은 도움을 주셨습니다. 정말 대단했습니다. 나는 마하 포트가 소켓 포트처럼 작동한다는 잘못된 가정을하고 있었다. 분명히 내부 책과 더 많은 시간을 할애해야합니다! – Michael

+0

그냥 피곤하고 데모가 더 이상 작동하지 않습니다 - Xcode 7.2 - OSX 10.11.2 – Jimmy

+0

여기에 설명되어 있습니다 - https://github.com/krevis/RemoteLayerDemo/issues/2 – Jimmy

관련 문제