我一直试图在openTK(在c#中)在屏幕上绘制一个计时器,为此我一直在生成新纹理并删除旧纹理,但我的程序仍然占用内存,直到它崩溃,因为没有足够的空间用于另一个位图。
这就是我正在做的事情:
text_bmp = new Bitmap(width, height);
text_bmp_gfx = Graphics.FromImage(text_bmp);
text_bmp_gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
text_bmp_gfx.Clear(Color.Transparent);
text_bmp_gfx.DrawString(music.getCurrentTime(), new Font("Exo 2", 12), drawBrush, new PointF(0.0F, 0.0F));
text_bmp_gfx.DrawString(timer.Elapsed.ToString(), new Font("Exo 2", 12), drawBrush, new PointF(0.0F, 18.0F));
GL.DeleteTexture(TextTexture);
TextTexture = ContentPipe.LoadTextureFromBitmap(text_bmp);
GL.BindTexture(TextureTarget.Texture2D, TextTexture);
其中内容pipe.loadtexturefrombitmap是此函数:
public static int LoadTextureFromBitmap(Bitmap bmp)
{
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
bmp.UnlockBits(data);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Clamp);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Clamp);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
bmp = null;
return id;
}
说实话,第二部分是从youtube教程中复制的,所以我不确定它是如何工作的。
我认为问题在于,在我不需要它之后,我没有正确地从openTK纹理中释放内存,因此我生成了大量的图像,但我不知道。知道如何解决这个问题。
答案 0 :(得分:1)
对于那些发现这一点的人来说,有两个重要的部分:
在位图和图形对象上调用dispose()
手动垃圾收集。
每秒制作60张大图像对于自动垃圾收集来说显然有点多,所以我称之为框架垃圾收集并且效果很好!