2015-06-28 22 views
2

我一直在尝试在openTK(在C#中)的屏幕上绘制一个计时器,并且为此我一直在生成新纹理并删除旧纹理,但我的程序仍然占用内存,直到它崩溃,因为没有足够的空间存放另一个位图。如何避免在openTK中使用动态文本耗尽内存

这里是我在做什么:

 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纹理中释放内存后,我不需要它们,所以我产生大量的图像,但我不知道如何解决这个问题。

回答

1

为那些寻找此,有两个重要的部分:在这两个位图和图形

调用Dispose()对象

手动垃圾回收。

每秒制作60张大图像对于自动垃圾收集来说显然有点多,所以我打电话给垃圾收集一次,并且它非常棒!