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?
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. –
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
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. –