Closed bizehao closed 2 years ago
和#3 的现象一样
我估摸着这是Direct2D的问题,在Windows 10的第一版及所有旧版Windows都不要用Direct2D的64位。我先close了,有什么新发现的话再reopen。
我并不exactly知道为什么这个现象会发生,但是32位和64位的代码是完全一样的。但是自从我用Windows 10并更新一次之后,无论64位跑多少次都看不到这个崩溃了。
我这也是最新版本win10,哎,搞不懂,我也觉得是direct2d的问题
下断点看看GacUI跑起来用的是Direct2D 2.0还是2.1?搜2_1就能快速定位到代码。
我刚刚加了些修改,不会崩了,下面是我的修改 GuiGraphicsRenderersWindowsDirect2D.cpp
#define IMPLEMENT_BRUSH_ELEMENT_RENDERER_LINEAR_GRADIENT_BRUSH(TRENDERER)\
void TRENDERER::CreateBrush(IWindowsDirect2DRenderTarget* _renderTarget)\
{\
if(_renderTarget)\
{\
oldColor=Pair<Color, Color>(element->GetColor1(), element->GetColor2());\
brush=_renderTarget->CreateDirect2DLinearBrush(oldColor.key, oldColor.value);\
brush->AddRef();\ //新增
}\
}\
void TRENDERER::DestroyBrush(IWindowsDirect2DRenderTarget* _renderTarget)\
{\
if(_renderTarget && brush)\
{\
_renderTarget->DestroyDirect2DLinearBrush(oldColor.key, oldColor.value);\
brush->Release(); \ //新增
brush = nullptr; \ //新增 可有可无
}\
}\
这就很奇怪,CreateDirect2DLinearBrush内部就是保证refcount是1的,而且也没人Release过(除了render target没了之后释放全部东西),理应不需要这么修改。不过如果这样确实能解决问题那我就加上去。
不过既然能这么修,说不定真的是Direct2D的bug后来被修掉了,才解释了为什么现在我一直没办法在新的win10上repro。
32位模式下正常,64位下会崩溃. 在有动画的情况下尤为明显,一会就崩了,
我经过排查,感觉像是画刷资源共用的问题,但是32位下没事,就解释不同了。 我把颜色随机改变,资源缓冲区里的每一个画刷都是唯一的,就不会崩溃。或者说 这样,也不会崩溃。
这是堆栈信息: KernelBase.dll!00007fff8a0dd532() 未知 d2d1debug3.dll!DebugLayer::OutputGlobalErrorMessage(unsigned int,...) 未知 d2d1debug3.dll!ResourceSDK::CResourceUsageMgr<struct IUnknown ,struct ResourceSDK::NoExemptionPolicy,struct ResourceSDK::DefaultNewAndDeleteOperators,struct ResourceSDK::RentalThreadedResourceUsagePolicy,struct Reporter,class DebugTracker,class ResourceSDK::CDictionary<struct IUnknown ,class DebugTracker,struct ResourceSDK::DefaultNewAndDeleteOperators> >::ClosedHandleCheck(struct IUnknown ) 未知 d2d1debug3.dll!DebugLayer::TestResourcePreApi(struct IUnknown const ,struct DebugTracker::Storage const ,bool) 未知 d2d1debug3.dll!DebugRenderTargetGenerated::FillEllipse(struct D2D1_ELLIPSE const ,struct ID2D1Brush *) 未知