Also schreibe ich einen Raytracer in C++ mit Jetbrains Clion IDE. Wenn ich versuche, ein 600 * 600-Bild mit aktiviertem Multi-Sampling-Antialiasing zu erstellen, fehlt mir der Speicher. Ich bekomme diese Fehlermeldung:Warum geht mir der Heapspeicher aus?
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_allocThis application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.
-Code meiner Render-Funktion:
Breite: 600 Höhe: 600 NumberOfSamples: 80
void Camera::render(const int width, const int height){
int resolution = width * height;
double scale = tan(Algebra::deg2rad(fov * 0.5)); //deg to rad
ColorRGB *pixels = new ColorRGB[resolution];
long loopCounter = 0;
Vector3D camRayOrigin = getCameraPosition();
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
double zCamDir = (height/2)/scale;
ColorRGB finalColor = ColorRGB(0,0,0,0);
int tempCount = 0;
for (int k = 0 ; k < numberOfSamples; k++) {
tempCount++;
//If it is single sampled, then we want to cast ray in the middle of the pixel, otherwise we offset the ray by a random value between 0-1
double randomNumber = Algebra::getRandomBetweenZeroAndOne();
double xCamDir = (i - (width/2)) + (numberOfSamples == 1 ? 0.5 : randomNumber);
double yCamDir = ((height/2) - j) + (numberOfSamples == 1 ? 0.5 : randomNumber);
Vector3D camRayDirection = convertCameraToWorldCoordinates(Vector3D(xCamDir, yCamDir, zCamDir)).unitVector();
Ray r(camRayOrigin, camRayDirection);
finalColor = finalColor + getColorFromRay(r);
}
pixels[loopCounter] = finalColor/numberOfSamples;
loopCounter++;
}
}
CreateImage::createRasterImage(height, width, "RenderedImage.bmp", pixels);
delete pixels; //Release memory
}
Ich bin ein Anfänger in C++, so dass ich Ich würde deine Hilfe sehr schätzen. Ich habe auch versucht, das gleiche in C# in Microsoft Visual Studio zu tun und die Speicherbelegung nie überschritten 200 MB. Ich habe das Gefühl, dass ich einen Fehler mache. Ich kann Sie mit mehr Details versorgen, wenn Sie mir helfen wollen.
Verwenden Sie teure Funktionen? Das kann der Grund sein, den Speicher nicht freizugeben. – Auriga