Add greedy preloading option

Based on a patch by Sebastian Rose <s.rose@semkath.de>
REVIEW: 103129
BUGS: 184196
This commit is contained in:
Albert Astals Cid 2012-03-09 00:12:20 +01:00
parent 3e3a504d3c
commit 4d8ba36488
6 changed files with 129 additions and 93 deletions

View File

@ -48,7 +48,9 @@ void DlgPerformance::radioGroup_changed( int which )
case 2:
m_dlg->descLabel->setText( i18n("Keeps everything in memory. Preload next pages. Boost searches. (For systems with more than 512MB of memory.)") );
break;
case 3:
m_dlg->descLabel->setText( i18n("Loads and keeps everything in memory. Preload all pages. (Will use at maximum 50% of your total memory or your free memory, whatever is bigger.)"));
break;
}
}

View File

@ -1,59 +1,60 @@
<ui version="4.0" >
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DlgPerformanceBase</class>
<widget class="QWidget" name="DlgPerformanceBase" >
<property name="geometry" >
<widget class="QWidget" name="DlgPerformanceBase">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>303</width>
<height>256</height>
<width>316</width>
<height>289</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>CPU Usage</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>9</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="kcfg_EnableCompositing" >
<property name="text" >
<widget class="QCheckBox" name="kcfg_EnableCompositing">
<property name="text">
<string>Enable &amp;transparency effects</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="kcfg_EnableThreading" >
<property name="text" >
<widget class="QCheckBox" name="kcfg_EnableThreading">
<property name="text">
<string>Enable &amp;background generation</string>
</property>
</widget>
@ -61,19 +62,17 @@
</layout>
</item>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="cpuLabel" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<widget class="QLabel" name="cpuLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -82,13 +81,13 @@
</item>
<item>
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>21</width>
<height>1</height>
@ -104,70 +103,75 @@
</widget>
</item>
<item>
<widget class="KButtonGroup" name="kcfg_MemoryLevel" >
<property name="title" >
<widget class="KButtonGroup" name="kcfg_MemoryLevel">
<property name="title">
<string>Memory Usage</string>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>9</number>
</property>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QHBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="lowRadio" >
<property name="text" >
<widget class="QRadioButton" name="lowRadio">
<property name="text">
<string>&amp;Low</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="normalRadio" >
<property name="text" >
<widget class="QRadioButton" name="normalRadio">
<property name="text">
<string>&amp;Normal (default)</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="aggressiveRadio" >
<property name="text" >
<widget class="QRadioButton" name="aggressiveRadio">
<property name="text">
<string>&amp;Aggressive</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="greedyRadio">
<property name="text">
<string>&amp;Greedy</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<layout class="QVBoxLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="memoryLabel" >
<property name="sizePolicy" >
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<widget class="QLabel" name="memoryLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -176,13 +180,13 @@
</item>
<item>
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>21</width>
<height>1</height>
@ -195,17 +199,17 @@
</layout>
</item>
<item>
<widget class="QLabel" name="descLabel" >
<property name="text" >
<widget class="QLabel" name="descLabel">
<property name="text">
<string/>
</property>
<property name="textFormat" >
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="alignment" >
<property name="alignment">
<set>Qt::AlignVCenter</set>
</property>
<property name="wordWrap" >
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
@ -215,13 +219,13 @@
</item>
<item>
<spacer>
<property name="orientation" >
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>4</height>
@ -237,11 +241,10 @@
<extends>QGroupBox</extends>
<header>kbuttongroup.h</header>
<container>1</container>
<pixmap></pixmap>
</customwidget>
</customwidgets>
<includes>
<include location="global" >kiconloader.h</include>
<include location="global">kiconloader.h</include>
</includes>
<resources/>
<connections/>

View File

@ -59,6 +59,7 @@
<choice name="Low" />
<choice name="Normal" />
<choice name="Aggressive" />
<choice name="Greedy" />
</choices>
</entry>
<entry key="EnableCompositing" type="Bool" >

View File

@ -199,6 +199,12 @@ void DocumentPrivate::cleanupPixmapMemory( qulonglong /*sure? bytesOffset*/ )
if (m_allocatedPixmapsTotalMemory > freeMemory) clipValue = (m_allocatedPixmapsTotalMemory - freeMemory) / 2;
}
break;
case Settings::EnumMemoryLevel::Greedy:
{
const qulonglong memoryLimit = qMax(getFreeMemory(), getTotalMemory() / 2);
if (m_allocatedPixmapsTotalMemory > memoryLimit) clipValue = (m_allocatedPixmapsTotalMemory - memoryLimit) / 2;
}
break;
}
if ( clipValue > memoryToFree )
@ -3589,6 +3595,10 @@ void DocumentPrivate::calculateMaxTextPages()
case Settings::EnumMemoryLevel::Aggressive:
m_maxAllocatedTextPages = multipliers * 250;
break;
case Settings::EnumMemoryLevel::Greedy:
m_maxAllocatedTextPages = multipliers * 1250;
break;
}
}

View File

@ -1209,7 +1209,8 @@ void PageView::notifyZoom( int factor )
bool PageView::canUnloadPixmap( int pageNumber ) const
{
if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Aggressive )
if ( Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Low ||
Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Normal )
{
// if the item is visible, forbid unloading
QLinkedList< PageViewItem * >::const_iterator vIt = d->visibleItems.constBegin(), vEnd = d->visibleItems.constEnd();
@ -3945,6 +3946,11 @@ void PageView::slotRequestVisiblePixmaps( int newValue )
// request first the next page and then the previous
int pagesToPreload = viewColumns();
// if the greedy option is set, preload all pages
if (Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Greedy)
pagesToPreload = d->items.count();
for( int j = 1; j <= pagesToPreload; j++ )
{
// add the page after the 'visible series' in preload

View File

@ -356,7 +356,8 @@ void PresentationWidget::notifyPageChanged( int pageNumber, int changedFlags )
bool PresentationWidget::canUnloadPixmap( int pageNumber ) const
{
if ( Okular::Settings::memoryLevel() != Okular::Settings::EnumMemoryLevel::Aggressive )
if ( Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Low ||
Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Normal )
{
// can unload all pixmaps except for the currently visible one
return pageNumber != m_frameIndex;
@ -1162,6 +1163,19 @@ void PresentationWidget::requestPixmaps()
if ( !prevFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ) )
requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, m_frameIndex - 1, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) );
}
// If greedy, preload everything
if (Okular::Settings::memoryLevel() == Okular::Settings::EnumMemoryLevel::Greedy)
{
for(int i = 0; i < (int)m_document->pages(); ++i)
{
PresentationFrame *loopFrame = m_frames[ i ];
pixW = loopFrame->geometry.width();
pixH = loopFrame->geometry.height();
if ( !loopFrame->page->hasPixmap( PRESENTATION_ID, pixW, pixH ))
requests.push_back( new Okular::PixmapRequest( PRESENTATION_ID, i, pixW, pixH, PRESENTATION_PRELOAD_PRIO, true ) );
}
}
}
m_document->requestPixmaps( requests );
}