.[ ČeskéHry.cz ].
Pobrežná stráž
Jdi na stránku Předchozí  1, 2, 3 ... 18, 19, 20
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Inkubátor
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

PříspěvekZaslal: 24. září 2014, 10:15:36    Předmět: Odpovědět s citátem

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 Smile

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? Smile... i ked taka chyba by mala mat podstatne vacsie naroky na pamat...
_________________
Code or die!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
MiroJ



Založen: 21. 02. 2008
Příspěvky: 229

PříspěvekZaslal: 24. září 2014, 10:25:00    Předmět: Odpovědět s citátem

Ahoj, prave postupujem podla bodu c.1 Smile Uvidim ci to odhalim.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
OndraSej



Založen: 28. 07. 2007
Příspěvky: 751
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 24. září 2014, 10:53:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2148

PříspěvekZaslal: 24. září 2014, 11:14:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
MiroJ



Založen: 21. 02. 2008
Příspěvky: 229

PříspěvekZaslal: 24. září 2014, 19:37:19    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2148

PříspěvekZaslal: 25. září 2014, 08:46:49    Předmět: Odpovědět s citátem

no po zavolani Dispose() ten objekt musis uvolnit a vytvorit znovu ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MiroJ



Založen: 21. 02. 2008
Příspěvky: 229

PříspěvekZaslal: 25. září 2014, 09:49:43    Předmět: Odpovědět s citátem

Ano, to je pravda.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Inkubátor Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3 ... 18, 19, 20
Strana 20 z 20

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna