mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Speed up chunk deserialization by another 80%.
This commit is contained in:
parent
50070e738b
commit
29189119a8
@ -531,19 +531,20 @@ impl<'a/*, Error: de::Error*/> TryFrom<&'a [u8]> for BlockVec {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Initially, the set bit list is empty.
|
// Initially, the set bit list is empty.
|
||||||
let mut set_bits = bitarr![0; 256];
|
let mut set_bits = /*bitarr!*/[false; 256];
|
||||||
|
|
||||||
// TODO: SIMD iteration.
|
// TODO: SIMD iteration.
|
||||||
// NOTE: The block kind is guaranteed to be at the front, thanks to the repr(C).
|
// NOTE: The block kind is guaranteed to be at the front, thanks to the repr(C).
|
||||||
blocks.into_iter().for_each(|&[kind, _, _, _]| {
|
blocks.into_iter().for_each(|&[kind, _, _, _]| {
|
||||||
// TODO: Check assembly to see if the bounds check gets elided; if so, leave this as
|
// NOTE: Bounds check here appears to be either elided, or perfectly predicted, so we
|
||||||
// set instead of set_unchecked, to scope down the use of unsafe as much as possible.
|
// fortunately avoid using unsafe here.
|
||||||
set_bits.set(kind.into(), true);
|
/* set_bits.set(kind.into(), true); */
|
||||||
|
set_bits[kind as usize] = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// The invalid bits and the set bits should have no overlap.
|
// The invalid bits and the set bits should have no overlap.
|
||||||
set_bits &= invalid_bits;
|
invalid_bits &= set_bits;
|
||||||
if set_bits.any() {
|
if invalid_bits.any() {
|
||||||
// At least one invalid bit was set, so there was an invalid BlockKind somewhere.
|
// At least one invalid bit was set, so there was an invalid BlockKind somewhere.
|
||||||
//
|
//
|
||||||
// TODO: Use radix representation of the bad block kind.
|
// TODO: Use radix representation of the bad block kind.
|
||||||
|
Loading…
Reference in New Issue
Block a user