Jump to content


  • Posts

  • Joined

  • Last visited

Adam42's Achievements


Newbie (1/14)

  • First Post
  • Conversation Starter
  • Week One Done
  • One Month Later
  • One Year In

Recent Badges



  1. An 800x600 image is just under half a million pixels. The magic wand takes about 5 seconds, which is not too bad. A 1024x1024 image is just over a million pixels. With double the pixels you might expect it to take about 10 seconds. It actually takes about 60 seconds. The 2048x2048 image is just over 4 million pixels, and I got bored waiting for it to finish. The photo I found the problem was 20MP but not as bad for performance as the random noise. Selections with the magic wand were taking over a minute though, which is a right pain when you want to play with the tolerance to find a value that works. I've just done a touch more investigation. It seems most of the time is spent in a polygon cliiper. Here's an example call stack grabbed with Process Explorer: PaintDotNet.SystemLayer.Native.x64.dll!gpc_polygon_clip+0x16ab PaintDotNet.SystemLayer.Native.x64.dll!gpc_polygon_clip+0x1958 PaintDotNet.SystemLayer.Native.x64.dll!gpc_polygon_clip+0xe8 [Native Frame: IL Method without Metadata] [Managed to Unmanaged Transition] PaintDotNet.SystemLayer.dll!PaintDotNet.SystemLayer.FastMath.CombinePolyLists+0xa92 PaintDotNet.Core.dll!PaintDotNet.Rendering.GeometryList.Combine+0xd0 PaintDotNet.Core.dll!PaintDotNet.Rendering.GeometryList.FromNonOverlappingScans+0x178 PaintDotNet.Core.dll!PaintDotNet.Rendering.GeometryList.FromStencil+0x159 PaintDotNet.exe!PaintDotNet.Tools.MagicWand.MagicWandTool.CreateSelectionGeometry+0x449 PaintDotNet.exe!PaintDotNet.Tools.AsyncSelectionToolBase`2.<CreateSelectionOnBackgroundThread>b__9+0x5e PaintDotNet.Base.dll!PaintDotNet.Functional.Func.Eval+0x31 PaintDotNet.exe!PaintDotNet.Tools.AsyncSelectionToolBase`2.CreateSelectionOnBackgroundThread+0x15a PaintDotNet.Core.dll!PaintDotNet.Threading.ActionWorkItemQueue.OnExecuteNextWorkItem+0x52 PaintDotNet.Core.dll!PaintDotNet.Threading.MultithreadedWorkItemDispatcher.WorkThreadProc+0x345 mscorlib.dll!System.Threading.ExecutionContext.RunInternal+0x285 mscorlib.dll!System.Threading.ExecutionContext.Run+0x9 mscorlib.dll!System.Threading.ExecutionContext.Run+0x57 mscorlib.dll!System.Threading.ThreadHelper.ThreadStart+0x5d [unmanaged to Managed Transition] clr.dll!CoUninitializeEE+0x66b6b clr.dll!CoUninitializeEE+0x66be6 clr.dll!CoUninitializeEE+0x66c58 clr.dll!StrongNameSignatureVerification+0x12f5d clr.dll!CoUninitializeEE+0x712f4 clr.dll!CoUninitializeEE+0x71282 clr.dll!CoUninitializeEE+0x711f9 clr.dll!CoUninitializeEE+0x71357 clr.dll!StrongNameSignatureVerification+0x12e41 clr.dll!GetMetaDataInternalInterface+0x1def2 KERNEL32.dll!BaseThreadInitThunk+0xd ntdll.dll!RtlUserThreadStart+0x21 If the "GeometryList.FromStencil()" function is doing what I think it is, I suspect it would be easy to optimize - something like http://en.wikipedia.org/wiki/Marching_squares springs to mind.
  2. The magic wand tool performs badly on some images. Reproduction steps: 1. Create a 1000x1000 image. 2. Use the add noise effect to add some full intensity noise. 3. Select the magic want tool and pick global flood mode, 50% tolerance. 4. Click somewhere on the image, and press finish. 5. It will take about a minute, and use only one CPU core. The same steps complete in a few seconds on an 800x600 image. A 2000x2000 image doesn't finish in a reasonable amount of time. There's some sort of scaling issue here - surely the performance should be proportional to the number of pixels in the image. Note that I've seen this slow performance of the magic wand tool in an actual photo from my camera, this is just a simple way to recreate it. PC spec: Intel Core i5 2500K (3.3 GHz). 8GB RAM NVIDIA GeForce GTX 660 Windows 7 SP1 64-bit
  • Create New...