首先,我是一个相当有经验的图形程序员,但大家都知道,每个人都会犯错。不幸的是,代码库有点太大,不能在这里抛出合理的代码片段,在一个孤立的CPP/代码库中重新创建整个情况的要求太高了——对此我很抱歉,没有时间。我会尽力解释的。
B.t.w,如果有人想知道我是如何处理这个或那个的,我当然会提供特定的代码片段!
与D3DPOOL\u默认池中的所有资源一样,当设备上下文从您手中消失时,您迟早要重置资源。我已经建立了一个机制来处理这一切相关的资源,已经工作了多年;但事实上,尽管我已经检查,断言和怀疑任何假设,因为这个错误曝光。
发生的情况如下:我有一个相当大的动态顶点缓冲区,确切大小为18874368字节。在生成动态几何体(等值面相关,f.y.i)之前,该缓冲区在每一帧被锁定(并使用D3DLOCK\u DISCARD标志完全丢弃)。当然,在我开始重置之前,这个工作正常。可能需要1次、2次或5次重置才能引发导致访问冲突的错误
任何一个
在更新的资源上的Lock()操作返回的指针上,或者一个普通的崩溃——关于一个有点类似的地址,但是没有它在第一种情况下附加到它上的偏移量,因为在这种情况下,我们正在写一半——iside D3D9 dll Lock()调用。
我已经在其他硬件上测试过了,把我的gmax3100驱动程序(使用带BootCamp的MacBook)升级到了最新的,但是我不能在任何其他机器上复制它,我对这里的错误一无所知。我试着用一个类似的缓冲区来重现类似的情况(我有一个与我填充的四边形类型相同的大便笺簿),超过一定数量的字节后,它开始表现出类似的行为。
我不是在这里要求一个解决方案,但我非常感兴趣的是,是否有其他开发人员在这里谁与同一个敌人或可能有人谁可以指出一些有见地的方向我,可能会问一些问题,可能会有助于对什么我可以或不可以忽略的光。
谢谢,任何更正都是非常欢迎的。
p、 我的一个朋友提出了一个有效的观点,那就是它是一个巨大的板载视频RAM缓冲区,由于它的动态特性,它的内部至少有两倍或三倍的缓冲。另一方面,调试输出(D3D9调试DLL+最大警告输出)保持静默。
巨大的
动态,内部双/三重缓冲区,没有太多的内存和驱动程序,不抱怨时,他们应该。。
p、 s3-刚刚被告知(应该知道)Lock和Unlock做了18MB的完整拷贝——这也不太聪明,但仍然是:)(对于渲染器的通用动态VB/IBs,我确实使用了更理智的策略)。
除非有人有更好的建议;我还是很想听:)