gpt4 book ai didi

ios - OpenGL ES 2.0 - 绘制线条(绘图)中的内存管理

转载 作者:行者123 更新时间:2023-11-29 10:58:29 25 4
gpt4 key购买 nike

我终于得到了一些功能代码来画线(在 Xamarin/monotouch 中)

        //init calls
Context = new EAGLContext (EAGLRenderingAPI.OpenGLES2);
DrawableDepthFormat = GLKViewDrawableDepthFormat.Format24;
EAGLContext.SetCurrentContext (Context);

effect = new GLKBaseEffect ();
effect.UseConstantColor = true;
effect.ConstantColor = new Vector4 (1f, 1f, 1f, 1f); //white
GL.ClearColor (0f, 0f, 0f, 1f);//black


public void DrawLine(float[] pts) {
//generate, bind, init
GL.GenBuffers (1, out vertexBuffer);
GL.BindBuffer (BufferTarget.ArrayBuffer, vertexBuffer);
GL.BufferData (BufferTarget.ArrayBuffer, (IntPtr) (pts.Length * sizeof (float)), pts, BufferUsage.DynamicDraw);

// RENDER //
effect.PrepareToDraw ();
//describe what's going to happen
GL.EnableVertexAttribArray ((int) GLKVertexAttrib.Position);
GL.VertexAttribPointer ((int) GLKVertexAttrib.Position, 2, VertexAttribPointerType.Float, false, sizeof(float) * 2, 0);
GL.DrawArrays (BeginMode.LineStrip, 0, pts.Length/2);
}

我有几个问题。

  1. 这种画线的方法是否最优?是否有任何改进建议(即抗锯齿等)

        GL.Clear (ClearBufferMask.ColorBufferBit);
    effect.ConstantColor = new Vector4 (1f, 1f, 1f, 1f);
    DrawLine (line);
    effect.ConstantColor = new Vector4 (1f, 0f, 1f, 1f);
    DrawLine (line2);
  2. 当我调用 GL.Clear() 时,与该行关联的所有内存是否都消失了?即我是否必须进行任何内存清理,或者我是否可以继续调用 GL.Clear() 然后调用 DrawLine() 而不必担心内存管理?

  3. 我打算将这些函数用于绘图。如果基础数据发生变化(但我有相同数量的行,是否有我可以调用的函数子集以更有效地更新行?

最佳答案

GL.GenBuffers (1, out vertexBuffer) 在 GPU 上创建一个缓冲区,并且必须在使用后删除。在大多数情况下,您创建缓冲区以将数据推送到 GPU,该缓冲区不会经常更新并用于多次绘制这些数据。虽然可能有一个标志来流式传输数据(而不是 DynamicDraw)以进行持续更新。您可以使用它来重用相同的缓冲区,但最好直接从 CPU 推送数据指针:丢失与缓冲区有关的所有 3 行并将 pts 插入 VertexAttribPointer 而不是最后一个参数的 0。

您说您将使用它来绘制图形。如果图形数据不会在每一帧都被修改,并且您可以计算所有您仍然可能希望从缓冲区中受益的点。与其尝试将每一行推送到它自己的缓冲区,不如尝试将所有行推送到一个缓冲区(甚至轴也可以在那里)。使用 GL.DrawArrays (BeginMode.LineStrip, 0, pts.Length/2) 绘制特定的线,因为最后 2 个参数控制当前缓冲区中要绘制的范围(要绘制第 5 行,您只需要写 GL.DrawArrays(BeginMode.LineStrip, 5*2, 2))。那么图表数据应该何时更新;删除当前缓冲区,创建新缓冲区,将数据推送到缓冲区,绑定(bind)缓冲区,设置顶点指针,然后继续调用 draw 方法。

GLClear 与内存清理完全无关。它只会清除(设置值)附加到帧缓冲区的缓冲区,在您的情况下,它将渲染缓冲区中的所有像素设置为您在 ClearColor 中设置的颜色。而已。其他常见情况还包括清除深度缓冲区、模板缓冲区...

至于所有的优化和抗锯齿这一切都取决于你在做什么,没有通用的答案。不过,如果您的场景变得过于前卫,请尝试四处搜索多重采样。

关于ios - OpenGL ES 2.0 - 绘制线条(绘图)中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17160314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com