繁体   English   中英

在VS2015中发布x64配置时结果不同

[英]Different result when Release x64 configuration in VS2015

我正在使用VS2015社区实现光线跟踪程序。 程序将填充屏幕尺寸的颜色缓冲区( width * height ,元素类型为Eigen::Vector3f ),然后将缓冲区内容保存到ppm文件中。

基本循环(请注意外部循环末尾的输出部分):

using Vec3f = Eigen::Vector3f;

Vec3f * buffer = new Vec3f[w * h];

// for each pixel
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) 
{
    int const i = (h - y - 1) * w + x;
    buffer[i] = Vec3f::Zero();

    // 2x2 subpixel 
    for (int sy = 0; sy < 2; sy++) for (int sx = 0; sx < 2; sx++)
    {
        Vec3f r = Vec3f::Zero();

        // sampling
        for (int s = 0; s < samps; s++) 
        {
            // do some computation and accumulation to r
            // r = ...
        }
        buffer[i] = buffer[i] + r;
    }
    buffer[i] = buffer[i] * 0.25f;

    // debug with an output section
    //if (x % 16 == 0 && y % 16 == 0)
    //  std::cout << buffer[i] << std::endl;

}

我可以通过以下配置获得正确的结果:

  • 调试,x86或x64;
  • 发布,x86;
  • 释放(优化= \\ Od),x64。

但是,缓冲区都是带有Release(优化= \\ O1或\\ O2或\\ Ox),x64的零向量,而我得到的是黑色图片。

因此,使用Release(优化= \\ O1或\\ O2或\\ Ox)x64 ,我取消了对输出部分的注释,以检查缓冲区中的值。 奇怪的是,我检查的每个像素都有一个正确的值,未检查的像素仍然是零向量。 例如,如果我像上面的代码那样每16个像素检查一次,就会得到这样的图片(每16个像素细分256 * 256黑色):

发布优化错误答案= \\ O1 x64

我在Google上搜索并阅读了《 生存版本》等一些资料,但仍然不知道。 谁能提供一些解决这些问题的经验?

更新 :上面的代码不是很详细,完整的代码在这里 ,取决于Eigen 3.2.6。

浏览完Ideone上的代码后,问题似乎如下。 Scene类中, intersect方法返回bool const & 返回的引用是局部变量。 如果查看错误/警告日志,您将看到:

警告2警告C4172:返回本地变量或临时***。cpp的地址129 1

将返回类型更改为bool解决此问题,并且输出类似于32位版本的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM