首先,我是一位经验丰富的图形程序员,但众所周知,每个人都会犯错误。不幸的是,代码库有点太大,无法开始在这里抛出合理的代码片段,并在一个孤立的 CPP/代码库中重新创建整个情况,这是一个太高的命令——我很抱歉,没有时间。我会尽力解释。
顺便说一句,如果有人想知道我是如何处理这个或那个的,我当然会提供特定的代码片段!
与 D3DPOOL_DEFAULT 池中的所有资源一样,当设备上下文从您手中夺走时,您迟早将不得不重置您的资源。我已经建立了一个机制来处理多年来一直工作的所有相关资源;但是这个事实无论如何我当然已经检查,断言并怀疑自从这个错误曝光以来的任何假设。
发生的情况如下:我有一个相当大的动态顶点缓冲区,确切大小为 18874368 字节。该缓冲区在生成动态几何体(与等值面相关,仅供参考)之前每帧都被锁定(并使用 D3DLOCK_DISCARD 标志完全丢弃)。这工作正常,当然,直到我开始重置。可能需要 1 次、可能需要 2 次或可能需要 5 次重置来触发一个错误,该错误会导致更新资源上的 Lock() 操作返回的指针上的访问冲突或普通崩溃 - 关于有点类似的地址,但没有它在第一种情况下附加的偏移量,因为在这种情况下,我们在写一半的地方——在 D3D9 dll Lock() 调用之外。
我已经在其他硬件上对此进行了测试,将我的 GMA X3100 驱动程序(使用带有 BootCamp 的 MacBook)升级到了最新版本,但我无法在任何其他机器上重现它,而且我不知道这里出了什么问题。我试图用类似的缓冲区重现类似的情况(我有一个用四边形填充的相同类型的大型便笺簿),并且超过一定数量的字节它开始表现类似。
我不是在这里寻求解决方案,但我很感兴趣是否有其他开发人员在这里与同一个敌人作战,或者可能有人可以为我指出一些有见地的方向,也许会问一些可能会阐明的问题我可能会或可能不会忽略什么。
谢谢,任何更正都非常受欢迎。
- 尼尔斯
ps - 我的一个朋友提出了一个有效的观点,即它是板载视频 RAM 的巨大缓冲区,并且由于它的动态特性,它在内部至少有两倍或三倍的缓冲。另一方面,调试输出(D3D9 调试 DLL + 最大警告输出)保持静默。
ps 2 - 如果它在更多机器上测试并且仍然有效 - 这可能是一个环境问题:巨大的动态,内部双/三倍缓冲缓冲区,没有很多内存和驱动程序在他们应该抱怨的时候......
ps 3 - 刚刚被告知(应该知道)Lock 和 Unlock 会执行 18MB 的完整副本 - 这也不太聪明,但仍然 :) (我确实对渲染器的通用动态 VB/ 使用了更明智的策略肠易激综合症)。
除非有人有更好的建议;我还是很想听:)