Win8 DirectX 开发问题总结(一)

参照Win32下的DirectX 10代码,实现基于DirectX 11的Windows Store App,虽然是弯路,会遇到一些额外的问题,但是感觉在解决问题的过程中,能对DirectX理解的更深一些。而且这样做能够避免自己直接复制代码,不关注细节。这里对目前为止遇到过的问题进行总结,防止自己以后犯同样的错误。水模型之前的代码只是对VS2012模板代码进行简单改动,从没遇到问题,问题都出现在实现水波纹的过程中,都是运行时出现的错误。

一、内存访问冲突

错误提示:


出现这个错误的原因是在Renderer的Update方法中,没有用条件语句

if (m_loadingComplete)

{

}

包含更新水面顶点缓冲区的代码。

从调用堆栈可以看出问题由WaterModel的Update方法引发,而且弹出错误提示是在应用启动时,也就是第一次对Update方法的调用。Update方法中需要更改缓冲区,出现此问题应该是缓冲区未初始化。检查Renderer类的Update方法后发现问题。由于初始化资源为异步调用,第一次执行Update方法时不能保证缓冲初始化完成,这时尝试更新缓冲区就会出现问题。

教训:

1、 使用资源前要保证初始化完成。

2、 异步编程一定要注意任务次序控制。

 

二、输入验证失败

错误提示:


这个问题出现在Disturb方法的输入验证阶段,从输出提示可以看出是传入的参数越界。因此定位到Renderer的Update方法,找到生成随机值的代码。

int i = 5 + rand() % 128;

int j = 5 + rand() % 128;

ij有可能超出128。在初始化时用的代码是

m_water.Initialize(m_d3dDevice.Get(), 128, 128, 1.0f,0.03f, 3.25f, 0.4f);

这样就会造成Disturb方法输入验证失败。

教训:

在编程中要避免奇异数出现,方便查找错误。

 

三、图像绘制异常

错误现象:


程序能正常运行,但是水面会从边界高度无限增加,最终消失。由于这次没有出现运行错误,所以只检查更新水面高度的代码,最终发现是循环的起止范围有误。使用这种算法更新水面高度时会用到当前顶点四个方向上的邻点,而边界顶点总会缺少一个方向的邻点,这样,在更新顶点高度时会引入一个无效值,得出无意义的结果,出现上面的现象。

 

教训:

实现算法时要注意边界条件。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章