Some graphic batching:

Speed up for displaying debugtext and envelopepreview
(This reduces the performance hit especially for the 'Show Info' mode in the editor)
This commit is contained in:
BeaR 2012-10-14 14:04:48 +02:00 committed by oy
parent e29ced0741
commit 70a648899d
7 changed files with 124 additions and 88 deletions

View file

@ -137,14 +137,16 @@ void CGraph::Render(IGraphics *pGraphics, IGraphics::CTextureHandle FontTexture,
pGraphics->LinesEnd();
pGraphics->TextureSet(FontTexture);
pGraphics->QuadsText(x+2, y+h-16, 16, 1,1,1,1, pDescription);
pGraphics->QuadsBegin();
pGraphics->QuadsText(x+2, y+h-16, 16, pDescription);
char aBuf[32];
str_format(aBuf, sizeof(aBuf), "%.2f", m_Max);
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+2, 16, 1,1,1,1, aBuf);
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+2, 16, aBuf);
str_format(aBuf, sizeof(aBuf), "%.2f", m_Min);
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+h-16, 16, 1,1,1,1, aBuf);
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+h-16, 16, aBuf);
pGraphics->QuadsEnd();
}
@ -669,6 +671,7 @@ void CClient::DebugRender()
//m_pGraphics->BlendNormal();
Graphics()->TextureSet(m_DebugFont);
Graphics()->MapScreen(0,0,Graphics()->ScreenWidth(),Graphics()->ScreenHeight());
Graphics()->QuadsBegin();
if(time_get()-LastSnap > time_freq())
{
@ -690,7 +693,7 @@ void CClient::DebugRender()
mem_stats()->total_allocations,
Graphics()->MemoryUsage()/1024,
(int)(1.0f/FrameTimeAvg + 0.5f));
Graphics()->QuadsText(2, 2, 16, 1,1,1,1, aBuffer);
Graphics()->QuadsText(2, 2, 16, aBuffer);
{
@ -706,7 +709,7 @@ void CClient::DebugRender()
str_format(aBuffer, sizeof(aBuffer), "send: %3d %5d+%4d=%5d (%3d kbps) avg: %5d\nrecv: %3d %5d+%4d=%5d (%3d kbps) avg: %5d",
SendPackets, SendBytes, SendPackets*42, SendTotal, (SendTotal*8)/1024, SendBytes/SendPackets,
RecvPackets, RecvBytes, RecvPackets*42, RecvTotal, (RecvTotal*8)/1024, RecvBytes/RecvPackets);
Graphics()->QuadsText(2, 14, 16, 1,1,1,1, aBuffer);
Graphics()->QuadsText(2, 14, 16, aBuffer);
}
// render rates
@ -719,7 +722,7 @@ void CClient::DebugRender()
{
str_format(aBuffer, sizeof(aBuffer), "%4d %20s: %8d %8d %8d", i, GameClient()->GetItemName(i), m_SnapshotDelta.GetDataRate(i)/8, m_SnapshotDelta.GetDataUpdates(i),
(m_SnapshotDelta.GetDataRate(i)/m_SnapshotDelta.GetDataUpdates(i))/8);
Graphics()->QuadsText(2, 100+y*12, 16, 1,1,1,1, aBuffer);
Graphics()->QuadsText(2, 100+y*12, 16, aBuffer);
y++;
}
}
@ -727,7 +730,8 @@ void CClient::DebugRender()
str_format(aBuffer, sizeof(aBuffer), "pred: %d ms",
(int)((m_PredictedTime.Get(Now)-m_GameTime.Get(Now))*1000/(float)time_freq()));
Graphics()->QuadsText(2, 70, 16, 1,1,1,1, aBuffer);
Graphics()->QuadsText(2, 70, 16, aBuffer);
Graphics()->QuadsEnd();
// render graphs
if(g_Config.m_DbgGraphs)

View file

@ -630,13 +630,10 @@ void CGraphics_Threaded::QuadsDrawFreeform(const CFreeformItem *pArray, int Num)
AddVertices(4*Num);
}
void CGraphics_Threaded::QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText)
void CGraphics_Threaded::QuadsText(float x, float y, float Size, const char *pText)
{
float StartX = x;
QuadsBegin();
SetColor(r,g,b,a);
while(*pText)
{
char c = *pText;
@ -660,8 +657,6 @@ void CGraphics_Threaded::QuadsText(float x, float y, float Size, float r, float
x += Size/2;
}
}
QuadsEnd();
}
int CGraphics_Threaded::IssueInit()

