我遵循了可以显示旋转块的 SharpGL 教程。最初,这仅在其上绘制了默认颜色gl.Color(r, g, b)
。成功后,我尝试使用 uv 贴图对立方体进行纹理处理。
当我全屏运行应用程序时,只为立方体着色(sharpGL 组件覆盖应用程序的整个内部),我得到 70~80 fps 仅用于显示彩色立方体。当我启用OpenGL.GL_TEXTURE_2D
并在单个立方体上绘制纹理时,我得到 8~9 fps。
每当加载位图以用作纹理时,它都会存储在内存中。这种帧率下降仅在我启用OpenGL.GL_TEXTURE_2D
并调用gl.TexCoord(c1, c2)
所有坐标后发生。实际上移动对象gl.Rotate(angle, x, y, z)
并不会显着影响性能。
为该方法提供的数据包括GetBlockUv
和CubeCoordinates
是静态浮点数组。
SharpGL 是否应该表现不佳(即显示单个立方体)还是有其他原因?我做错了什么会影响性能吗?应用纹理应该会影响这样的性能吗?
主要抽奖事件发生在一个块中:
public void DrawBlock(object sender, OpenGLEventArgs args)
{
// Get the OpenGL instance that's been passed to us.
OpenGL gl = args.OpenGL;
// Reset the modelview.
gl.LoadIdentity();
// Move the block to its location
gl.Translate(Coord.X, Coord.Y, Coord.Z);
gl.Rotate(angle, 1.0f, 1.0f, 0.5f);
angle += 3;
// retrieve the right texture for this block and bind it.
Texture blockTex = BlockTexture.GetBlockTexture(gl, _type);
blockTex.Bind(gl);
// retrieve the uv map for this block
float[] uv = BlockTexture.GetBlockUv(_type);
// retrieve the coordinates for a cube
float[] cube = CubeCoordinates();
gl.Enable(OpenGL.GL_TEXTURE_2D);
// Draw the cube with the bound texture.
gl.Begin(OpenGL.GL_QUADS);
//
//
// Begin by allowing all colors.
gl.Color(1.0f, 1.0f, 1.0f);
// since the uv index increments with 2 each time, we will be keeping track of this separately.
int uvInd = 0;
// i denotes the current coordinate. Each coordinate consists of 3
// values (x, y, z), thus letting us skip 3.
//
// Seeing as we are creating quads, it is expected that cube.Length
// is 3 * 4 * N (where n is a whole number)
for (int i = 0; i < cube.Length; i += 3)
{
// color experiment
//if (i < cube.Length / 3)
//{
// gl.Color(1.0f, 0.00f, 0.00f);
//}
//else if (i < 2 * (cube.Length / 3))
//{
// gl.Color(0.0f, 1.0f, 0.0f);
//}
//else
//{
// gl.Color(0.0f, 0.0f, 1.0f);
//}
try
{
// set the coordinate for the texture
gl.TexCoord(uv[uvInd], uv[uvInd + 1]);
// set the vertex
gl.Vertex(cube[i], cube[i + 1], cube[i + 2]);
}
catch (IndexOutOfRangeException e)
{
throw new IndexOutOfRangeException(
"This exception is thrown because the cube map and uv map do not match size");
}
// increment the uv index
uvInd += 2;
}
gl.End();
gl.Disable(OpenGL.GL_TEXTURE_2D);
}
OpenGL 在别处初始化
private void OpenGLControl_OpenGLDraw(object sender, OpenGLEventArgs args)
{
// Get the OpenGL instance that's been passed to us.
OpenGL gl = args.OpenGL;
// Clear the color and depth buffers.
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
// call the draw method of the GameRunner if the
// GameRunner has already been created.
game?.DrawOpenGL(sender, args);
// Flush OpenGL.
gl.Flush();
}
private void OpenGLControl_OpenGLInitialized(object sender, OpenGLEventArgs args)
{
// Enable the OpenGL depth testing functionality.
args.OpenGL.Enable(OpenGL.GL_DEPTH_TEST);
}
中间人GameRunner
现在所做的就是调用DrawBlock
例程。
我主要想知道的是对我可以期待的 openGL / sharpGL 的性能以及是否有更好的替代品的一些见解。我想继续使用围绕游戏的 WPF 架构,但如果 WPF 中的 openGL 更多地是一种噱头,那可能不是最好的做法。