On Tuesday, 27 January 2015 at 22:30:13 UTC, Gan wrote:
On Tuesday, 27 January 2015 at 21:36:51 UTC, Rikki Cattermole
wrote:
On 28/01/2015 9:59 a.m., Gan wrote:
On Tuesday, 27 January 2015 at 19:59:08 UTC, Gan wrote:
On Tuesday, 27 January 2015 at 19:26:12 UTC, bearophile
wrote:
Gan:
Is there some special stuff I gotta do extra with
structs? Do they
need manually allocated and released?
Most of your usages of tiny structs should be by value.
So just keep
in mind they are values. Even when you iterate with a
foreach on a
mutable array of them :-)
On a second question, do I ever need to manually release
objects I
create with new?
Usually not. How much advanced do you want to be? :-)
Bye,
bearophile
Thanks. I'll give structs a try.
When I start the program, it runs fine at 35mb of ram. It
only keeps
15 objects stored in the arrays at a time so why do you
think my ram
usage increases to 700+ after many hours?
Curiously, my CPU usage went from 10% to 5% after I changed
to structs
on Point and Range. Though my memory still climbs high.
Force a GC.collect() now and again. Disable it at the
beginning too.
I did a test and ran GC.collect() every loop but my memory
usage
continues to rise. I can see how you'd be able to lower CPU
usage by
running GC.collect() every now and then but right now I'm
stuck on the
memory issue.
Perhaps my problem lies in the C++ library SFML?
I commented out some stuff and it appears my massive memory
consumption
comes from my tile.redraw function:
void redraw() {
undrawn = false;
canvas.clear();
//Add stars
for (int i = 0; i < controller.starsPerTile; i++) {
Random gen;
gen.seed(unpredictableSeed);
int x = uniform(0, controller.tileSize, gen);
int y = uniform(0, controller.tileSize, gen);
double s = uniform(0, 10000, gen) / 10000.0;
double size = (s * (controller.starSizeMax -
controller.starSizeMin)) + controller.starSizeMin;
if (x - size / 2 < 0) {
x += size / 2;
}
if (y - size / 2 < 0) {
y += size / 2;
}
if (x + size / 2 > controller.tileSize) {
x -= size / 2;
}
if (y + size / 2 > controller.tileSize) {
y -= size / 2;
}
drawStar(canvas, x, y, size, size);
}
canvas.display();
}
void drawStar(RenderTarget target, int centerX, int
centerY, double
width, double height) {
CircleShape star;
if (controller.multiColor == false) {
star = controller.stars[0];
} else {
Random gen;
gen.seed(unpredictableSeed);
star = controller.stars[uniform(0,
controller.stars.length
- 1, gen)];
}
star.position = Vector2f(centerX, centerY);
star.origin = Vector2f(0.5, 0.5);
star.scale = Vector2f(width / 100.0, height / 100.0);
target.draw(star);
}
Would you know why this is using hundreds of mb of rams?