Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Peto
Založen: 01. 08. 2007 Příspěvky: 206 Bydliště: Košice
|
Zaslal: 24. září 2014, 10:15:36 Předmět: |
|
|
Ach jaj s takymi memory leakmi si clovek uzije.
Mozes pouzit brute force, pokial vies "merat" ci memory leak tam este je.. skusit normalne postupne vypinat vsetko, zakomentovat, az ti ostatne prazdna slucka ako hello world.. samozrejme budes dufat ze ta to az tam neprinuti prist, a ze tu vec co to sposobuje nevypnes ako poslednu
V C++ sa to da aj elegatnejsie cez pretazenie operatorov, ale vo Visual Basicu neviem.. mozno pouzit DirectX control panel, niekedy to zvykne ukazat leaky (ak ho teda nepouzivas uz)
V tom bode 2. by som skontroloval hlavne rendering do textury a porovnal so samplami, podla mna mozno len nejaky preklep ze nereleasujes nejaky surface do ktoreho renderujes, i ked to je Managed DirectX, nevyznam sa v tom ale podla mna ->Release() zavolat treba ci nie? ... i ked taka chyba by mala mat podstatne vacsie naroky na pamat... _________________ Code or die!
|
|
Návrat nahoru |
|
|
MiroJ
Založen: 21. 02. 2008 Příspěvky: 229
|
Zaslal: 24. září 2014, 10:25:00 Předmět: |
|
|
Ahoj, prave postupujem podla bodu c.1 Uvidim ci to odhalim. |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 765 Bydliště: Brandýs nad Labem
|
Zaslal: 24. září 2014, 10:53:14 Předmět: |
|
|
MiroJ> asi uz jsi to nasel, ale pokud ne, tohle by mohlo pomoct: http://stackoverflow.com/questions/2957105/how-can-you-explore-the-managed-heap-in-a-net-application-to-identify-possible
Jinak problem by mohl byt v tom, ze surface (textury) jsou v .net heapu pravdepodobne jen malinke objekty (obsahuji jen referenci na COM interface z DirectX) a .NET GC vidi pamet obsazenou tou referenci, ale uz ne ten buffer s daty (ktery je na normalnim heapu, ale ne v managed heapu).
Takze z pohledu .NET jich muzes alokovat celkem dost bez toho, aby se spustil GC... V pripade takovyhle prostredku bys mel dusledne bud volat Dispose() nebo pouzivat using (textura) { ...kod s texturou... } _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 24. září 2014, 11:14:08 Předmět: |
|
|
jj jak rika ondra, .NET neni samospasny, pokud objekty implementuji IDisposable() je treba na nich volat Dispose().
ony tim o sobe rikaji, ze si alokuji neco mimo dosah garbage-collectoru a ty musis rict, ze se to ma uvolnit ... |
|
Návrat nahoru |
|
|
MiroJ
Založen: 21. 02. 2008 Příspěvky: 229
|
Zaslal: 24. září 2014, 19:37:19 Předmět: |
|
|
Dakujem za rady. Ja som pouzil "YourKit Profiler 2014 for .NET - Build 14516" na zistenie a odchytenie memory leak. U troch zrutov pamete som odladil toho najvatsieho a ostali dva ktore som uviedol vyssie.
V programe ich definujem a inicializujem iba raz :
kód: |
Public FXobjektdefalut As Effect
Public SurfaceDefalut As RenderToSurface
Public SurfaceDefalutViewport As Viewport 'il viewport non deve superare la grandezza della texture
Public TexturaDefalut As Texture
Public Textura02Final As Texture
Public Surface01GlowMask As RenderToSurface
Public Surface01GlowMaskViewport As Viewport 'il viewport non deve superare la grandezza della texture
Public Textura01GlowMask As Texture
Public Surface02TienMask As RenderToSurface
Public Surface02TienMaskViewport As Viewport 'il viewport non deve superare la grandezza della texture
Public Textura02TienMask As Texture
Public Sub inicializacia()
Dim meformat As Format
'PASS 0 Defalut
meformat = Format.A8R8G8B8
SurfaceDefalutViewport.Width = obrazovka.Width
SurfaceDefalutViewport.Height = obrazovka.Height
SurfaceDefalutViewport.MaxZ = 1
SurfaceDefalut = New RenderToSurface(D3DDevice, SurfaceDefalutViewport.Width, SurfaceDefalutViewport.Height, meformat, True, DepthFormat.D24S8)
TexturaDefalut = New Texture(D3DDevice, SurfaceDefalutViewport.Width, SurfaceDefalutViewport.Height, 1, Usage.RenderTarget, meformat, Pool.Default)
Textura02Final = New Texture(D3DDevice, SurfaceDefalutViewport.Width, SurfaceDefalutViewport.Height, 1, Usage.RenderTarget, meformat, Pool.Default)
'PASS GLOW
Surface01GlowMaskViewport.Width = obrazovka.Width
Surface01GlowMaskViewport.Height = obrazovka.Height
Surface01GlowMaskViewport.MaxZ = 1
Surface01GlowMask = New RenderToSurface(D3DDevice, Surface01GlowMaskViewport.Width, Surface01GlowMaskViewport.Height, meformat, False, DepthFormat.D24S8)
Textura01GlowMask = New Texture(D3DDevice, Surface01GlowMaskViewport.Width, Surface01GlowMaskViewport.Height, 1, Usage.RenderTarget, meformat, Pool.Default)
'PASS Tien
Surface02TienMaskViewport.Width = obrazovka.Width
Surface02TienMaskViewport.Height = obrazovka.Height
Surface02TienMaskViewport.MaxZ = 1
Surface02TienMask = New RenderToSurface(D3DDevice, Surface02TienMaskViewport.Width, Surface02TienMaskViewport.Height, meformat, False, DepthFormat.D24S8)
Textura02TienMask = New Texture(D3DDevice, Surface02TienMaskViewport.Width, Surface02TienMaskViewport.Height, 1, Usage.RenderTarget, meformat, Pool.Default)
End Sub
End Module
|
a potom pouzivam ako render to texture
kód: |
.
.
.
SurfaceDefalut.BeginScene(TexturaDefalut.GetSurfaceLevel(0), SurfaceDefalutViewport)
D3DDevice.Clear(ClearFlags.Target Or ClearFlags.ZBuffer Or ClearFlags.Stencil, RGB(0, 0, 0), 1, 0)
kamera_3d.Nastav_projekciu(manazer_kamier.typ2d3d.plocha3d)
manazer_fs_render.Render() ' Render objektov
SurfaceDefalut.EndScene(Filter.None)
.
.
.
|
Pokial pouzijem SurfaceDefalut.Dispose() tak mi surface zahodi a pri novom kole slucky konci chybou lebo objekt uz nevie najst.
Aj napriek tomu, hru som si zahral, bezala nieco oklo hodini a nespadla. Tak dufam ze je vsetko pod kontrolou.
Mimo ine, v programe priebezne volam GC, dajme tomu raz za nejaky cas, alebo pri kliknuti na ikonku, kedy posuvam tak v prospech PC. Ale podla profileru to na tie dane hodnoty vliv nema.
kód: |
Public Class MemoryManagement
Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" ( _
ByVal process As IntPtr, _
ByVal minimumWorkingSetSize As Integer, _
ByVal maximumWorkingSetSize As Integer) As Integer
Public Sub FlushMemory()
GC.Collect()
GC.WaitForPendingFinalizers()
If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1)
add_comunication_line("Vymazana pamet")
End If
End Sub
|
|
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 25. září 2014, 08:46:49 Předmět: |
|
|
no po zavolani Dispose() ten objekt musis uvolnit a vytvorit znovu ... |
|
Návrat nahoru |
|
|
MiroJ
Založen: 21. 02. 2008 Příspěvky: 229
|
Zaslal: 25. září 2014, 09:49:43 Předmět: |
|
|
Ano, to je pravda. |
|
Návrat nahoru |
|
|
|