Drawing To Screen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Drawing To Screen

    Hallo!

    Weiß jemand vielleicht wie man in C bzw. ObjectiveC seit Abschaffung von CGDisplayBaseAddress direkten Zugriff auf die Bildschirmpixel bekommt ? In der Doku steht nur, dass man danach über eine der üblichen Displayengines gehen muss. Kann ich aber nicht so ganz glauben. Da es den Mechanismus mit umschaltbaren Framebuffern und Übertragung ins VRAM sogar in Java gibt muss es die entsprechende Funktion auch im OSX geben.


    Ich brauche das, weil ich selber eine Grafikengine habe und jeden Pixel selber setze und den ganzen Overhead des Windowservers aussen vor lassen möchte. Derzeit zeichne ich in ein Bitmap und lasse das Bitmap über ein drawRect in einen View darstellen. Leider dauert das display wesentlich änger als jede Zeichenoperation. Ich arbeite noch unter 10.9 deswegen wäre es auch interessant zu wissen ob bzw. wie das im aktuellen OSX geht.

    Danke
  • Ich mache das mit einem CGImage, welches ich aus dem Framebuffer erzeuge und dann in jedem Frame als content für den View-Layer setze:

    C-Quellcode

    1. CGContextRef offscreen = CGBitmapContextCreate((void*)framebuffer.pixelData(), framebuffer.getWidth(), framebuffer.getHeight(), framebuffer.getBitsPerComponent(), framebuffer.getBytesPerRow(), [NSColorSpace deviceRGBColorSpace].CGColorSpace, kCGImageAlphaPremultipliedLast);
    2. CGImageRef image = CGBitmapContextCreateImage(offscreen);
    3. self.frameBufferView.layer.contents = (__bridge id)image;
    4. CGImageRelease(image);
    Ist nicht besonders schnell, aber wenn es darauf ankommt, solltest Du eh irgendwas hardware-beschleunigtes nutzen.
  • Yep, habs getestet! Ein CALayer mit einem CGImageRef geht richtig ab. !! :-)) Erfreulicherweise wird das Image vom Layer nur referenziert. Kein rüberkopieren mehr, kein recache oder ähnliches. Besser geht nicht. Wenn ich das richtig sehe dann wird dabei zwar etwas geschummelt und einige Images werden übersprungen wenn die Zeit nicht reicht. Der Übergang wird wohl hardwaremässig gelöst. Doch solange das Ergebnis so schön glatt läuft bin ich schon zufrieden.