Est-ce que quelqu'un sait comment dire à l'image de base pour traiter un CIImage à travers un CIFilter utilisant le CPU au lieu du GPU? J'ai besoin de traiter de très grandes images et j'obtiens des résultats étranges en utilisant le GPU. Je ne m'inquiète pas combien de temps ça va pour le CPU ira bien.Comment traiter CIFilter en utilisant CPU au lieu de GPU?
Répondre
Pas une réponse, mais vous pouvez toujours réécrire CIkernel comme fonction qui fonctionne sur la valeur RVB de pixel, et ensuite appliquer cette fonction dans une boucle sur unsigned char []
données de l'image et convertir le résultat en CIImage.
kCIContextUseSoftwareRenderer est la clé ici:
+ (CIContext*)coreContextFor:(NSGraphicsContext *)context forceSoftware:(BOOL)forceSoftware
{
//CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
(id)colorSpace, kCIContextWorkingColorSpace,
(id)colorSpace, kCIContextOutputColorSpace,
[NSNumber numberWithBool:forceSoftware], kCIContextUseSoftwareRenderer,
nil];
CIContext* result = [CIContext contextWithCGContext:(CGContext *)[context graphicsPort] options:contextOptions];
CGColorSpaceRelease(colorSpace);
return result;
}
rendu dans le logiciel plus (CPU) permet de résoudre certains problèmes, mais ... peine de performance est si forte sur les machines modernes que je ne peux pas dire que c'est la solution . J'utilise CoreImage dans mes applications et je restitue toujours avec GPU à l'écran tandis que le CPU forcé est utilisé pour l'enregistrement seulement. J'ai remarqué que le rendu du CPU est un peu plus précis sur mes matériels de test, et sauver l'image filtrée est un long processus, je peux sacrifier la vitesse ici.
Voici une version Swift:
func coreContextFor(context : CGContext,forceSoftware force : Bool) -> CIContext {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let options : [String:AnyObject] = [
kCIContextWorkingColorSpace: colorSpace!,
kCIContextOutputColorSpace : colorSpace!,
kCIContextUseSoftwareRenderer : NSNumber(bool: force)
]
return CIContext(CGContext: context, options: options)
}
Merci. Je vais donner un coup de feu. Ce que j'avais essayé était très similaire mais il ne semblait jamais fonctionner correctement (il fonctionnait toujours sur le GPU à la place). –
// créer un CIContext qui permet à l'utilisateur de spécifier que l'image est rendue en utilisant la CPU - (CIContext *) CPUonlyCIContextFromCGContext: (CGContextRef) cgContext withFlag: (BOOL) drapeau { \t NSDictionary * contextOptions = [NSDictionary dictionaryWithObjectsAndKeys: \t \t \t \t \t \t \t \t \t [NSNumber numberWithBool: flag], kCIContextUseSoftwareRenderer, nil]; \t \t return [CIContext contextWithCGContext: options cgContext: contextOptions]; } –
Désolé ... Je ne sais pas comment spécifier qu'un commentaire est un extrait de code. –