Files
LayaNative2.0/Conch/source/conch/JCScrpitRuntimeWASM.cpp
T
2020-11-11 16:17:13 +08:00

167 lines
5.0 KiB
C++

/**
@file JCScrpitRuntimeWASM.cpp
@brief
@author James
@version 1.0
@date 2017_9_25
*/
#include "JCScrpitRuntimeWASM.h"
#include <algorithm>
#include <util/Log.h>
#include "JCSystemConfig.h"
#include "JCConch.h"
//#include <Performance/JCPerfHUD.h>
#include "JCCmdDispatchManager.h"
#include <downloadMgr/JCDownloadMgr.h>
#include <inttypes.h>
#include <RenderCmd/CmdBase.h>
#include <RenderCmd/CmdFunction.h>
namespace laya
{
#define RENDERCMD_RESERVE_NUM 2048
JCScriptRuntime* JCScriptRuntime::s_JSRT = NULL;
JCScriptRuntime::JCScriptRuntime()
{
s_JSRT = this;
JCICmdDispatch::resetDispathGlobalID();
m_pJSCmdBuffer = new JCMemClass(MEM_RENDER_COMMAND_SIZE, MEM_RENDER_COMMAND_SIZE);
m_pJSCmdBuffer->setAlign(true);
m_pTextManager = new JCTextManager(JCConch::s_pConchRender->m_pAtlasManager);
m_pFontManager = new JCFontManager();
m_pMeasureTextManager = new JCMeasureTextManager();
m_pCmdDispathManager = new JCCmdDispathManager();
m_nCountGroup = 0;
m_nCountVertex = 0;
m_nCountNode = 0;
m_pRootHtml5Context = NULL;
m_pRootNode = NULL;
m_pFreeTypeRender = NULL;
onThInit();
}
JCScriptRuntime::~JCScriptRuntime()
{
onThExit();
s_JSRT = NULL;
m_pFreeTypeRender = NULL;
if (m_pJSCmdBuffer)
{
delete m_pJSCmdBuffer;
m_pJSCmdBuffer = NULL;
}
if (m_pFontManager)
{
delete m_pFontManager;
m_pFontManager = NULL;
}
if( m_pMeasureTextManager )
{
delete m_pMeasureTextManager;
m_pMeasureTextManager = nullptr;
}
if (m_pTextManager)
{
delete m_pTextManager;
m_pTextManager = NULL;
}
if (m_pCmdDispathManager)
{
delete m_pCmdDispathManager;
m_pCmdDispathManager = NULL;
}
m_pRootNode = NULL;
JCNode2DRenderer::clearAll();
}
void JCScriptRuntime::init(JCFreeTypeFontRender* pFreeTypeRender )
{
m_pFreeTypeRender = pFreeTypeRender;
m_pMeasureTextManager->setFreeTypeFontRender(m_pFreeTypeRender);
m_pTextManager->setFreeTypeRender(m_pFreeTypeRender);
}
void JCScriptRuntime::onThInit()
{
m_pRootHtml5Context = NULL;
//JCPerfHUD::resetFrame();
m_vRenderCmds.reserve(RENDERCMD_RESERVE_NUM);
JCConch::s_pConchRender->m_pImageManager->resetJSThread();
JCICmdDispatch::resetDispathGlobalID();
m_pJSCmdBuffer->clearData();
startScriptOnRenderThread();
JCNode2DRenderer::initAll();
}
bool JCScriptRuntime::onUpdate()
{
m_nUpdateCount++;
onUpdateDraw(0);
//释放已经丢弃的cmd指令
//CmdBase::releaseDiscardedCmds();
return true;
}
void JCScriptRuntime::onUpdateDraw(double vsyncTime)
{
dispatchScriptCmd();
if (JCConch::s_pConchRender != NULL)
{
if (m_pRootHtml5Context)
{
if (m_pRootNode)
{
m_pRootNode->render(m_pRootHtml5Context, 0, 0);
}
}
//setRenderData
int nRenderCmdSize = m_vRenderCmds.size();
JCConch::s_pConchRender->setRenderData(m_vRenderCmds, m_nCountGroup, m_nCountVertex, m_nCountNode);
JCConch::s_pConchRender->renderFrame(0,false);
if (nRenderCmdSize > RENDERCMD_RESERVE_NUM)
{
m_vRenderCmds.reserve(nRenderCmdSize);
}
}
}
void JCScriptRuntime::onThExit()
{
m_pRootHtml5Context = NULL;
//清空文字相关的
m_pMeasureTextManager->clearAll();
m_pFontManager->clearAllData();
//清空会非法,这个地方先重用这
//m_pTextManager->clearAll();
m_pCmdDispathManager->clearAll();
}
void JCScriptRuntime::flushSharedCmdBuffer()
{
char* pBuff = m_pCmdBufferSharedWithJS;
if (!pBuff)return;
int len = *(int*)pBuff;
m_pJSCmdBuffer->append(pBuff + 4, len-4);
((int*)pBuff)[0] = 4;
}
void JCScriptRuntime::setJSCmdBuffer(char* pBuffer)
{
int nLen = *(int*)pBuffer;
m_pJSCmdBuffer->setExternalBuffer(pBuffer + 4, nLen - 4);
}
void JCScriptRuntime::dispatchScriptCmd()
{
m_pCmdDispathManager->dispatchScriptCmd(*m_pJSCmdBuffer, m_nUpdateCount);
m_pJSCmdBuffer->clearData();
}
void JCScriptRuntime::setRootNode(JCNode2D* pNode)
{
m_pRootNode = pNode;
}
void JCScriptRuntime::startScriptOnRenderThread()
{
CmdFunction* pObject = CmdFunction::create(-1);
pObject->m_pFunction = std::bind([]() {
JCConch::s_pConchRender->clearAllData();
});
m_vRenderCmds.push_back(pObject);
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------