With this latest optimization, I think I can safely say that it's time to move onto Version .02a.
Thanks to the help from reddit and the SomethingAwful forums I was able to greatly reduce my memory footprint. I am now implementing a Dictionary<Int16,bool> which should technically be the smallest possible Dictionary combination for me. I did this by changing it so instead of storing the cubes global position to the world, I'm storing it's relative position to the chunk. When I need its global position I just take its local position and add it to the chunk position.
The formula I'm using to convert from Vector3 to Int16 is:
location.X + (location.Y * 256) + (location.Z * 16)
To convert back, I do the following:
int y = index / 256;
index -= (short)(y * 256);
int z = index / 16;
index -= (short)(z * 16);
int x = index;
return new Vector3(x, y, z);
This won't give me any collisions as long as I stay within 16x128x16. With the memory I save, this is the best possible combination that I can think of between the memory saved from not storing any visible cubes and always doing an algorithm check to the speed from storing all visible cubes and only doing the algorithm check once.
With this, I'm going to force myself to go onto .02a and do more fun programming stuff. I'll push it out to the testers and have them test it to make sure I didn't make any obvious mistakes.
Here are some more cool screenshots with a drawOut of 30 (61x61 chunk world).
Thanks to the help from reddit and the SomethingAwful forums I was able to greatly reduce my memory footprint. I am now implementing a Dictionary<Int16,bool> which should technically be the smallest possible Dictionary combination for me. I did this by changing it so instead of storing the cubes global position to the world, I'm storing it's relative position to the chunk. When I need its global position I just take its local position and add it to the chunk position.
The formula I'm using to convert from Vector3 to Int16 is:
location.X + (location.Y * 256) + (location.Z * 16)
To convert back, I do the following:
int y = index / 256;
index -= (short)(y * 256);
int z = index / 16;
index -= (short)(z * 16);
int x = index;
return new Vector3(x, y, z);
This won't give me any collisions as long as I stay within 16x128x16. With the memory I save, this is the best possible combination that I can think of between the memory saved from not storing any visible cubes and always doing an algorithm check to the speed from storing all visible cubes and only doing the algorithm check once.
With this, I'm going to force myself to go onto .02a and do more fun programming stuff. I'll push it out to the testers and have them test it to make sure I didn't make any obvious mistakes.
Here are some more cool screenshots with a drawOut of 30 (61x61 chunk world).
Love this mountain range. |
1 comment:
dope mountain range man.
that's a smart change to the cube indexing too, looks very efficient and scalable.
Post a Comment