View file

@ -420,7 +420,7 @@ public:
virtual void QuadsDraw(CQuadItem *pArray, int Num);
virtual void QuadsDrawTL(const CQuadItem *pArray, int Num);
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num);
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText);
virtual void QuadsText(float x, float y, float Size, const char *pText);
virtual void Minimize();
virtual void Maximize();

View file

@ -142,7 +142,7 @@ public:
: m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1), m_X2(x2), m_Y2(y2), m_X3(x3), m_Y3(y3) {}
};
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0;
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText) = 0;
virtual void QuadsText(float x, float y, float Size, const char *pText) = 0;
struct CColorVertex
{

View file

@ -1411,96 +1411,131 @@ void CEditor::DoQuadPoint(CQuad *pQuad, int QuadIndex, int V)
Graphics()->QuadsDraw(&QuadItem, 1);
}
void CEditor::DoQuadEnvelopes(CQuad *pQuad, int Index, IGraphics::CTextureHandle Texture)
void CEditor::DoQuadEnvelopes(CQuad *pQuad, int Num, IGraphics::CTextureHandle Texture)
{
CEnvelope *pEnvelope = 0x0;
if(pQuad->m_PosEnv >= 0 && pQuad->m_PosEnv < m_Map.m_lEnvelopes.size())
pEnvelope = m_Map.m_lEnvelopes[pQuad->m_PosEnv];
if (!pEnvelope)
return;
//QuadParams
CPoint *pPoints = pQuad->m_aPoints;
CEnvelope **apEnvelope = new CEnvelope*[Num]();
for(int i = 0; i < Num; i++)
{
if((m_ShowEnvelopePreview == 1 && pQuad[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2)
if(pQuad[i].m_PosEnv >= 0 && pQuad[i].m_PosEnv < m_Map.m_lEnvelopes.size())
apEnvelope[i] = m_Map.m_lEnvelopes[pQuad[i].m_PosEnv];
}
//Draw Lines
Graphics()->TextureClear();
Graphics()->LinesBegin();
Graphics()->SetColor(80.0f/255, 150.0f/255, 230.f/255, 0.5f);
for(int i = 0; i < pEnvelope->m_lPoints.size()-1; i++)
Graphics()->SetColor(80.0f/255, 150.0f/255, 230.f/255, 0.5f);
for(int j = 0; j < Num; j++)
{
if(!apEnvelope[j])
continue;
//QuadParams
CPoint *pPoints = pQuad[j].m_aPoints;
for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++)
{
float OffsetX = fx2f(pEnvelope->m_lPoints[i].m_aValues[0]);
float OffsetY = fx2f(pEnvelope->m_lPoints[i].m_aValues[1]);
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
vec2 Pos0 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
OffsetX = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[0]);
OffsetY = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[1]);
OffsetX = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[0]);
OffsetY = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[1]);
vec2 Pos1 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
IGraphics::CLineItem Line = IGraphics::CLineItem(Pos0.x, Pos0.y, Pos1.x, Pos1.y);
Graphics()->LinesDraw(&Line, 1);
}
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
}
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
Graphics()->LinesEnd();
//Draw Quads
for(int i = 0; i < pEnvelope->m_lPoints.size(); i++)
Graphics()->TextureSet(Texture);
Graphics()->QuadsBegin();
for(int j = 0; j < Num; j++)
{
Graphics()->TextureSet(Texture);
Graphics()->QuadsBegin();
//Calc Env Position
float OffsetX = fx2f(pEnvelope->m_lPoints[i].m_aValues[0]);
float OffsetY = fx2f(pEnvelope->m_lPoints[i].m_aValues[1]);
float Rot = fx2f(pEnvelope->m_lPoints[i].m_aValues[2])/360.0f*pi*2;
if(!apEnvelope[j])
continue;
//Set Colours
float Alpha = (m_SelectedQuadEnvelope == pQuad->m_PosEnv && m_SelectedEnvelopePoint == i) ? 0.65f : 0.35f;
IGraphics::CColorVertex aArray[4] = {
IGraphics::CColorVertex(0, pQuad->m_aColors[0].r, pQuad->m_aColors[0].g, pQuad->m_aColors[0].b, Alpha),
IGraphics::CColorVertex(1, pQuad->m_aColors[1].r, pQuad->m_aColors[1].g, pQuad->m_aColors[1].b, Alpha),
IGraphics::CColorVertex(2, pQuad->m_aColors[2].r, pQuad->m_aColors[2].g, pQuad->m_aColors[2].b, Alpha),
IGraphics::CColorVertex(3, pQuad->m_aColors[3].r, pQuad->m_aColors[3].g, pQuad->m_aColors[3].b, Alpha)};
Graphics()->SetColorVertex(aArray, 4);
//QuadParams
CPoint *pPoints = pQuad[j].m_aPoints;
//Rotation
if(Rot != 0)
for(int i = 0; i < apEnvelope[j]->m_lPoints.size(); i++)
{
static CPoint aRotated[4];
aRotated[0] = pQuad->m_aPoints[0];
aRotated[1] = pQuad->m_aPoints[1];
aRotated[2] = pQuad->m_aPoints[2];
aRotated[3] = pQuad->m_aPoints[3];
pPoints = aRotated;
//Calc Env Position
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
float Rot = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[2])/360.0f*pi*2;
Rotate(&pQuad->m_aPoints[4], &aRotated[0], Rot);
Rotate(&pQuad->m_aPoints[4], &aRotated[1], Rot);
Rotate(&pQuad->m_aPoints[4], &aRotated[2], Rot);
Rotate(&pQuad->m_aPoints[4], &aRotated[3], Rot);
//Set Colours
float Alpha = (m_SelectedQuadEnvelope == pQuad[j].m_PosEnv && m_SelectedEnvelopePoint == i) ? 0.65f : 0.35f;
IGraphics::CColorVertex aArray[4] = {
IGraphics::CColorVertex(0, pQuad[j].m_aColors[0].r, pQuad[j].m_aColors[0].g, pQuad[j].m_aColors[0].b, Alpha),
IGraphics::CColorVertex(1, pQuad[j].m_aColors[1].r, pQuad[j].m_aColors[1].g, pQuad[j].m_aColors[1].b, Alpha),
IGraphics::CColorVertex(2, pQuad[j].m_aColors[2].r, pQuad[j].m_aColors[2].g, pQuad[j].m_aColors[2].b, Alpha),
IGraphics::CColorVertex(3, pQuad[j].m_aColors[3].r, pQuad[j].m_aColors[3].g, pQuad[j].m_aColors[3].b, Alpha)};
Graphics()->SetColorVertex(aArray, 4);
//Rotation
if(Rot != 0)
{
static CPoint aRotated[4];
aRotated[0] = pQuad[j].m_aPoints[0];
aRotated[1] = pQuad[j].m_aPoints[1];
aRotated[2] = pQuad[j].m_aPoints[2];
aRotated[3] = pQuad[j].m_aPoints[3];
pPoints = aRotated;
Rotate(&pQuad[j].m_aPoints[4], &aRotated[0], Rot);
Rotate(&pQuad[j].m_aPoints[4], &aRotated[1], Rot);
Rotate(&pQuad[j].m_aPoints[4], &aRotated[2], Rot);
Rotate(&pQuad[j].m_aPoints[4], &aRotated[3], Rot);
}
//Set Texture Coords
Graphics()->QuadsSetSubsetFree(
fx2f(pQuad[j].m_aTexcoords[0].x), fx2f(pQuad[j].m_aTexcoords[0].y),
fx2f(pQuad[j].m_aTexcoords[1].x), fx2f(pQuad[j].m_aTexcoords[1].y),
fx2f(pQuad[j].m_aTexcoords[2].x), fx2f(pQuad[j].m_aTexcoords[2].y),
fx2f(pQuad[j].m_aTexcoords[3].x), fx2f(pQuad[j].m_aTexcoords[3].y)
);
//Set Quad Coords & Draw
IGraphics::CFreeformItem Freeform(
fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY,
fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY,
fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY,
fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
}
//Set Texture Coords
Graphics()->QuadsSetSubsetFree(
fx2f(pQuad->m_aTexcoords[0].x), fx2f(pQuad->m_aTexcoords[0].y),
fx2f(pQuad->m_aTexcoords[1].x), fx2f(pQuad->m_aTexcoords[1].y),
fx2f(pQuad->m_aTexcoords[2].x), fx2f(pQuad->m_aTexcoords[2].y),
fx2f(pQuad->m_aTexcoords[3].x), fx2f(pQuad->m_aTexcoords[3].y)
);
//Set Quad Coords & Draw
IGraphics::CFreeformItem Freeform(
fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY,
fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY,
fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY,
fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY);
Graphics()->QuadsDrawFreeform(&Freeform, 1);
Graphics()->QuadsEnd();
Graphics()->TextureClear();
Graphics()->QuadsBegin();
DoQuadEnvPoint(pQuad, Index, i);
Graphics()->QuadsEnd();
}
Graphics()->QuadsEnd();
Graphics()->TextureClear();
Graphics()->QuadsBegin();
// Draw QuadPoints
for(int j = 0; j < Num; j++)
{
if(!apEnvelope[j])
continue;
//QuadParams
CPoint *pPoints = pQuad[j].m_aPoints;
for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++)
{
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
vec2 Pos0 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
OffsetX = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[0]);
OffsetY = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[1]);
vec2 Pos1 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
DoQuadEnvPoint(&pQuad[j], j, i);
}
}
Graphics()->QuadsEnd();
}
void CEditor::DoQuadEnvPoint(CQuad *pQuad, int QIndex, int PIndex)
@ -2096,12 +2131,12 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar)
if(pLayer->m_Image >= 0 && pLayer->m_Image < m_Map.m_lImages.size())
Texture = m_Map.m_lImages[pLayer->m_Image]->m_Texture;
for(int i = 0; i < pLayer->m_lQuads.size(); i++)
/*for(int i = 0; i < pLayer->m_lQuads.size(); i++)
{
if((m_ShowEnvelopePreview == 1 && pLayer->m_lQuads[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2)
DoQuadEnvelopes(&pLayer->m_lQuads[i], i, Texture);
}
}*/
DoQuadEnvelopes(&pLayer->m_lQuads[0], pLayer->m_lQuads.size(), Texture);
m_ShowEnvelopePreview = 0;
}

