0

我遵循了可以显示旋转块的 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)并不会显着影响性能。

为该方法提供的数据包括GetBlockUvCubeCoordinates是静态浮点数组。

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 更多地是一种噱头,那可能不是最好的做法。

4

1 回答 1

1

我遇到了完全相同的问题,似乎 SharpGL 或 WPF 控件本身都在使用软件渲染。我通过在设备管理器中禁用我的主显示适配器对此进行了测试,并获得了与启用它时完全相同的性能。

我不知道如何启用硬件加速,所以我实际上不知道如何解决这个问题。

于 2016-12-06T13:47:11.050 回答