Files
LayaNative2.0/Conch/source/webglPlus/Manager/JCArrayBufferManager.h
T
2020-11-11 16:17:13 +08:00

217 lines
7.1 KiB
C++

/**
@file JCArrayBufferManager.h
@brief
@author James
@version 1.0
@date 2017_11_29
*/
#ifndef __JCArrayBufferManager_H__
#define __JCArrayBufferManager_H__
#include "../buffer/JCCommandEncoderBuffer.h"
#include <vector>
#include <unordered_map>
namespace laya
{
class JCArrayBufferManager
{
public:
enum ARRAY_BUFFER_TYPE
{
ARRAY_BUFFER_TYPE_DATA,
ARRAY_BUFFER_TYPE_CMD,
};
enum ARRAY_BUFFER_REF_TYPE
{
ARRAY_BUFFER_REF_TYPE_REFERENCE,
ARRAY_BUFFER_REF_TYPE_COPY,
};
class ArrayBufferContent
{
public:
ArrayBufferContent(char* pBuffer, int nLength, ARRAY_BUFFER_TYPE nType,bool bNeedDelBuffer )
{
m_bNeedDelBuffer = bNeedDelBuffer;
m_nType = nType;
m_pBuffer = pBuffer;
m_nLength = nLength;
m_nNoteSize = 0;
m_pCommandEncoderBuffer = NULL;
if (m_nType == ARRAY_BUFFER_TYPE_CMD)
{
m_pCommandEncoderBuffer = new JCCommandEncoderBuffer(0, 0);
m_nNoteSize = *(int*)m_pBuffer;
if (m_nNoteSize > 0)
{
m_pCommandEncoderBuffer->setShareBuffer(m_pBuffer + 4, (m_nNoteSize - 1) * 4);
}
}
}
ArrayBufferContent(ARRAY_BUFFER_TYPE nType,bool bNeedDelBuffer )
{
m_bNeedDelBuffer = bNeedDelBuffer;
m_nType = nType;
m_pBuffer = NULL;
m_nLength = 0;
m_nNoteSize = 0;
m_pCommandEncoderBuffer = NULL;
if (m_nType == ARRAY_BUFFER_TYPE_CMD)
{
m_pCommandEncoderBuffer = new JCCommandEncoderBuffer(0, 0);
}
}
void mallocBuffer(char* pBuffer, int nLength, ARRAY_BUFFER_TYPE nType)
{
if (m_pBuffer)
{
delete m_pBuffer;
}
m_nLength = nLength;
m_pBuffer = new char[m_nLength];
memcpy(m_pBuffer, pBuffer, nLength);
if (m_nType == ARRAY_BUFFER_TYPE_CMD)
{
m_pCommandEncoderBuffer = new JCCommandEncoderBuffer(0, 0);
m_nNoteSize = *(int*)m_pBuffer;
if (m_nNoteSize > 0)
{
m_pCommandEncoderBuffer->setShareBuffer(m_pBuffer + 4, (m_nNoteSize - 1) * 4);
}
}
}
~ArrayBufferContent()
{
if (m_bNeedDelBuffer)
{
delete m_pBuffer;
m_pBuffer = NULL;
}
if (m_pCommandEncoderBuffer)
{
delete m_pCommandEncoderBuffer;
m_pCommandEncoderBuffer = NULL;
}
}
void syncContent(ArrayBufferContent* pContent)
{
if (m_pBuffer)
{
if (m_nLength == pContent->m_nLength)
{
memcpy(m_pBuffer, pContent->m_pBuffer, m_nLength);
}
else
{
delete m_pBuffer;
m_nLength = pContent->m_nLength;
m_pBuffer = new char[m_nLength];
memcpy(m_pBuffer, pContent->m_pBuffer, m_nLength);
}
}
else
{
m_nLength = pContent->m_nLength;
m_pBuffer = new char[m_nLength];
memcpy(m_pBuffer, pContent->m_pBuffer, m_nLength);
}
//同步MemClass
if (pContent->m_pCommandEncoderBuffer)
{
if (m_pCommandEncoderBuffer == NULL)
{
m_pCommandEncoderBuffer = new JCCommandEncoderBuffer(0, 0);
}
m_nNoteSize = *(int*)m_pBuffer;
if (m_nNoteSize > 0)
{
m_pCommandEncoderBuffer->setShareBuffer(m_pBuffer + 4, (m_nNoteSize - 1) * 4);
}
}
else
{
if (m_pCommandEncoderBuffer)
{
delete m_pCommandEncoderBuffer;
m_pCommandEncoderBuffer = NULL;
}
}
}
void setBuffer(char* pBuffer, int nLength)
{
m_pBuffer = pBuffer;
m_nLength = nLength;
if (m_pCommandEncoderBuffer)
{
m_nNoteSize = *(int*)m_pBuffer;
if (m_nNoteSize > 0)
{
m_pCommandEncoderBuffer->setShareBuffer(m_pBuffer + 4, (m_nNoteSize - 1) * 4);
}
}
}
JCCommandEncoderBuffer* getCommandEncoderBuffer()
{
if (*(int*)m_pBuffer != m_nNoteSize )
{
m_nNoteSize = *(int*)m_pBuffer;
if (m_nNoteSize > 0)
{
m_pCommandEncoderBuffer->setShareBuffer(m_pBuffer + 4, (m_nNoteSize - 1) * 4);
}
}
return m_pCommandEncoderBuffer;
}
public:
char* m_pBuffer;
int m_nLength;
bool m_bNeedDelBuffer;
ARRAY_BUFFER_TYPE m_nType;
public:
int m_nNoteSize; //记录buffer中的第0个值,为了快速判断用
JCCommandEncoderBuffer* m_pCommandEncoderBuffer; //为了解流使用
};
typedef std::vector<ArrayBufferContent*> VectorBuffer;
public:
JCArrayBufferManager();
~JCArrayBufferManager();
void clearAll();
inline ArrayBufferContent* getArrayBuffer(int nID)
{
return nID < m_vBuffers.size() ? m_vBuffers[nID] : NULL;
}
int getID();
void removeArrayBuffer(int nID);
int createArrayBuffer(char* pBuffer, int nLength, ARRAY_BUFFER_TYPE nType, ARRAY_BUFFER_REF_TYPE nRefType);
bool updateArrayBuffer(int nID, char* pBuffer, int nLength);
bool syncArrayBufferDataToRuntime(int nID, char* pBuffer, int nLength);
void prepareRemoveArrayBuffer(int nID);
public:
int m_nGlobalID;
VectorBuffer m_vBuffers;
std::vector<int> m_vPrepareDelIDs;
};
}
//------------------------------------------------------------------------------
#endif //__JCArrayBufferManager_H__
//-----------------------------END FILE--------------------------------