2012-02-15 77 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

運行該應用程序,按下「獲取遠程圖層」按鈕,服務將啓動,並將爲該應用程序提供一個綠色的遠程圖層。 (奇怪的是,它需要幾秒鐘才能出現 - 不知道爲什麼。)

之後,「更改顏色」按鈕向服務發送一條消息,要求它改變圖層的顏色,立即生效,甚至動畫。 「刪除遙控層」按鈕刪除圖層;如果你讓它閒置幾秒鐘,服務將被終止。

困難的部分是經過CARemoteLayerServer的馬赫端口進程之間。您在過程中看到的mach_port_t只是一個數字;它只在你的過程中有意義。 (與指針相同:指針只是數字,但不能將指針從一個進程傳遞到另一個進程,並期望它們指向相同的東西。)

您會認爲XPC可以發送Mach端口,但它不能。這會讓這更容易!

相反,你必須使用API​​馬赫左右派的根本馬赫端口。在演示中,我在應用中使用了bootstrap_register,在服務中使用了bootstrap_look_up,並使用了一致同意的名稱。這是不安全的,因爲在同一個引導程序上下文中的任何其他應用程序都可以找到該端口,但對於演示來說足夠好。實際上你想要dive down to some uglier Mach calls

+0

非常感謝,特別是對工作演示,完全真棒。我正在做一個關於mach端口像socket端口一樣工作的錯誤假設(你可以通過它)。很顯然,我需要花更多的時間與內部書! – Michael 2012-02-20 09:05:30

+0

只是太累了,演示不再起作用 - Xcode的7.2 - OSX 10.11.2 – Jimmy 2016-01-19 10:48:08

+0

修復此處描述 - https://github.com/krevis/RemoteLayerDemo/issues/2 – Jimmy 2016-01-19 18:32:42

相關問題