Well, I think I've tracked the problem down.
When you give the scroll-wheel a large spin, the OS generates a few events, each saying something like "scroll 50 units down". However, wxWidgets only has an internal event for "scroll 1 line down". So, it translates each scroll-wheel event from the system into many events internally. :rolleyes:
Well, that's bad enough, to incur 50 times the overhead of message processing. However, in most cases, when you scroll a window you actually do a graphical bit copy of that part of the currently visible area that will still be visible after the scroll to its new location. For a 1 line scroll down, this means you will copy most of the window contents 1 line's height up and request a redraw of just the 1 newly scrolled-in line. For 50 1-line scrolls in a row, that means you have copied most of the window contents 50 times over and then have to redraw almost all of it anyway. 8o
The proper solution is to give wxWidgets the notion "scroll X lines down". However, that's not backward compatible with existing wxWidgets-based programs, so no patch I might submit will be accepted in the near term.
wxWidgets does provide a mechanism for skipping the graphic bit copying normally done during scrolling, but it has limitations that I'm still trying to work around. I'm also looking into ways to implement a custom "scroll X lines down" event that's local to aMule.
By the way, the reason you don't see all this graphical copying as flicker on the screen is because Mac OS X automatically double-buffers all windows. Their contents are only drawn to screen when the program returns to the main event loop, which isn't until after all 50 "scroll 1 line down" messages are processed.
Lastly, I don't know why this problem doesn't affect aMule on all platforms. The parts of the code I examined were all cross-platform, I think. It is true that wx's list drawing seems slower on the Mac in general, so maybe this is just a magnification of that effect. Or maybe other platforms don't bother with the bit copying when scrolling.