forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   утечка памяти!? (http://forum.boolean.name/showthread.php?t=9650)

Coks 26.10.2009 22:55

утечка памяти!?
 
Функции 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


Alex.D. 27.10.2009 07:55

Ответ: утечка памяти!?
 
Эти функции делают копию браша\текстуры с оригинального, ибо возвращаемый адрес каждый раз новый, ну и это подтверждает быдлокод из 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;
}


MixailV 27.10.2009 12:35

Re: утечка памяти!?
 
Да, так оно и работало всегда. И это правильный подход, защита "от дурака", если он задумает удалить текстуру или браш, уже использующийся на какой либо 3Д модели.

IGR 27.10.2009 13:05

Ответ: утечка памяти!?
 
Alex.D., от куда этот код ??

Alex.D. 27.10.2009 13:12

Ответ: утечка памяти!?
 
Цитата:

И это правильный подход, защита "от дурака", если он задумает удалить текстуру или браш, уже использующийся на какой либо 3Д модели.
Это называется "из огня да в полымя". Два раза вызвал функцию (можт в двух разных местах или еще как) и схватил утечку памяти. А для решения такой ситуации обычно вводят счетчик ссылок, и удаляют только когда текстура\что-то еще действительно ничем не используется.
Цитата:

Alex.D., от куда этот код ??
Утекшая бета Blitz3D SDK, кажется на рл-тим.нэт есть.

IGR 27.10.2009 13:19

Ответ: утечка памяти!?
 
в смысле "утекшая" ??
я там качал Blitz3D SDK, но у меня такого нет !! :(
вот посмотрел только что, там есть СДК v1.04, v1.0 и SVN Dev !!

jimon 27.10.2009 13:54

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

Alex.D.
никто их не тырил, сам автор их выложил
http://www.blitzbasic.com/Community/...hp?topic=82502

IGR 27.10.2009 17:32

Ответ: утечка памяти!?
 
ага, спс, разобрался !! :)

MixailV 28.10.2009 10:23

Re: Ответ: утечка памяти!?
 
Цитата:

Сообщение от Alex.D. (Сообщение 122652)
А для решения такой ситуации обычно вводят счетчик ссылок, и удаляют только когда текстура\что-то еще действительно ничем не используется.

Этот механизм тоже присутствует. В общем все функции начинающиеся с приставки Get возвращают новый объект (копию запрашиваемого). Сложно объяснить все причины, почему так сделано, но причины стоят того. Это правило работает не только для SDK, но и для чистого Blitz3D.

Coks 09.01.2010 21:18

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot