WsComponentPool/ECSMemoryPool/memory_pages.h

145 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <mutex>
class MemoryPage;
/// <summary>
/// 内存页访问控制块
/// </summary>
struct PageControlBlock {
uint16_t active_entities_count = 0; // 活跃element数量决定是否需要卸载
uint16_t byte_count_per_element = 32; // 单个element大小16的倍数
uint32_t total_buffer_size = 0; // 可用数据缓冲区大小
uint64_t typecode_of_element = 0; // 元素类型标识码
uint64_t curr_access_usec = 0; // 最近访问时间点lsbus
uint32_t acc_count_per_cycle = 0; // 单周期内累积访问次数
uint32_t un_used = 0;
std::mutex access_protected; // 内存数据访问保护锁
};
/// <summary>
/// 内存页面16K大小
/// </summary>
class MemoryPage {
private:
PageControlBlock pcb;
char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {};
public:
/// <summary>
/// 构建内存页
/// </summary>
/// <param name="raw_element_size_16B">原始element尺寸</param>
explicit MemoryPage(uint16_t raw_element_size_16B, uint64_t typecode);
/// <summary>
/// 记录单次访问时间
/// </summary>
/// <param name="timepoint_usec"></param>
void accessRecord(uint64_t timepoint_usec);
/// <summary>
/// 清除访问次数记录
/// </summary>
/// <returns>上一周期累积次数</returns>
uint32_t timesClear();
/// <summary>
/// 获取访问记录
/// </summary>
/// <returns>{最近访问时间,累积次数}</returns>
std::pair<uint64_t, uint32_t> getRecords() const;
/// <summary>
/// 加锁在release之前不能访问本类型任何接口否则会造成死锁
/// </summary>
void lock();
/// <summary>
/// 解锁
/// </summary>
void release();
/// <summary>
/// 获取element元素数据访问指针
/// </summary>
/// <param name="index">元素索引</param>
/// <param name="active_set">是否设置</param>
/// <returns>数据指针</returns>
char* getElementPtr(int index);
/// <summary>
/// 元素类型码
/// </summary>
/// <returns></returns>
uint64_t elementTypeCode() const;
/// <summary>
/// 获取单个元素尺寸
/// </summary>
/// <returns>字节数量</returns>
uint16_t elementSize() const;
/// <summary>
/// 获取元素数量
/// </summary>
/// <returns></returns>
uint16_t elementCount() const;
};
/// <summary>
/// 元素访问控制块
/// </summary>
struct ElementControlBlock {
uint8_t active_mark = 0; // 活跃标志
uint8_t backup_1 = 0;
uint16_t byte_count = 16; // 该元素字节长度16的倍数
uint16_t element_index = 0; // 本元素在Page中的索引
uint16_t backup_2 = 0;
MemoryPage* page_refer = nullptr; // 页面关联指针
void* extend_bind = nullptr; // 绑定控制块内存指针
};
/// <summary>
/// 内存元素访问接口
/// </summary>
class MemoryElement {
private:
ElementControlBlock* const data_ptr;
uint32_t buffer_offset = 0;
public:
static uint32_t validOffset();
static uint32_t rawSize(uint32_t data_type_size);
/// <summary>
/// 构建内存元素访问接口
/// </summary>
/// <param name="access_bind"></param>
MemoryElement(char* access_bind);
/// <summary>
/// 更新最终访问时间
/// </summary>
/// <param name="time_usec"></param>
void accessRecUpdate(uint64_t time_usec);
/// <summary>
/// 数据活跃状态
/// </summary>
/// <returns></returns>
uint8_t isActived() const;
/// <summary>
/// 设置数据活跃状态
/// </summary>
/// <param name="ste"></param>
void setActive(uint8_t ste);
/// <summary>
/// 锁定数据,返回数据存储内存指针
/// </summary>
/// <returns></returns>
char* dataLock();
/// <summary>
/// 解锁数据
/// </summary>
void release();
};