Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 26.10.2009, 22:55   #1
Coks
Знающий
 
Регистрация: 29.05.2007
Сообщений: 227
Написано 126 полезных сообщений
(для 312 пользователей)
утечка памяти!?

Функции GetSurfaceBrush() и GetBrushTexture() вызывают утечку памяти. При их вжопокодивании используемая приложением память начинает расти по 4-8 кб в сек. =)

вот код для тестов (кликаем один раз - память увеличивается, второй - все ок):

Graphics3D 640,480,0,2 
SetBuffer BackBuffer() 

camera=CreateCamera() 
PositionEntity camera,0,2,-10 

cube=CreateCube() 
EntityPickMode cube,2

b=CreateBrush()

LinePick(0,10,0,0,-100,0)	
s=PickedSurface()

While Not KeyDown( 1 ) 

If MouseHit(1)=True Then If test=0 Then test=1 Else test=0

If test=1
 GetSurfaceBrush(s)
 GetBrushTexture(b)	
EndIf

RenderWorld 

Text 10,200,"test= "+test 

Flip 

Wend 
End 
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 07:55   #2
Alex.D.
Оператор ЭВМ
 
Регистрация: 02.11.2008
Сообщений: 27
Написано 12 полезных сообщений
(для 24 пользователей)
Ответ: утечка памяти!?

Эти функции делают копию браша\текстуры с оригинального, ибо возвращаемый адрес каждый раз новый, ну и это подтверждает быдлокод из b3dsdk:
Brush *bbGetSurfaceBrush( Surface *s ){
	Brush *br=d_new Brush( s->getBrush() );
	brush_set.insert( br );
	return br;
}

Texture *bbGetBrushTexture( Brush *b,int index ){
	debugBrush(b);
	Texture *tex=d_new Texture(b->getTexture(index));
	texture_set.insert( tex );
	return tex;
}
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 12:35   #3
MixailV
Оператор ЭВМ
 
Регистрация: 14.06.2007
Сообщений: 20
Написано 8 полезных сообщений
(для 29 пользователей)
Re: утечка памяти!?

Да, так оно и работало всегда. И это правильный подход, защита "от дурака", если он задумает удалить текстуру или браш, уже использующийся на какой либо 3Д модели.
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 13:05   #4
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: утечка памяти!?

Alex.D., от куда этот код ??
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 13:12   #5
Alex.D.
Оператор ЭВМ
 
Регистрация: 02.11.2008
Сообщений: 27
Написано 12 полезных сообщений
(для 24 пользователей)
Ответ: утечка памяти!?

И это правильный подход, защита "от дурака", если он задумает удалить текстуру или браш, уже использующийся на какой либо 3Д модели.
Это называется "из огня да в полымя". Два раза вызвал функцию (можт в двух разных местах или еще как) и схватил утечку памяти. А для решения такой ситуации обычно вводят счетчик ссылок, и удаляют только когда текстура\что-то еще действительно ничем не используется.
Alex.D., от куда этот код ??
Утекшая бета Blitz3D SDK, кажется на рл-тим.нэт есть.
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 13:19   #6
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: утечка памяти!?

в смысле "утекшая" ??
я там качал Blitz3D SDK, но у меня такого нет !!
вот посмотрел только что, там есть СДК v1.04, v1.0 и SVN Dev !!
(Offline)
 
Ответить с цитированием
Старый 27.10.2009, 13:54   #7
jimon
 
Сообщений: n/a
Ответ: утечка памяти!?

IGR
выложили же исходники Blitz3d SDK, именно этот код находится в bbsdk/bbblitz3d.cpp начиная со строчки 712

Alex.D.
никто их не тырил, сам автор их выложил
http://www.blitzbasic.com/Community/...hp?topic=82502
 
Ответить с цитированием
Старый 27.10.2009, 17:32   #8
IGR
Blitz's Shame !!
 
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений
(для 2,013 пользователей)
Ответ: утечка памяти!?

ага, спс, разобрался !!
(Offline)
 
Ответить с цитированием
Старый 28.10.2009, 10:23   #9
MixailV
Оператор ЭВМ
 
Регистрация: 14.06.2007
Сообщений: 20
Написано 8 полезных сообщений
(для 29 пользователей)
Re: Ответ: утечка памяти!?

Сообщение от Alex.D. Посмотреть сообщение
А для решения такой ситуации обычно вводят счетчик ссылок, и удаляют только когда текстура\что-то еще действительно ничем не используется.
Этот механизм тоже присутствует. В общем все функции начинающиеся с приставки Get возвращают новый объект (копию запрашиваемого). Сложно объяснить все причины, почему так сделано, но причины стоят того. Это правило работает не только для SDK, но и для чистого Blitz3D.
(Offline)
 
Ответить с цитированием
Старый 09.01.2010, 21:18   #10
Coks
Знающий
 
Регистрация: 29.05.2007
Сообщений: 227
Написано 126 полезных сообщений
(для 312 пользователей)
Ответ: утечка памяти!?

MixailV, не все. GetSurface возвращает указатель на сюрфейс. Alex.D., а в блиц-справке так и написано, что после использования этих функций удалите полученную копию объекта. Вот тебе и решение утечки!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параноя.Потеря памяти. Stalnoy_Gvozd' 3D-программирование 22 30.10.2007 19:31
Менеджер памяти глючит elmortem 2D-программирование 8 16.09.2007 22:04
Отменный пожиратель памяти c0mrad 2D-программирование 2 03.02.2007 22:37
Запуск Blitz Exe из памяти. Maxus Библиотеки 22 27.11.2006 10:44


Часовой пояс GMT +4, время: 15:06.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com