HPC.ru lite - Все форумы
Форум: Программирование для КПК
Тема: C#, что происходит с памятью?
Страницы: [1] 2

[Ответить]
SergeyDV [03.10.2006 10:49] C#, что происходит с памятью?:
Начал изучать С# для Windows Mobile.
Написал небольшую программку. На экране выводится изображение местности размером 7х7 квадратов (32х32 пикселя каждый), состояшее из двух типов: трава (можно ходить) и деревья (нельзя ходить). Затем рисуется герой поверх карты. Кликая на ближайшие клетки к герою, если трава герой перемещается, если деревья то остается на месте. Кнопками на кпк (вверх, вниз, влево, вправо) можно передвигать карту. Для ускорения вывода графики на экран сначало все рисуется на созданом Image, а потом этот образ переносится на экран.
Все работает.... Но вот в чем загвоздка. Если запускать на КПК или в эмуляторе, то после 2-3 минут блуждания героем по карте память кпк забивается до предела. Выводится ошибка о недостачи памяти и программа закрывается. После закрытия программы память остается заполненной. Лечится только софт ресетом. Если закрыть программу до вывода ошибки, память также не очищается.

В литературе по С# написано, что он сам соберает за собой весь мусор. Тут все наоборот. Почему так происходит?


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

namespace p3
{
public partial class Form1 : Form
{
static Image iWork = new Bitmap(240, 320);
static Graphics g = Graphics.FromImage(iWork);

Graphics gView;

// Масив с картой: 0-трава (ходить можно), 1-деревья (ходить нельзя)
// 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
int[,] map = {{0,0,0,1,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0},
{0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
{0,1,1,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1},
{1,1,0,0,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1},
{0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0},
{1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1},
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,1},
{0,0,0,1,1,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0},
{0,1,1,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1},
{0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1},
{1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,0,0,1},
{0,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1},
{1,0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0},
{1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,1,1},
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

// координаты верхнего левого угла отображаемой карты
int vx, vy = 0;
// координаты Героя
int hx, hy = 0;
// прямоугольник для вывода карты
Rectangle scrR = new Rectangle(0, 0, 224, 224);

Rectangle rect = new Rectangle(220, 1, 19, 19);
Pen p = new Pen(Color.Black);
Point pp;
Color lowerColor = Color.FromArgb(255, 0, 255);
Color upperColor = Color.FromArgb(255, 0, 255);
ImageAttributes imAtt = new ImageAttributes();
Rectangle hRect = new Rectangle(0, 0, 32, 32);

public Form1()
{
InitializeComponent();
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
pp.X = e.X; pp.Y = e.Y;
rect.X = 220; rect.Y = 1; rect.Width = 19; rect.Height = 19;

if (rect.Contains(pp))
this.Close();
//Application.Exit();

// Герой идет вправо
rect.X = ((hx - vx) * 32) + 32; rect.Y = (hy - vy) * 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy, hx + 1] != 1))
hx++;

// Герой идет влево
rect.X = ((hx - vx) * 32) - 32; rect.Y = (hy - vy) * 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy, hx - 1] != 1))
hx--;

// Герой идет вниз
rect.X = (hx - vx) * 32; rect.Y = ((hy - vy) * 32) + 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy + 1, hx] != 1))
hy++;

// Герой идет вверх
rect.X = (hx - vx) * 32; rect.Y = ((hy - vy) * 32) - 32; rect.Width = 32; rect.Height = 32;
if ((rect.Contains(pp)) && (scrR.Contains(pp)) && (map[hy - 1, hx] != 1))
hy--;

DrawBG();
DrawBotton();
DrawHero();
Flip();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
gView = CreateGraphics();

DrawBG();
DrawBotton();
DrawHero();
Flip();
}