View file

@ -755,7 +755,7 @@ public:
vec4 ButtonColorMul(const void *pID);
void DoQuadEnvelopes(CQuad *pQuad, int Index, IGraphics::CTextureHandle Texture = IGraphics::CTextureHandle());
void DoQuadEnvelopes(CQuad *pQuad, int Num, IGraphics::CTextureHandle Texture = IGraphics::CTextureHandle());
void DoQuadEnvPoint(CQuad *pQuad, int QIndex, int pIndex);
void DoQuadPoint(CQuad *pQuad, int QuadIndex, int v);

View file

@ -337,6 +337,7 @@ void CLayerTiles::ShowInfo()
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
Graphics()->TextureSet(m_pEditor->Client()->GetDebugFont());
Graphics()->QuadsBegin();
int StartY = max(0, (int)(ScreenY0/32.0f)-1);
int StartX = max(0, (int)(ScreenX0/32.0f)-1);
@ -351,17 +352,18 @@ void CLayerTiles::ShowInfo()
{
char aBuf[64];
str_format(aBuf, sizeof(aBuf), "%i", m_pTiles[c].m_Index);
m_pEditor->Graphics()->QuadsText(x*32, y*32, 16.0f, 1,1,1,1, aBuf);
m_pEditor->Graphics()->QuadsText(x*32, y*32, 16.0f, aBuf);
char aFlags[4] = { m_pTiles[c].m_Flags&TILEFLAG_VFLIP ? 'V' : ' ',
m_pTiles[c].m_Flags&TILEFLAG_HFLIP ? 'H' : ' ',
m_pTiles[c].m_Flags&TILEFLAG_ROTATE? 'R' : ' ',
0};
m_pEditor->Graphics()->QuadsText(x*32, y*32+16, 16.0f, 1,1,1,1, aFlags);
m_pEditor->Graphics()->QuadsText(x*32, y*32+16, 16.0f, aFlags);
}
x += m_pTiles[c].m_Skip;
}
Graphics()->QuadsEnd();
Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1);
}