csgo-2018-source/engine/changeframelist.h

69 lines
2.6 KiB
C
Raw Normal View History

2021-07-25 12:11:47 +08:00
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef CHANGEFRAMELIST_H
#define CHANGEFRAMELIST_H
#ifdef _WIN32
#pragma once
#endif
#include "mempool.h"
#include "dt_common.h"
// This class holds the last tick (from host_tickcount) that each property in
// a datatable changed at.
//
// It provides fast access to a list of properties that changed within a certain frame range.
//
// These are created once per entity per frame. Since usually a very small percentage of an
// entity's properties actually change each frame, this allows you to get a small set of
// properties to delta for each client.
class CChangeFrameList
{
public:
//properties are bucketed into batches to keep the iteration through change frames fast. This
//allows for a time stamp to be checked on a bucket, and thereby skip the entire bucket
static const uint32 knBucketSize = 32;
CChangeFrameList( int nProperties, int iCurTick );
~CChangeFrameList();
CChangeFrameList( const CChangeFrameList &rhs );
// Call this to delete the object.
void Release();
// This just returns the value you passed into AllocChangeFrameList().
int GetNumProps() const { return m_nNumProps; }
int GetPropTick( int nProp ) const { return m_ChangeTicks[ nProp ]; }
// Sets the change frames for the specified properties to iFrame.
void SetChangeTick( const int* RESTRICT pProps, int nNumProps, const int iTick );
void SetChangeTick( const int nProp, const int iTick ) { m_ChangeTicks[ nProp ] = iTick; m_ChangeTicks[ m_nNumProps + nProp / knBucketSize ] = iTick; }
//given a bucket index, this will determine the lastest tick on that bucket
const int GetNumBuckets() const { return m_ChangeTicks.Count() - m_nNumProps; }
const int* GetBucketChangeTicks() const { return m_ChangeTicks.Base() + m_nNumProps; }
const int* GetChangeTicks() const { return m_ChangeTicks.Base(); }
// Given a tick and a property index, this will determine if it was changed after that time
bool DidPropChangeAfterTick( int iTick, int nProp ) const { return m_ChangeTicks[ nProp ] > iTick; }
CChangeFrameList* Copy(); // return a copy of itself
private:
// Change frames for each property. The buckets for the property set are appended onto the end.
CUtlVector< int > m_ChangeTicks;
int m_nNumProps;
CChangeFrameList &operator=( const CChangeFrameList &rhs );
DECLARE_FIXEDSIZE_ALLOCATOR_MT( CChangeFrameList );
};
#endif // CHANGEFRAMELIST_H