start of statistics, convert level key into class

This commit is contained in:
ZappoMan 2013-11-24 20:49:47 -08:00
parent ed80895eb3
commit 8d8d73a940
3 changed files with 53 additions and 22 deletions

View file

@ -10,6 +10,10 @@
#include "VoxelPacket.h" #include "VoxelPacket.h"
bool VoxelPacket::_debug = false; bool VoxelPacket::_debug = false;
uint64_t VoxelPacket::_bytesOfOctalCodes = 0;
uint64_t VoxelPacket::_bytesOfBitMasks = 0;
uint64_t VoxelPacket::_bytesOfColor = 0;
VoxelPacket::VoxelPacket(bool enableCompression, int maxFinalizedSize) { VoxelPacket::VoxelPacket(bool enableCompression, int maxFinalizedSize) {
@ -82,17 +86,22 @@ bool VoxelPacket::updatePriorBytes(int offset, const unsigned char* replacementB
bool VoxelPacket::startSubTree(const unsigned char* octcode) { bool VoxelPacket::startSubTree(const unsigned char* octcode) {
bool success = false; bool success = false;
int possibleStartAt = _bytesInUse; int possibleStartAt = _bytesInUse;
int length = 0;
if (octcode) { if (octcode) {
int length = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(octcode)); length = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(octcode));
success = append(octcode, length); // handles checking compression success = append(octcode, length); // handles checking compression
} else { } else {
// NULL case, means root node, which is 0 // NULL case, means root node, which is 0
unsigned char byte = 0; unsigned char byte = 0;
length = 1;
success = append(byte); // handles checking compression success = append(byte); // handles checking compression
} }
if (success) { if (success) {
_subTreeAt = possibleStartAt; _subTreeAt = possibleStartAt;
} }
if (success) {
_bytesOfOctalCodes += length;
}
return success; return success;
} }
@ -139,13 +148,13 @@ void VoxelPacket::discardSubTree() {
_dirty = true; _dirty = true;
} }
int VoxelPacket::startLevel() { LevelDetails VoxelPacket::startLevel() {
int key = _bytesInUse; LevelDetails key(_bytesInUse,0,0,0);
return key; return key;
} }
void VoxelPacket::discardLevel(int key) { void VoxelPacket::discardLevel(LevelDetails key) {
int bytesInLevel = _bytesInUse - key; int bytesInLevel = _bytesInUse - key._startIndex;
if (_debug) { if (_debug) {
printf("discardLevel() BEFORE _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d\n", printf("discardLevel() BEFORE _dirty=%s bytesInLevel=%d _compressedBytes=%d _bytesInUse=%d\n",
@ -162,7 +171,7 @@ void VoxelPacket::discardLevel(int key) {
} }
} }
bool VoxelPacket::endLevel(int key) { bool VoxelPacket::endLevel(LevelDetails key) {
bool success = true; bool success = true;
// if we are dirty (something has changed) then try a compression test in the following cases... // if we are dirty (something has changed) then try a compression test in the following cases...
@ -189,7 +198,11 @@ bool VoxelPacket::endLevel(int key) {
} }
bool VoxelPacket::appendBitMask(unsigned char bitmask) { bool VoxelPacket::appendBitMask(unsigned char bitmask) {
return append(bitmask); // handles checking compression bool success = append(bitmask); // handles checking compression
if (success) {
_bytesOfBitMasks++;
}
return success;
} }
bool VoxelPacket::appendColor(const nodeColor& color) { bool VoxelPacket::appendColor(const nodeColor& color) {
@ -206,6 +219,9 @@ bool VoxelPacket::appendColor(const nodeColor& color) {
} }
} }
} }
if (success) {
_bytesOfColor += BYTES_PER_COLOR;
}
return success; return success;
} }

View file

