From f51806635b24d7b95ef5ccadc07a958ecd5d3ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 27 Nov 2005 00:18:08 +0000 Subject: [PATCH] stress testing. It shows that for 40 open windows, the newerClipping design takes 3.5 times less time in the root layer thread compared to the newClipping design. On average, it is about 8.7 times faster. The goal of the redesign, to move the heavier computation from the root layer thread into each window thread, seems achieved, since even with 100 open windows, moving a window does not start any lagging. By removing the global dirty region in Desktop, I think this can be further improved. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15183 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../servers/app/newClipping/Clipping.proj | Bin 12308 -> 12308 bytes src/tests/servers/app/newClipping/MyView.cpp | 8 +- src/tests/servers/app/newClipping/main.cpp | 225 +++++++++++++++++- .../servers/app/newerClipping/Desktop.cpp | 6 +- .../servers/app/newerClipping/ViewLayer.cpp | 15 +- src/tests/servers/app/newerClipping/main.cpp | 128 ++++++++-- 6 files changed, 345 insertions(+), 37 deletions(-) diff --git a/src/tests/servers/app/newClipping/Clipping.proj b/src/tests/servers/app/newClipping/Clipping.proj index 01aaab23b722223180b7617fe17ee768aa487868..a2ac1d0907c875538b471887844eb337989c1987 100644 GIT binary patch delta 131 zcmbP|FePEb0X7zePN{~;3wRwjv$FqGVO}yxVl$(TAfuS|A_fKq79eH@Vul7FcJBCf zVDevGwaI?EGsR>rLBc@51R@%M*tuo>dZ6?w79e8-Slvav`J$&l(m;Sv*52j@B2BsBm4 delta 131 zcmbP|FePEb0X7zo?@|qu7w|f6W@Z1W!u(~u^kzmKK}Io2BL)Tr79eH@Vul7FcG_Te zbMjwZwaI?EGsRRmLBc@51R@%M7$|)UD7}gW$hZwwcTsP?s24~Y2#}RQWLN8F0su{6 BBc%WU diff --git a/src/tests/servers/app/newClipping/MyView.cpp b/src/tests/servers/app/newClipping/MyView.cpp index cd631bbabc..ac691c4255 100644 --- a/src/tests/servers/app/newClipping/MyView.cpp +++ b/src/tests/servers/app/newClipping/MyView.cpp @@ -156,10 +156,14 @@ void MyView::MouseMoved(BPoint where, uint32 code, const BMessage *a_message) { if (fMovingLayer) { - if (fIsResize) +bigtime_t now = system_time(); + if (fIsResize) { fMovingLayer->ResizeBy(dx, dy); - else +printf("resizing: %lld\n", system_time() - now); + } else { fMovingLayer->MoveBy(dx, dy); +printf("moving: %lld\n", system_time() - now); + } } } } diff --git a/src/tests/servers/app/newClipping/main.cpp b/src/tests/servers/app/newClipping/main.cpp index d5402a49a3..52048b397d 100644 --- a/src/tests/servers/app/newClipping/main.cpp +++ b/src/tests/servers/app/newClipping/main.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -35,6 +36,8 @@ public: ~clsMainWindow(); virtual bool QuitRequested(); + void AddWindow(BRect frame, const char* name); + void test2(); void test1(); private: MyView *fView; @@ -79,6 +82,152 @@ bool clsMainWindow::QuitRequested() return BWindow::QuitRequested(); } + +// AddWindow +void +clsMainWindow::AddWindow(BRect frame, const char* name) +{ + Layer* topLayer = fView->topLayer; + + WinBorder* window = new WinBorder(frame, name, B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, + (rgb_color){ 255, 203, 0, 255 }); + topLayer->AddLayer(window); + + // add a coupld children + frame.OffsetTo(B_ORIGIN); + frame.InsetBy(5.0, 5.0); + if (frame.IsValid()) { + Layer* layer1 = new Layer(frame, "View 1", B_FOLLOW_ALL, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 180, 180, 180, 255 }); + + frame.OffsetTo(B_ORIGIN); + frame.InsetBy(15.0, 15.0); + if (frame.IsValid()) { + + BRect f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; + + // top row of views + Layer* layer; + layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + // middle row of views + f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; + f.OffsetBy(0, f.Height() + 6); + + layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_ALL, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + // bottom row of views + f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; + f.OffsetBy(0, 2 * f.Height() + 12); + + layer = new Layer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new Layer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddLayer(layer); + } + + window->AddLayer(layer1); + } + + BRegion temp; + window->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, window); +} + +// test2 +void +clsMainWindow::test2() +{ + BRect frame(20, 20, 330, 230); + for (int32 i = 0; i < 20; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } +/* + frame.Set(10, 80, 320, 290); + for (int32 i = 20; i < 40; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(20, 140, 330, 230); + for (int32 i = 40; i < 60; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(20, 200, 330, 230); + for (int32 i = 60; i < 80; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(20, 260, 330, 230); +// 99 windows are ok, the 100th looper does not run anymore, +// I guess I'm hitting a BeOS limit (max loopers per app?) + for (int32 i = 80; i < 99; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + }*/ + + fView->RequestRedraw(); +} + void clsMainWindow::test1() { Layer *topLayer = fView->topLayer; @@ -198,6 +347,55 @@ void clsMainWindow::test1() 0, c); lay21->AddLayer(lay22); + + WinBorder *wb3 = new WinBorder(BRect(20,20,300,220), "wb3", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb3); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb3->AddLayer(lay1); + + WinBorder *wb4 = new WinBorder(BRect(20,20,300,220), "wb4", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb4); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb4->AddLayer(lay1); + + WinBorder *wb5 = new WinBorder(BRect(20,20,300,220), "wb5", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb5); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb5->AddLayer(lay1); + + WinBorder *wb6 = new WinBorder(BRect(20,20,300,220), "wb6", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb6); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb6->AddLayer(lay1); + + WinBorder *wb7 = new WinBorder(BRect(20,20,300,220), "wb7", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb7); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb7->AddLayer(lay1); + + WinBorder *wb8 = new WinBorder(BRect(20,20,300,220), "wb8", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb8); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb8->AddLayer(lay1); + + WinBorder *wb9 = new WinBorder(BRect(20,20,300,220), "wb9", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb9); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb9->AddLayer(lay1); + + WinBorder *wb10 = new WinBorder(BRect(20,20,300,220), "wb10", B_FOLLOW_NONE, B_FULL_UPDATE_ON_RESIZE, c); + topLayer->AddLayer(wb10); + // same size as wb1 + lay1 = new Layer(BRect(0,0,280,200), "lay1", B_FOLLOW_ALL, 0, c); + wb10->AddLayer(lay1); + //--------- BRegion temp; @@ -207,6 +405,31 @@ void clsMainWindow::test1() wb2->GetWantedRegion(temp); topLayer->RebuildVisibleRegions(temp, wb2); + wb3->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb3); + + wb4->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb4); + + wb5->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb5); + + wb6->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb6); + + wb7->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb7); + + wb8->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb8); + + wb9->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb9); + + wb10->GetWantedRegion(temp); + topLayer->RebuildVisibleRegions(temp, wb10); + + fView->RequestRedraw(); snooze(1000000); @@ -256,7 +479,7 @@ int main() clsMainWindow *win = new clsMainWindow("clipping"); win->Show(); - win->test1(); + win->test2(); be_app->Run(); delete be_app; diff --git a/src/tests/servers/app/newerClipping/Desktop.cpp b/src/tests/servers/app/newerClipping/Desktop.cpp index c3bffb0238..08fd756b40 100644 --- a/src/tests/servers/app/newerClipping/Desktop.cpp +++ b/src/tests/servers/app/newerClipping/Desktop.cpp @@ -159,13 +159,13 @@ Desktop::MouseMoved(BPoint where, uint32 code, const BMessage* dragMessage) if (dx != 0 || dy != 0) { if (fClickedWindow) { -//bigtime_t now = system_time(); +bigtime_t now = system_time(); if (fResizing) { ResizeWindowBy(fClickedWindow, dx, dy); -//printf("resizing: %lld\n", system_time() - now); +printf("resizing: %lld\n", system_time() - now); } else { MoveWindowBy(fClickedWindow, dx, dy); -//printf("moving: %lld\n", system_time() - now); +printf("moving: %lld\n", system_time() - now); } } } diff --git a/src/tests/servers/app/newerClipping/ViewLayer.cpp b/src/tests/servers/app/newerClipping/ViewLayer.cpp index 3d7bbce7f1..e62bd51213 100644 --- a/src/tests/servers/app/newerClipping/ViewLayer.cpp +++ b/src/tests/servers/app/newerClipping/ViewLayer.cpp @@ -458,7 +458,7 @@ ViewLayer::ResizeBy(int32 x, int32 y, BRegion* dirtyRegion) if (dirty.CountRects() > 0) { // exclude children, they are expected to - // have included their own dirty regions + // include their own dirty regions in ParentResized() for (ViewLayer* child = FirstChild(); child; child = NextChild()) { BRect previousChildVisible(child->Frame() & oldBounds & Bounds()); if (dirty.Frame().Intersects(previousChildVisible)) { @@ -523,13 +523,14 @@ ViewLayer::ParentResized(int32 x, int32 y, BRegion* dirtyRegion) newFrame.bottom += y / 2; if (newFrame != fFrame) { - // MoveBy will change fFrame, so cache it - BRect oldFrame = fFrame; - MoveBy(newFrame.left - oldFrame.left, - newFrame.top - oldFrame.top, dirtyRegion); + // careful, MoveBy will change fFrame + int32 widthDiff = (int32)(newFrame.Width() - fFrame.Width()); + int32 heightDiff = (int32)(newFrame.Height() - fFrame.Height()); - ResizeBy(newFrame.Width() - oldFrame.Width(), - newFrame.Height() - oldFrame.Height(), dirtyRegion); + MoveBy(newFrame.left - fFrame.left, + newFrame.top - fFrame.top, dirtyRegion); + + ResizeBy(widthDiff, heightDiff, dirtyRegion); } } diff --git a/src/tests/servers/app/newerClipping/main.cpp b/src/tests/servers/app/newerClipping/main.cpp index 588790541f..ca1a9e266e 100644 --- a/src/tests/servers/app/newerClipping/main.cpp +++ b/src/tests/servers/app/newerClipping/main.cpp @@ -87,23 +87,72 @@ Window::AddWindow(BRect frame, const char* name) frame.OffsetTo(B_ORIGIN); frame.InsetBy(15.0, 15.0); if (frame.IsValid()) { - frame.bottom = (frame.top + frame.bottom) / 2 - 5; - ViewLayer* layer2 = new ViewLayer(frame, "View 2", - B_FOLLOW_ALL, - 0, - (rgb_color){ 120, 120, 120, 255 }); - - frame.OffsetBy(0.0, frame.Height() + 10); + BRect f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; - ViewLayer* layer3 = new ViewLayer(frame, "View 3", - B_FOLLOW_BOTTOM, - 0, - (rgb_color){ 120, 120, 120, 255 }); - + // top row of views + ViewLayer* layer; + layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); - layer1->AddChild(layer2); - layer1->AddChild(layer3); + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + // middle row of views + f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; + f.OffsetBy(0, f.Height() + 6); + + layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_ALL, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + // bottom row of views + f = frame; + f.bottom = f.top + f.Height() / 3 - 3; + f.right = f.left + f.Width() / 3 - 3; + f.OffsetBy(0, 2 * f.Height() + 12); + + layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); + + f.OffsetBy(f.Width() + 6, 0); + + layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM, + B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 }); + layer1->AddChild(layer); } window->AddChild(layer1); @@ -120,16 +169,47 @@ Window::AddWindow(BRect frame, const char* name) void Window::Test() { - AddWindow(BRect(20, 20, 80, 80), "Window 1"); - AddWindow(BRect(60, 60, 220, 180), "Window 2"); - AddWindow(BRect(120, 160, 500, 380), "Window 3"); - AddWindow(BRect(40, 210, 400, 280), "Window 4"); - AddWindow(BRect(180, 410, 400, 680), "Window 5"); - AddWindow(BRect(30, 350, 100, 440), "Window 6"); - AddWindow(BRect(80, 10, 200, 120), "Window 7"); - AddWindow(BRect(480, 40, 670, 320), "Window 8"); - AddWindow(BRect(250, 500, 310, 600), "Window 9"); - AddWindow(BRect(130, 450, 230, 500), "Window 10"); + BRect frame(20, 20, 330, 230); + for (int32 i = 0; i < 20; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(10, 80, 320, 290); + for (int32 i = 20; i < 40; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + +/* frame.Set(20, 140, 330, 230); + for (int32 i = 40; i < 60; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(20, 200, 330, 230); + for (int32 i = 60; i < 80; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + } + + frame.Set(20, 260, 330, 230); +// 99 windows are ok, the 100th looper does not run anymore, +// I guess I'm hitting a BeOS limit (max loopers per app?) + for (int32 i = 80; i < 99; i++) { + BString name("Window "); + frame.OffsetBy(20, 15); + name << i + 1; + AddWindow(frame, name.String()); + }*/ } // main