I'm trying to integrate WKWebView to metal rendering pipline and met 2 issues.
WKWebView will kick webview rendering only when the WKWebView control is visible, i have been looking around WKWebView related header files and configurations, didn't find a way to force WkWebView render the view for every single frame when the control is invisible or not part of view hierarchy .
Low performance when access CGImage pixel data returned from WKWebview takesnapshot, in order to get the pixel data uploaded to MTLTexture i did the following tests:
Access the pixel data through CGDataProviderCopyData, the CPU usage is very high, main thread drop to 37 FPS on IPhone 8 Plus simulator, most CPU cycles spend on function vConvert_PermuteChannels_ARGB8888_CV_vec, i also try to render the CGImage to a BitmapContext but still can't get ride of vConvert_PermuteChannels_ARGB8888_CV_vec.
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef rawData = CGDataProviderCopyData( provider );
CFIndex length = CFDataGetLength( rawData );
UInt8 *buf = (UInt8*) CFDataGetBytePtr( rawData );
MTLRegion region = {
{0, 0, 0},
{1280, 960, 1}
};
[_webviewTexture replaceRegion:region mipmapLevel:0 withBytes:buf bytesPerRow:bytesPerRow];
CFRelease( rawData );
Another try is create metal texture from CGImage via textureLoader but failed with error "image decoding failed"
MTKTextureLoader *loader = [[MTKTextureLoader alloc] initWithDevice: _device];
NSDictionary *textureLoaderOption = @{
MTKTextureLoaderOptionTextureUsage:@(MTLTextureUsageShaderRead),
MTKTextureLoaderOptionTextureStorageMode : @(MTLStorageModePrivate)
};
NSError *error = nil;
_webviewTexture = [ loader newTextureWithCGImage:cgImage options:textureLoaderOption error:&error];
Any idea against how to force kick WebView rendering or more efficient way to access CGImage raw pixel data would be greatly appreciated.
Selecting any option will automatically load the page