渲染和测试,驱动重要吗?
Rendering and testing, does the driver matter?
我正在开发一个渲染引擎(一个很小的啊哈)
我想编写回归测试,以确保在添加新功能时不会引入错误。
如果我开发一个计算着色器,或者将数据从一个缓冲区传输到另一个缓冲区的东西,测试就很容易。我们填充第一个缓冲区,并检查传输后第二个缓冲区是否有相应的数据。
但是对于渲染来说,似乎很难......我最终得到了几种解决方案
- 完全没有测试
- 截图,测试开始时显示截图和效果图,让用户(测试人员)检查结果是否良好
- 截取屏幕截图,当测试开始时将渲染与屏幕截图进行比较。
第一个解决方案是...不是解决方案。第二种解决方案似乎不错,但我认为我们失去了自动的东西是可悲的...
第三种解决方案似乎是最好的。然而,要真正有效,这意味着一种算法,如果在 Nvidia 卡、AMD、intel 或...上执行,必须产生完全相同的结果。
那么问题来了,我们能不能靠截图和点点滴滴的对比来进行回归测试呢?还是取决于驱动程序和/或制造商?
Vulkan 和 OpenGL 均未提供任何关于跨不同实现的二进制相同结果的保证。即使是同一张卡的驱动程序更新也会产生不同的结果。
你能为类似的事情做的最好的事情就是得到一个“接近”预期结果的结果。
说实话,硬件实现之间的内在差异是一个相对较小的问题,更大的问题是为逐位回归测试创建测试数据所花费的时间。
测试套件的真正威力(正如您所说)是在您添加新功能或解决错误时快速检查回归。使用您的示例,如果您更改了实现缓冲区的方式,则可以根据需要轻松地相应地修改单元测试,例如也许缓冲区的内存类型发生了变化,为此重构单元测试是微不足道的。
将相同的方法应用于软件的视觉输出需要 很多 的努力,尤其是当您进行更改需要重新生成预期输出时,即在单元测试中更改预期值比更改整个场景要容易几个数量级。
即使对于 Web,大多数开发人员也不会费心尝试 'test' 视觉效果并专注于功能,只是不值得维护测试的努力。
我正在开发一个渲染引擎(一个很小的啊哈)
我想编写回归测试,以确保在添加新功能时不会引入错误。
如果我开发一个计算着色器,或者将数据从一个缓冲区传输到另一个缓冲区的东西,测试就很容易。我们填充第一个缓冲区,并检查传输后第二个缓冲区是否有相应的数据。
但是对于渲染来说,似乎很难......我最终得到了几种解决方案
- 完全没有测试
- 截图,测试开始时显示截图和效果图,让用户(测试人员)检查结果是否良好
- 截取屏幕截图,当测试开始时将渲染与屏幕截图进行比较。
第一个解决方案是...不是解决方案。第二种解决方案似乎不错,但我认为我们失去了自动的东西是可悲的...
第三种解决方案似乎是最好的。然而,要真正有效,这意味着一种算法,如果在 Nvidia 卡、AMD、intel 或...上执行,必须产生完全相同的结果。
那么问题来了,我们能不能靠截图和点点滴滴的对比来进行回归测试呢?还是取决于驱动程序和/或制造商?
Vulkan 和 OpenGL 均未提供任何关于跨不同实现的二进制相同结果的保证。即使是同一张卡的驱动程序更新也会产生不同的结果。
你能为类似的事情做的最好的事情就是得到一个“接近”预期结果的结果。
说实话,硬件实现之间的内在差异是一个相对较小的问题,更大的问题是为逐位回归测试创建测试数据所花费的时间。
测试套件的真正威力(正如您所说)是在您添加新功能或解决错误时快速检查回归。使用您的示例,如果您更改了实现缓冲区的方式,则可以根据需要轻松地相应地修改单元测试,例如也许缓冲区的内存类型发生了变化,为此重构单元测试是微不足道的。
将相同的方法应用于软件的视觉输出需要 很多 的努力,尤其是当您进行更改需要重新生成预期输出时,即在单元测试中更改预期值比更改整个场景要容易几个数量级。
即使对于 Web,大多数开发人员也不会费心尝试 'test' 视觉效果并专注于功能,只是不值得维护测试的努力。