Note that there are some explanatory texts on larger screens.

plurals
  1. POThe performance of QPainter::drawImage differs dramatically on Mac OS X and Windows
    text
    copied!<p>Currently I'm porting an application written with Qt 4.8 on Windows into Mac OS X. I found the performance of <code>QPainter::drawImage</code> differs dramatically on Mac OS X and Windows.</p> <p>After I googled a bunch of articles and profile my Qt application on Mac OS X, I found the reason is that the Mac version <code>drawImage</code> was implemented by calling Quartz function CGContextDrawImage which consequently calls <code>argb32_sample_argb32</code>. <code>argb32_sample_argb32</code> wastes most of the cpu cycles.</p> <p>Most probably, Mac OS X converts generic color space into device-dependent color space in the API CGContextDrawImage. However I modified the source code of QT 4.8 the obtain the system display color space directly.</p> <p>The result is still not good. My mac version app is significantly slower than Windows version.</p> <p>Anyone can tell me why? </p> <pre><code>/// QT 4.8's source code modified by me CGColorSpaceRef QCoreGraphicsPaintEngine::macGenericColorSpace() { #if 0 if (!m_genericColorSpace) { #if MAC_OS_X_VERSION_MAX_ALLOWED &gt;= MAC_OS_X_VERSION_10_4 if (QSysInfo::MacintoshVersion &gt;= QSysInfo::MV_10_4) { m_genericColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); } else #endif { m_genericColorSpace = CGColorSpaceCreateDeviceRGB(); } if (!m_postRoutineRegistered) { m_postRoutineRegistered = true; qAddPostRoutine(QCoreGraphicsPaintEngine::cleanUpMacColorSpaces); } } return m_genericColorSpace; #else // Just return the main display colorspace for the moment. // return macDisplayColorSpace(); return CreateSystemColorSpace(); #endif } CGColorSpaceRef CreateSystemColorSpace () { CMProfileRef sysprof = NULL; CGColorSpaceRef dispColorSpace = NULL; // Get the Systems Profile for the main display if (CMGetSystemProfile(&amp;sysprof) == noErr) { // Create a colorspace with the systems profile dispColorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysprof); // Close the profile CMCloseProfile(sysprof); } return dispColorSpace; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload