我有一个方法,我用它来渲染使用瓷砖的小地图,但是当我完成渲染并且我想要改变翻译时," transY"变量使用不同的方法没有任何反应,所以我必须再次调用RenderTesture()来实现它。我怎么能做这个没有不必要的渲染,因为当我使用更多的瓷砖时它会减慢应用程序的速度?
void RenderTexture ()
{
MakeCurrent ();
GL.Clear((int)All.ColorBufferBit | (int)All.DepthBufferBit);
GL.MatrixMode(All.Modelview);
GL.LoadIdentity();
GL.Translate(-transX, transY, -10);
for (int i = 0; i < tileRows; i++)
{
for (int j = 0; j < tileColumns; j++)
{
GL.BindTexture(All.Texture2D, textureIds [i*tileColumns + j]);
GL.EnableClientState(All.VertexArray);
GL.EnableClientState(All.TextureCoordArray);
GL.PushMatrix ();
GL.Translate(j*2, -i*2, 0);
GL.VertexPointer(3, All.Float, 0, frontV);
GL.TexCoordPointer(2, All.Float, 0, frontT);
GL.DrawArrays (All.TriangleFan, 0, 4);
GL.PopMatrix ();
}
}
GL.DisableClientState(All.VertexArray);
GL.DisableClientState(All.TextureCoordArray);
SwapBuffers ();
}
如果有人为我提供建议,我将非常感激!
提前致谢!
答案 0 :(得分:0)
瓶颈最有可能在于状态变化量(GL.BindTexture
)和您正在进行的绘制调用量(GL.DrawArrays
)。通常,您应该在一次绘制调用中尽可能多地绘制。
最简单的方法是使用“纹理图集”:
GL.BindTexture
一次绑定纹理图集GL.DrawArrays
一次以渲染所有图块那你如何渲染不同的瓷砖纹理?简单:您将顶点纹理坐标更改为指向纹理图集内的正确图块。
单个1024x1024可以容纳256个不同的64x64磁贴。根据游戏中不同图块的数量,您可能必须使用多个纹理图集。此外,根据地图的大小,您可能希望将其拆分为“区域”,每个区域都有不同的顶点数组(如果您的显示器只能显示1000个图块,则不希望每帧渲染100万个图块。)< / p>
就其本身而言,这将带来可衡量的性能提升。一旦这个工作,你可以通过顶点缓冲对象(VBO)将顶点数组存储在GPU上来获得第二次大的提升。
答案 1 :(得分:0)
非常感谢!
“纹理图集”策略可能是非常好的主意。昨晚我实现了它,看起来渲染速度越来越快。我使用单独的纹理减少NxM图块的加载,通过使用单个纹理加载一个大的NxM图块位图,我实现了更改顶点数组的方法(关于新的位图尺寸 - NxM)
public void UpdateFrontVertex(int rowNumber, int columnsNumber)
{
for (int i = 0; i < 12; i++) {
if (i % 3 == 0)
frontVertex [i] = defaultFrontVertex[i] * rowNumber; // x-axis
else if (i % 3 == 1)
frontVertex [i] = defaultFrontVertex[i] * columnsNumber; // y-axis
else if (i % 3 == 2)
frontVertex [i] = defaultFrontVertex[i]; // z-axis
}
}
之后,我有了我的地图!!!
我仍然无法在实现之前比较性能,现在因为我必须对平移和缩放功能进行更改才能使用新的渲染策略。 例如,我用过
//zoom in
transY = (transY * 2 + 1);
transX = (transX * 2 + 1);
//zoom out
transX = ((transX - 1) / 2);
transY = ((transY - 1) / 2);
用于缩放计算,以确定哪个图块是我的中心图块,然后加载所有舍入图块。
再次感谢您的大力帮助,我现在将继续进行平移和缩放实施。