2016-06-20 8 views
0

Ich bin ein Raytracing-Programm mit VS2015-Community implementieren. Das Programm füllt einen Farbpuffer in Bildschirmgröße (width * height mit dem Elementtyp Eigen::Vector3f) und speichert den Inhalt des Puffers in einer ppm-Datei.Unterschiedliches Ergebnis, wenn Release x64-Konfiguration in VS2015

Die Grundschleife (Anmerkung am Ende der äußeren Schleife des Ausgangsabschnittes):

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; 

} 

I richtiges Ergebnis mit Konfigurationen zu erreichen:

  • Debug, x86 oder x64;
  • Freigabe, x86;
  • Freigabe (Optimierung = \ Od), x64.

Allerdings ist der Puffer alle Null-Vektoren mit Mitteilung (Optimierung = \ O1 oder \ O2 oder \ Ox), x64, und das, was ich habe ist ein schwarzes Bild.

Also mit Freigabe (Optimierung = \ O1 oder \ O2 oder \ Ox), x64, habe ich den Ausgabeabschnitt auskommentiert, um die Werte im Puffer zu überprüfen. Das Seltsame ist, jedes Pixel, das ich überprüft habe, hat einen korrekten Wert, die nicht überprüften Pixel bleiben Null. Zum Beispiel, wenn ich alle 16 Pixel wie der obere Code zu überprüfen, werde ich ein Bild wie diese erhalten (256 * 256 schwarz tessellated alle 16 Pixel):

wrong answer with Release optimization=\O1 x64

ich einige Materialien wie Surviving the Release Version gegoogelt und gelesen, aber immer noch keine Ahnung. Könnte jemand Erfahrungen mit diesen Problemen machen?

Update: Der obige Code ist nicht so detailliert, voller Code ist here, hängt von Eigen 3.2.6 ab.

+0

Können Sie Ihr Beispiel ein bisschen mehr ausprägen? Nämlich deine Berechnungen für "r". Ohne in der Lage zu sein, Ihre Ausgabe zu reproduzieren, sind alle Antworten, die Sie erhalten, ein Rätselraten. Und obwohl Sie sagen, dass Sie keine Lösung für dieses Problem suchen, sondern eher allgemeine "Erfahrungen", werden Fragen dieser Art oft als unwichtig (zu weit gefasst) betrachtet. Wenn jedoch ein bestimmtes Problem angezeigt wird, erhalten Sie möglicherweise Antworten mit einer allgemeineren Einsicht. –

+0

@AviGinsburg Die Berechnungen für 'r' sind zu kompliziert, deshalb füge ich den Link des vollständigen Codes am Ende der Frage an. – stanleyerror

+0

* "Zu kompliziert" * ist eine Ausrede, das ist nicht sehr hilfreich. Reduzieren Sie die Berechnung, bis Sie die minimale Version haben, die noch das Verhalten aufweist. Wenn das Entfernen des Codes das Ergebnis ändert, wissen Sie, wo Sie weiter nachforschen müssen. Auf jeden Fall sollten Fragen zur SO eigenständig sein. – IInspectable

Antwort

2

Nach dem Durchlaufen des Codes auf Ideone scheint das Problem wie folgt zu sein. In der Klasse Scene gibt die Methode intersect eine bool const & zurück. Die zurückgegebene Referenz ist eine lokale Variable. Wenn Sie die Fehler/Warnung Protokolle untersuchen würde haben Sie gesehen:

Warnung 2 Warnung C4172: Adresse einer lokalen Variablen zurückkehrt oder temporäre *** CPP 129 1

Änderung der Rückgabetyp. bool behebt das Problem und die Ausgabe ähnelt der von der 32-Bit-Version.

+0

Genau deshalb wird ein [mcve] benötigt, da die Quelle des Problems nicht im ursprünglichen Post lag. –

+0

Guter Anruf. Ich weiß nicht, warum das OP entschieden hat, zunächst eine Const Bool & zurück zu geben. Vielleicht haben sie kürzlich gelesen [GotW # 88: Ein Kandidat für die "wichtigste const"] (https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important- const /), und dann ging alles rückwärts. – IInspectable

+0

@AviGinsburg Ich habe zwei Fehler gemacht: 1) habe die Warnmeldung nicht überprüft; 2) hat den Code nicht sorgfältig überprüft. Das tut mir leid. Dieser Fehler Attribute "Uninitialized Local Variables" von http://www.codeproject.com/Articles/548/Surviving-the-Release-Version – stanleyerror

Verwandte Themen