2012-03-30 25 views
0

Ich arbeite an einem Spiel, in dem die Spielelemente wie aus Baupapier aussehen. Um die Textur-Effekt zu erzielen mischen ich ein Vollbild am Ende eines jeden Zyklus Unentschieden:Verbessern Sie die Leistung der Grafikleistung im Vollbildmodus im Vollbildmodus?

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // ... draw things ... // 

    CGContextSetBlendMode(context, kCGBlendModeHardLight); 
    CGContextSetAlpha(context, 0.4); 
    CGContextDrawImage(context, [self frame], [paperTexture CGImage]); 
} 

Leider macht dies die Bildrate Tropfen von 60 bis gefühlten ~ 10. Gibt es eine bessere Möglichkeit, dies zu tun, ohne in OpenGL zu wechseln?

+0

Müssen Sie einen Hartlicht-Mischmodus verwenden, oder könnten Sie nah genug kommen, indem Sie eine halbtransparente Ansicht oder Ebene auf den gesamten Bildschirm legen, der Ihre Papierstruktur enthält? Das würde den teuren Aufruf 'CGContextDrawImage()' vermeiden und würde es erlauben, dass Sie Ihren Quarz-Inhalt nicht für jeden Frame neu zeichnen müssen, sondern in separaten Ansichten oder Layern zwischenspeichern können. –

+0

Ich habe gerade meinen Grafikcode in Core Animation konvertiert und, wie Sie vorschlagen, habe ich eine Overlay-Ebene verwendet, um den Effekt zu erzielen. Einfache Opazität sieht nicht annähernd so gut aus wie hartes Licht, aber es funktioniert. Heres hofft, dass Apple die CA-Layer-Filter-API implementiert ... – Hooper

+0

Trotzdem würden sie Core Image für die Filter und [in meinem Benchmarks] (http://Stackoverflow.com/a/6628208/19679), Core Image verwenden ist momentan auf iOS nicht so schnell. Mein GPUImage ist wesentlich schneller, aber es erfordert, dass Ihr Quellmaterial irgendwie in eine OpenGL ES-Textur gelangt. Vielleicht könnte etwas wie Cocos2d zu einem textur-unterstützten FBO rendern und diese Textur könnte in GPUImage für Hartlicht-Blend-Compositing eingespeist werden (das Papierbild müsste nur einmal hochgeladen werden). Das wäre der schnellste Weg, um genau diesen Effekt zu erzielen. –

Antwort

0

Check out GPUImage die ich gehört habe, hat wirklich gute Leistung.

+0

Nicht ganz was ich suche. Das sieht so aus, als würde man Filter auf Bilder im Speicher ausführen. Ich muss auf den Bildschirm überlagern, kein Bild. Ja, ich könnte ein Bild aus dem aktuellen CGContext erstellen, es filtern und dann zurück auf den Bildschirm ziehen, aber ich denke, dass alle GPU-Vorteile durch das Erstellen, Kopieren und Zeichnen von Bildern aufgehoben werden. – Hooper

Verwandte Themen