Mercurial > hg > svgui
comparison layer/SpectrogramLayer.cpp @ 1450:6cf3cb6641e1 single-point
Tweak peak-cache allocations etc in the hope of making long spectrograms a little faster to re-render
| author | Chris Cannam |
|---|---|
| date | Wed, 01 May 2019 14:41:28 +0100 |
| parents | e2b6a13a1f69 |
| children | 66bf1abfefc1 |
comparison
equal
deleted
inserted
replaced
| 1449:ce5f80a7c697 | 1450:6cf3cb6641e1 |
|---|---|
| 1409 } | 1409 } |
| 1410 | 1410 |
| 1411 FFTModel *oldModel = m_fftModel; | 1411 FFTModel *oldModel = m_fftModel; |
| 1412 m_fftModel = newModel; | 1412 m_fftModel = newModel; |
| 1413 | 1413 |
| 1414 if (canStoreWholeCache()) { // i.e. if enough memory | 1414 bool createWholeCache = false; |
| 1415 checkCacheSpace(&m_peakCacheDivisor, &createWholeCache); | |
| 1416 | |
| 1417 if (createWholeCache) { | |
| 1415 m_wholeCache = new Dense3DModelPeakCache(m_fftModel, 1); | 1418 m_wholeCache = new Dense3DModelPeakCache(m_fftModel, 1); |
| 1416 m_peakCache = new Dense3DModelPeakCache(m_wholeCache, m_peakCacheDivisor); | 1419 m_peakCache = new Dense3DModelPeakCache(m_wholeCache, m_peakCacheDivisor); |
| 1417 } else { | 1420 } else { |
| 1418 m_peakCache = new Dense3DModelPeakCache(m_fftModel, m_peakCacheDivisor); | 1421 m_peakCache = new Dense3DModelPeakCache(m_fftModel, m_peakCacheDivisor); |
| 1419 } | 1422 } |
| 1420 | 1423 |
| 1421 emit sliceableModelReplaced(oldModel, m_fftModel); | 1424 emit sliceableModelReplaced(oldModel, m_fftModel); |
| 1422 delete oldModel; | 1425 delete oldModel; |
| 1423 } | 1426 } |
| 1424 | 1427 |
| 1425 bool | 1428 void |
| 1426 SpectrogramLayer::canStoreWholeCache() const | 1429 SpectrogramLayer::checkCacheSpace(int *suggestedPeakDivisor, |
| 1427 { | 1430 bool *createWholeCache) const |
| 1428 if (!m_fftModel) { | 1431 { |
| 1429 return false; // or true, doesn't really matter | 1432 *suggestedPeakDivisor = 8; |
| 1430 } | 1433 *createWholeCache = false; |
| 1434 | |
| 1435 if (!m_fftModel) return; | |
| 1431 | 1436 |
| 1432 size_t sz = | 1437 size_t sz = |
| 1433 size_t(m_fftModel->getWidth()) * | 1438 size_t(m_fftModel->getWidth()) * |
| 1434 size_t(m_fftModel->getHeight()) * | 1439 size_t(m_fftModel->getHeight()) * |
| 1435 sizeof(float); | 1440 sizeof(float); |
| 1436 | 1441 |
| 1437 try { | 1442 try { |
| 1438 SVDEBUG << "Requesting advice from StorageAdviser on whether to create whole-model cache" << endl; | 1443 SVDEBUG << "Requesting advice from StorageAdviser on whether to create whole-model cache" << endl; |
| 1444 // The lower amount here is the amount required for the | |
| 1445 // slightly higher-resolution version of the peak cache | |
| 1446 // without a whole-model cache; the higher amount is that for | |
| 1447 // the whole-model cache. The factors of 1024 are because | |
| 1448 // StorageAdviser rather stupidly works in kilobytes | |
| 1439 StorageAdviser::Recommendation recommendation = | 1449 StorageAdviser::Recommendation recommendation = |
| 1440 StorageAdviser::recommend | 1450 StorageAdviser::recommend |
| 1441 (StorageAdviser::Criteria(StorageAdviser::SpeedCritical | | 1451 (StorageAdviser::Criteria(StorageAdviser::SpeedCritical | |
| 1442 StorageAdviser::PrecisionCritical | | 1452 StorageAdviser::PrecisionCritical | |
| 1443 StorageAdviser::FrequentLookupLikely), | 1453 StorageAdviser::FrequentLookupLikely), |
| 1444 sz / 1024, sz / 1024); | 1454 (sz / 8) / 1024, sz / 1024); |
| 1445 if ((recommendation & StorageAdviser::UseDisc) || | 1455 if (recommendation & StorageAdviser::UseDisc) { |
| 1446 (recommendation & StorageAdviser::ConserveSpace)) { | |
| 1447 SVDEBUG << "Seems inadvisable to create whole-model cache" << endl; | 1456 SVDEBUG << "Seems inadvisable to create whole-model cache" << endl; |
| 1448 return false; | 1457 } else if (recommendation & StorageAdviser::ConserveSpace) { |
| 1449 } else { | 1458 SVDEBUG << "Seems inadvisable to create whole-model cache but acceptable to use the slightly higher-resolution peak cache" << endl; |
| 1459 *suggestedPeakDivisor = 4; | |
| 1460 } else { | |
| 1450 SVDEBUG << "Seems fine to create whole-model cache" << endl; | 1461 SVDEBUG << "Seems fine to create whole-model cache" << endl; |
| 1451 return true; | 1462 *createWholeCache = true; |
| 1452 } | 1463 } |
| 1453 } catch (const InsufficientDiscSpace &) { | 1464 } catch (const InsufficientDiscSpace &) { |
| 1454 SVDEBUG << "Seems like a terrible idea to create whole-model cache" << endl; | 1465 SVDEBUG << "Seems like a terrible idea to create whole-model cache" << endl; |
| 1455 return false; | |
| 1456 } | 1466 } |
| 1457 } | 1467 } |
| 1458 | 1468 |
| 1459 const Model * | 1469 const Model * |
| 1460 SpectrogramLayer::getSliceableModel() const | 1470 SpectrogramLayer::getSliceableModel() const |
