LibvnccClient
을 사용하여 Swift에서 간단한 VNC client
을 구현하려고합니다.NSView에 원격 원격 프레임 버퍼 스트리밍
NSView
의 하위 클래스를 만들었습니다. CGContext
을 만들고 데이터 포인터를 라이브러리에 전달하여 framebuffer
으로 사용합니다. libvncclient는 화면 내용이 변경 될 때 프레임 버퍼를 업데이트하고 제공된 콜백을 호출합니다.
다음은 관련 코드
class VNCClient {
var localClient: rfbClient
var view: NSView
init(view: NSView) {
guard let client_ptr = rfbGetClient(8, 3, 4) else {
fatalError("Trouble")
}
self.view = view
self.localClient = client_ptr.pointee
localClient.MallocFrameBuffer = resize
localClient.GotFrameBufferUpdate = update
let fbPointer = UnsafeMutablePointer<UInt8>(OpaquePointer((view as! RFBView).buffer))
localClient.frameBuffer = fbPointer
rfbClientSetClientData(&localClient, &viewTag, &self.view)
var argc: Int32 = 0
let b = rfbInitClient(&localClient, &argc, nil)
if b == RFB_TRUE {
print("Connected!")
}
Timer.scheduledTimer(withTimeInterval: 0.001, repeats: true) {_ in
if WaitForMessage(&self.localClient, 1) > 0 {
HandleRFBServerMessage(&self.localClient)
}
}
}
func update(client: UnsafeMutablePointer<rfbClient>?, x: Int32, y: Int32, w: Int32, h: Int32) -> Void {
let cl = client!.pointee
let view_ptr = rfbClientGetClientData(client, &viewTag)
let view = view_ptr?.assumingMemoryBound(to: RFBView.self).pointee
view?.setNeedsDisplay(NSRect(x: Int(x), y: Int(y), width: Int(w), height: Int(h)))
}
class RFBView: NSView {
let ctx = CGContext(data: nil, width: 800, height: 600, bitsPerComponent: 8, bytesPerRow: 4 * 800, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)!
var buffer: UnsafeMutableRawPointer? {
return ctx.data
}
override func draw(_ dirtyRect: NSRect) {
let image = ctx.makeImage()
NSGraphicsContext.current()?.cgContext.draw(image!, in: frame)
}
그것은 작동하지만 디스플레이가 원활하지입니다. 서버가 VM의 동일한 시스템에서 실행되므로 네트워크 문제가 발생하지 않습니다.
문제의 원인이라고 생각되는 모든 업데이트에 대해 전체 이미지를 다시 그려 넣습니다. 그렇다면 프레임 버퍼의 업데이트 된 부분 만 어떻게 다시 그릴 수 있습니까?
CoreGraphics
은 충분히 빠르지 만 NSOpenGLView
을 사용해야합니까?
초당 1000 회 다시 그리지 않아도됩니다. 'Timer.scheduledTimer (withTimeInterval : 1/15,'덜해라.) 영화처럼 보일 필요가 없다. –
나는 프레임 속도로 게임을 해봤지만, 받아 들일만한 성능을 얻을 수 없다. . – a2bk