ページ 11

[c#]メモリリーク?

Posted: 2015年2月14日(土) 09:56
by cgg-gam
Bitmapを画面に表示するプログラムを書いたのですが、
Image = DX.CreateGraphFromMem(p, buff.Length);
の部分でメモリの使用量が増えてしまします。
何が原因なのでしょうか?

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.MemoryMappedFiles;
using System.IO;

using DxLibDLL;

namespace app
{
    public partial class Form1 : Form
    {
        public Form1()
        {
		    int Image;
            InitializeComponent();

            //dxライブラリ描画先
            DX.SetUserWindow(this.Handle);
            //dxライブラリ初期化
            DX.DxLib_Init();
            // 描画先を裏画面にする
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();
        }

        public void MainLoop()
        {            
            DX.ClsDrawScreen();// 画面に描かれているものを一回全部消す
            this.Draw();
            DX.ScreenFlip();   // 裏画面の内容を表画面に反映させる
        }

        public void FrameReady(...)
        {
	     Bitmap bitmap = e.Bitmap;
            // Bitmapからグラフィックを作成
            using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Bmp);
                byte[] buff = ms.ToArray();
                
                unsafe
                {
                    fixed (byte* p = buff)
                    {
                        DX.SetDrawValidGraphCreateFlag(DX.TRUE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.TRUE);

                        Image = DX.CreateGraphFromMem(p, buff.Length);

                        DX.SetDrawValidGraphCreateFlag(DX.FALSE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.FALSE);
                    }                    
                }
            }
        }

        void Draw(){
            DX.DrawGraph(0, 0, Image, 0);           
        }

    }
}


Re: [c#]メモリリーク?

Posted: 2015年2月14日(土) 10:10
by nullptr
まず「メモリリーク」という言葉の意味を調べて下さい。
そして画像を作ればメモリの使用量が増えるのは不思議なことでしょうか。

Re: [c#]メモリリーク?

Posted: 2015年2月14日(土) 10:47
by cgg-gam
プログラミングにおけるバグの一種。プログラムが確保したメモリの一部、または全部を解放するのを忘れ、確保したままになってしまうことを言う。

使用量が増えるのはあたりまえです。
ただそれをどのように解決するかが問題なのです。

Re: [c#]メモリリーク?

Posted: 2015年2月14日(土) 11:36
by みけCAT
FrameReadyはKinect関連のメソッドでしょうか?
新しい画像を入れる前に前の画像を消してはいかがでしょうか?

コード:

        public void FrameReady(...)
        {
	     Bitmap bitmap = e.Bitmap;
            // Bitmapからグラフィックを作成
            using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Bmp);
                byte[] buff = ms.ToArray();
                
                unsafe
                {
                    fixed (byte* p = buff)
                    {
                        DX.SetDrawValidGraphCreateFlag(DX.TRUE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.TRUE);

                        DX.DeleteGraph(Image); // 無効なハンドルを入れても多分関数が失敗するだけでしょう(適当)
                        Image = DX.CreateGraphFromMem(p, buff.Length);

                        DX.SetDrawValidGraphCreateFlag(DX.FALSE);
                        DX.SetDrawValidAlphaChannelGraphCreateFlag(DX.FALSE);
                    }                    
                }
            }
        }
※テストしていません

Re: [c#]メモリリーク?

Posted: 2015年2月14日(土) 11:43
by cgg-gam
ありがとうございます。
上記のコードで解決しました。