Partially revert "ActivityMonitor: remove double buffering and custom background drawing"
This partially reverts commit cc0226fad05a6796f50723554c10b1bbd02de7b1. This commit caused high CPU usage in app_server. The double buffering in ActivityMonitor is not to avoid flickering, it allows to draw just a few pixels of the the curves at each update, and reuse most of the bitmap from the previous run. Removing this means all the curves are fully redrawn at each update, resulting in higher CPU usage (one core at 30% on my machine with 5 different graphs). Keep the part of the changes removing code for custom background drawing. B_TRANSPARENT_VIEW flag can be used instead. Change-Id: Ie3438ca634c934f3e96ce5f7ad71ce7b3a435013 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4833 Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org> Reviewed-by: Axel Dörfler <axeld@pinc-software.de>
This commit is contained in:
parent
05ce14d174
commit
0f2661cc08
@ -553,7 +553,7 @@ const float kDraggerSize = 7;
|
||||
ActivityView::ActivityView(BRect frame, const char* name,
|
||||
const BMessage* settings, uint32 resizingMode)
|
||||
: BView(frame, name, resizingMode,
|
||||
B_WILL_DRAW | B_SUBPIXEL_PRECISE | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS),
|
||||
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS),
|
||||
fSourcesLock("data sources")
|
||||
{
|
||||
_Init(settings);
|
||||
@ -598,6 +598,7 @@ ActivityView::ActivityView(BMessage* archive)
|
||||
|
||||
ActivityView::~ActivityView()
|
||||
{
|
||||
delete fOffscreen;
|
||||
delete fSystemInfoHandler;
|
||||
}
|
||||
|
||||
@ -608,6 +609,7 @@ ActivityView::_Init(const BMessage* settings)
|
||||
fHistoryBackgroundColor = (rgb_color){255, 255, 240};
|
||||
fLegendBackgroundColor = LowColor();
|
||||
// the low color is restored by the BView unarchiving
|
||||
fOffscreen = NULL;
|
||||
#ifdef __HAIKU__
|
||||
fHistoryLayoutItem = NULL;
|
||||
fLegendLayoutItem = NULL;
|
||||
@ -924,6 +926,51 @@ ActivityView::MinSize()
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
ActivityView::FrameResized(float /*width*/, float /*height*/)
|
||||
{
|
||||
_UpdateOffscreenBitmap();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ActivityView::_UpdateOffscreenBitmap()
|
||||
{
|
||||
BRect frame = _HistoryFrame();
|
||||
frame.OffsetTo(B_ORIGIN);
|
||||
|
||||
if (fOffscreen != NULL && frame == fOffscreen->Bounds())
|
||||
return;
|
||||
|
||||
delete fOffscreen;
|
||||
|
||||
// create offscreen bitmap
|
||||
|
||||
fOffscreen = new(std::nothrow) BBitmap(frame, B_BITMAP_ACCEPTS_VIEWS,
|
||||
B_RGB32);
|
||||
if (fOffscreen == NULL || fOffscreen->InitCheck() != B_OK) {
|
||||
delete fOffscreen;
|
||||
fOffscreen = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
BView* view = new BView(frame, NULL, B_FOLLOW_NONE, B_SUBPIXEL_PRECISE);
|
||||
view->SetViewColor(fHistoryBackgroundColor);
|
||||
view->SetLowColor(view->ViewColor());
|
||||
fOffscreen->AddChild(view);
|
||||
}
|
||||
|
||||
|
||||
BView*
|
||||
ActivityView::_OffscreenView()
|
||||
{
|
||||
if (fOffscreen == NULL)
|
||||
return NULL;
|
||||
|
||||
return fOffscreen->ChildAt(0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ActivityView::MouseDown(BPoint where)
|
||||
{
|
||||
@ -1279,7 +1326,13 @@ ActivityView::_PositionForValue(DataSource* source, DataHistory* values,
|
||||
void
|
||||
ActivityView::_DrawHistory()
|
||||
{
|
||||
_UpdateOffscreenBitmap();
|
||||
|
||||
BView* view = this;
|
||||
if (fOffscreen != NULL) {
|
||||
fOffscreen->Lock();
|
||||
view = _OffscreenView();
|
||||
}
|
||||
|
||||
BRect frame = _HistoryFrame();
|
||||
BRect outerFrame = frame.InsetByCopy(-2, -2);
|
||||
@ -1378,9 +1431,12 @@ ActivityView::_DrawHistory()
|
||||
view->EndLineArray();
|
||||
}
|
||||
|
||||
view->SetPenSize(1);
|
||||
|
||||
// TODO: add marks when an app started or quit
|
||||
view->Sync();
|
||||
if (fOffscreen != NULL) {
|
||||
fOffscreen->Unlock();
|
||||
DrawBitmap(fOffscreen, outerFrame.LeftTop());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -86,6 +86,7 @@ protected:
|
||||
virtual BSize MinSize();
|
||||
#endif
|
||||
|
||||
virtual void FrameResized(float width, float height);
|
||||
virtual void MouseDown(BPoint where);
|
||||
virtual void MouseUp(BPoint where);
|
||||
virtual void MouseMoved(BPoint where, uint32 transit,
|
||||
@ -100,6 +101,8 @@ private:
|
||||
::Scale* _ScaleFor(scale_type type);
|
||||
void _Refresh();
|
||||
static status_t _RefreshThread(void* self);
|
||||
void _UpdateOffscreenBitmap();
|
||||
BView* _OffscreenView();
|
||||
void _UpdateFrame();
|
||||
BRect _HistoryFrame() const;
|
||||
float _LegendHeight() const;
|
||||
@ -121,6 +124,7 @@ private:
|
||||
|
||||
rgb_color fHistoryBackgroundColor;
|
||||
rgb_color fLegendBackgroundColor;
|
||||
BBitmap* fOffscreen;
|
||||
#ifdef __HAIKU__
|
||||
BLayoutItem* fHistoryLayoutItem;
|
||||
BLayoutItem* fLegendLayoutItem;
|
||||
|
Loading…
x
Reference in New Issue
Block a user