On Wed, 29 Sep 2021 00:42:01 GMT, Sergey Bylokhov <[email protected]> wrote:
> Do you know why we post it twice? It does not seem right, since we repaint > all content in the apps like Netbeans/Idea and it is quite a heavyweight > operation. Because SurfaceData is judged to be lost when 1st getGraphics() is called on 1st PaintEvent processing. https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java#L478 I traced PaintEvent, then I got following stacktrace. breakpoint hit: "Thread=AWT-EventQueue-0", java.awt.event.PaintEvent.<init>()、line=106 bci=0 [1] java.awt.event.PaintEvent.<init> (PaintEvent.java:106) [2] sun.awt.PaintEventDispatcher.createPaintEvent (PaintEventDispatcher.java:80) [3] sun.awt.windows.WComponentPeer.postPaintIfNecessary (WComponentPeer.java:892) [4] sun.awt.windows.WComponentPeer.handlePaint (WComponentPeer.java:886) [5] sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget (D3DScreenUpdateManager.java:283) [6] sun.java2d.d3d.D3DScreenUpdateManager.validate (D3DScreenUpdateManager.java:492) [7] sun.java2d.d3d.D3DScreenUpdateManager.createGraphics (D3DScreenUpdateManager.java:260) [8] sun.awt.windows.WComponentPeer.getGraphics (WComponentPeer.java:646) [9] java.awt.Component.getGraphics (Component.java:3,128) [10] sun.awt.RepaintArea.paint (RepaintArea.java:227) [11] sun.awt.windows.WComponentPeer.handleEvent (WComponentPeer.java:371) [12] java.awt.Component.dispatchEventImpl (Component.java:5,056) [13] java.awt.Container.dispatchEventImpl (Container.java:2,325) [14] java.awt.Window.dispatchEventImpl (Window.java:2,775) [15] java.awt.Component.dispatchEvent (Component.java:4,827) [16] java.awt.EventQueue.dispatchEventImpl (EventQueue.java:772) [17] java.awt.EventQueue$4.run (EventQueue.java:721) [18] java.awt.EventQueue$4.run (EventQueue.java:715) [19] java.security.AccessController.executePrivileged (AccessController.java:753) [20] java.security.AccessController.doPrivileged (AccessController.java:391) [21] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85) [22] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:95) [23] java.awt.EventQueue$5.run (EventQueue.java:745) [24] java.awt.EventQueue$5.run (EventQueue.java:743) [25] java.security.AccessController.executePrivileged (AccessController.java:753) [26] java.security.AccessController.doPrivileged (AccessController.java:391) [27] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85) [28] java.awt.EventQueue.dispatchEvent (EventQueue.java:742) [29] java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:203) [30] java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:124) [31] java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:113) [32] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:109) [33] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:101) [34] java.awt.EventDispatchThread.run (EventDispatchThread.java:90) AWT-EventQueue-0[1] > > At 1st PaintEvent is processing, RepaintArea calls getGraphics(), then D3DScreenUpdateManager finally calls new PaintEvent(). So, 2nd PaintEvent is posted and invoked later on EDT. ------------- PR: https://git.openjdk.java.net/jdk/pull/5491
