[vdr] vdr slowness when browsing channels

Klaus Schmidinger Klaus.Schmidinger at cadsoft.de
Sun Aug 7 15:08:46 CEST 2005


Reinhard Nissl wrote:
> Hi,
> 
> Klaus Schmidinger wrote:
> 
>>>> I notice that vdr is slow when i try to quickly browse channels. it 
>>>> eats around 18-20% of the cpu (atlon1200) when
>>>> i hold left or right key when browsing channels (vdr 1.3.27 vanilla 
>>>> - classic skin) .
>>>> With text2skin (1.0) and Enigma, it eats around 40-50% of
>>>> the cpu and browsing channels is very very slow ...
>>>> Note: cat channels.conf | wc -l  --> 2600 lines
>>>
>>>
>>> Just give the attached patch a try and report the effect.
>>>
>>> The problem seems to be, that for scrolling one line, all 2600 
>>> channels are sent to plugins. The patch changes this behaviour to 
>>> just send those channels to plugins that will be shown on screen by VDR.
>>
>>
>> These are only sent to plugins that actually implement a cStatus object.
>> Why would text2skin need a cStatus?
> 
> 
>  From the sources:
> .
> .
> class cText2SkinStatus: public cStatus {
> .
> .
> 
> But it doesn't implement OsdItem(), so maybe my assumption was wrong.
> 
> Maybe it would make sense to have a second list of status monitors which 
> contains all those cStatus objects which implement OsdItem() and to skip 
> the loop completely if noone is interested this information.
> 
> What do you think about that, Klaus?
> Shall I create a patch for this?

I don't think so.
Besides, OsdItem() and OsdCurrentItem() don't really play that well
together, anyway. As it is now, a cStatus object gets the full list
of all items when cOsdMenu::Display() is called, but the current
item is only referred to by its text, no index is given.
So I think this needs some more thought.

But let's first find out whether this is really the problem here.
On my system I also have a cStatus object in the RCU remote control,
and it also doesn't implement OsdItem(). Paging through the channel
list is not slow at all.

@Guy: please comment out the lines

        for (cOsdItem *item = First(); item; item = Next(item))
            cStatus::MsgOsdItem(item->Text(), ni++);

in cOsdMenu::Display() (osdbase.c) and let us know whether this
makes any change.

Klaus



More information about the vdr mailing list