// Нарисовать героя
private void DrawHero()
{
if ((hx >= vx) && (hx < vx + 7) && (hy >= vy) && (hy < vy + 7))
{
imAtt.SetColorKey(lowerColor, upperColor);
hRect.X = (hx - vx) * 32; hRect.Y = (hy - vy) * 32; hRect.Width = 32; hRect.Height = 32;
g.DrawImage(imageList1.Images[2], hRect, 0, 0, 32, 32, GraphicsUnit.Pixel, imAtt);
}
}

// Нарисовать поверхность земли
private void DrawBG()
{
g.Clear(Color.White);
for (int x = 0; x < 7; x++)
for (int y = 0; y < 7; y++)
if (map[y + vy, x + vx] == 1)
g.DrawImage(imageList1.Images[1], x * 32, y * 32);
else if (map[y + vy, x + vx] == 0)
g.DrawImage(imageList1.Images[0], x * 32, y * 32);
}

private void DrawBotton()
{
p.Width = 2;

rect.X = 223; rect.Y = 1; rect.Width = 16; rect.Height = 16;
g.DrawRectangle(p, rect);
g.DrawLine(p, 225, 3, 236, 14);
g.DrawLine(p, 236, 3, 225, 14);

}

public void Flip()
{
gView.DrawImage(iWork, 0, 0);
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == System.Windows.Forms.Keys.Up))
{
// Rocker Up
// Up
if (vy > 0)
vy--;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Down))
{
// Rocker Down
// Down
if (vy < 13)
vy++;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Left))
{
// Left
if (vx > 0)
vx--;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Right))
{
// Right
if (vx < 13)
vx++;
}
if ((e.KeyCode == System.Windows.Forms.Keys.Enter))
{
// Enter
}
DrawBG();
DrawBotton();
DrawHero();
Flip();
}

}
}

admin_vlad2 [28.10.2006 09:11] :
У меня есть знакомый пишущий игры под мобильники. Если хочешь я тебе дам его ICQ. Может он расскажет как освобождать heap. У тебя тайтлы каждый раз заново прорисовываются?

А у меня другая проблема - не знаю как реализовать БД для хранения слов - пишу англо-русский словарь для Pocket PC на Visual Studio 2005 C++
Не знаешь?

Стучись в асю 196753822
igorekk [31.10.2006 12:57] :
Попробуй погуглить на тему "sqlite + pocket pc". Вроде бы были какие-то проекты на сей счёт.
admin_vlad2 [31.10.2006 13:54] :
Нашел Mobile SQL server от Microsoft
igorekk [31.10.2006 13:57] :
А это не из пушки по воробьям ли? И как распространять приложение в данном случае?
bazifit [01.11.2006 12:14] :
Начал изучать С# для Windows Mobile.
Написал небольшую программку

Скажи пожалуйста где найти ресурсы с литературой по программированию С#, хочю попробовать.
admin_vlad2 [03.11.2006 10:13] :
У меня книга есть.
А ты можешь открыть файл в C#?
Пиши на t1741995@yandex.ru или в асю 196-753-822
admin_vlad2 [03.11.2006 10:24] :
Логично. Я думал в инсталляторе задать, устаноку SQL server'a, и заливку базы данных. Но это гемор.

А какой строкой коннектится к *.mdb в Visual C++ в приложении для Pocket PC? Так?:

"Driver={Microsoft Access Driver (*.mdb)};Dbq=\Mini-SD\mydatabase.mdb;Uid=Admin;Pwd=;"

Ссылка: http://www.connectionstrings.com/
SergeyDV [07.12.2006 13:23] :
Давно я тут небыл....

Я отказался от System.Drawing, сейчас пытаю GapiDrawNet.
Отличная штукенция!!!
Графика выводится очень быстро, память не засирает. ВесчЬ!

Но он платный Даже и незнаю что делать, лишних 600 позеленевших президентов нету.... Может есть у кого лекарство от жадности.
admin_vlad2 [08.12.2006 09:05] :
Нет.
А на сайтах с крэками искал?

Ты случаем не знаешь, как в Visual C++ 2005 (проект для Pocket PC +MFC) открыть и считать .mdb?
У меня из за этого остановилось написание словаря
[Ответить]
[Вперед >]