@ -7,16 +7,8 @@
// TO DO: // TO DO:
// //
// * add stats tracking for number of bytes of octal code, bitmasks, and colors in a packet. // * add stats tracking for number of bytes of octal code, bitmasks, and colors in a packet.
// // - this is challenging, because you need to support the rollback of statistics when
// * determine why we sometimes don't fill packets very well (rarely) mid-scene... sometimes it appears as if // you discard a level or discard
// the "next node" would encode with more bytes than can fit in the remainder of the packet. this might be
// several tens or hundreds of bytes, but theoretically other voxels would have fit. This happens in the 0100
// scene a couple times.
// this is happening because of nodes that are not recursed for good reason like:
// - being occluded
// - being previously in view
// - being out of view, etc.
// in these cases, the node is not re-added to the bag... so, we can probably just keep going...
// //
// * further testing of compression to determine optimal configuration for performance and compression // * further testing of compression to determine optimal configuration for performance and compression
// * improve semantics for "reshuffle" - current approach will work for now and with compression // * improve semantics for "reshuffle" - current approach will work for now and with compression
@ -38,6 +30,23 @@ const int VOXEL_PACKET_TEST_UNCOMPRESSED_THRESHOLD = 4000;
const int VOXEL_PACKET_TEST_UNCOMPRESSED_CHANGE_THRESHOLD = 20; const int VOXEL_PACKET_TEST_UNCOMPRESSED_CHANGE_THRESHOLD = 20;
const int VOXEL_PACKET_COMPRESSION_DEFAULT = false; const int VOXEL_PACKET_COMPRESSION_DEFAULT = false;
class LevelDetails {
LevelDetails(int startIndex, int bytesOfOctalCodes, int bytesOfBitmasks, int bytesOfColor) :
_startIndex(startIndex),
_bytesOfOctalCodes(bytesOfOctalCodes),
_bytesOfBitmasks(bytesOfBitmasks),
_bytesOfColor(bytesOfColor) {
}
friend class VoxelPacket;
private:
int _startIndex;
int _bytesOfOctalCodes;
int _bytesOfBitmasks;
int _bytesOfColor;
};
class VoxelPacket { class VoxelPacket {
public: public:
VoxelPacket(bool enableCompression = false, int maxFinalizedSize = MAX_VOXEL_PACKET_SIZE); VoxelPacket(bool enableCompression = false, int maxFinalizedSize = MAX_VOXEL_PACKET_SIZE);
@ -57,14 +66,14 @@ public:
void discardSubTree(); void discardSubTree();
/// starts a level marker. returns an opaque key which can be used to discard the level /// starts a level marker. returns an opaque key which can be used to discard the level
int startLevel(); LevelDetails startLevel();
/// discards all content back to a previous marker key /// discards all content back to a previous marker key
void discardLevel(int key); void discardLevel(LevelDetails key);
/// ends a level, and performs any expensive finalization. may fail if finalization creates a stream which is too large /// ends a level, and performs any expensive finalization. may fail if finalization creates a stream which is too large
/// if the finalization would fail, the packet will automatically discard the previous level. /// if the finalization would fail, the packet will automatically discard the previous level.
bool endLevel(int key); bool endLevel(LevelDetails key);
/// appends a bitmask to the end of the stream, may fail if new data stream is too long to fit in packet /// appends a bitmask to the end of the stream, may fail if new data stream is too long to fit in packet
bool appendBitMask(unsigned char bitmask); bool appendBitMask(unsigned char bitmask);
@ -126,8 +135,14 @@ private:
int _compressedBytes; int _compressedBytes;
int _bytesInUseLastCheck; int _bytesInUseLastCheck;
bool _dirty; bool _dirty;
// statistics...
static uint64_t _bytesOfOctalCodes;
static uint64_t _bytesOfBitMasks;
static uint64_t _bytesOfColor;
static bool _debug; static bool _debug;
}; };
#endif /* defined(__hifi__VoxelPacket__) */ #endif /* defined(__hifi__VoxelPacket__) */

View file

@ -1261,7 +1261,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node,
const int BYTES_PER_COLOR = 3; const int BYTES_PER_COLOR = 3;
// Make our local buffer large enough to handle writing at this level in case we need to. // Make our local buffer large enough to handle writing at this level in case we need to.
int thisLevelKey = packet->startLevel(); LevelDetails thisLevelKey = packet->startLevel();
int inViewCount = 0; int inViewCount = 0;
int inViewNotLeafCount = 0; int inViewNotLeafCount = 0;