2015-06-28 2 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 больших изображений в секунду немного для автоматической сборки мусора, по-видимому, поэтому я называю сбор мусора после кадра, и он отлично работает!

Смежные вопросы