ThomasBerends / ReplayMod

Minecraft ReplayMod
https://replaymod.com
GNU General Public License v3.0
0 stars 0 forks source link

Video ram memory leak. #1

Open PixelCrusherCrusher opened 4 years ago

PixelCrusherCrusher commented 4 years ago

Naamloos2

PixelCrusherCrusher commented 4 years ago

Hoi Thomas. Een "opname" met ReplayMod proberen te renderen. Na een tijdje blijft het hele systeem hangen. Wat blijkt.....? Op de 1 of andere manier geraakt het video geheugen overbelast. Er worden waarschijnlijk gegevens in de GPU geladen, maar niet meer er uit gehaald. Daardoor gaat de grafische kaart het gewone geheugen "opeten", wat aanzienlijk trager is. En omdat dit steeds meer is, steeds meer trager. Zoals je in de grafiek kunt zien, is na 8 uur van renderen het geheugen van de GPU helemaal vol, en als je dan de java.exe killed, dan staat het systeem nog een paar minuten helemaal vast, omdat het geheugen dat de grafische kaart vast had, weer vrijgegeven wordt (waarschijnlijk door java, minecraft, replaymod, java dus....) na het programma wordt beëindigd. De videofile is op het moment van killen 0 bytes. En na een minuut of 2 is (als je java killed, en niet ffmpeg) de file naar disk geschreven.

IK VERMOED DAT DE HELE VIDEO FILE EN/OF DATA VAN DE VIDEO DAN OOK IN DE GPU ZIT OF ZO? Dat zou wel heel erg vreemd zijn. Of zou het zo kunnen zijn dat de ffmpeg.exe niet flushed naar harde schijf?

Hier is een stukje c code, hoe je de data die in de GPU wordt geladen weer wist:

https://github.com/HakkaTjakka/MinecraftWorldEditor/blob/master/PACMAN_CUBERITE/src/viewer/viewer_my_sfmlviewer.h#L2063

Of dit probleem alleen voorkomt bij GeForce NVIDEA kaarten weet ik nog niet. Mocht dit (probleem...) niet kunnen worden verholpen, dan zou je de video's in delen kunnen renderen, waarbij tussentijds op de 1 of andere manier de GPU buffer geleegd wordt of zo. Ik ben niet bekend met Java, maar én heel Java zit verkeerd in elkaar, Minecraft nog erger, en ReplayMod is de top. Ikzelf creëer met mijn programma honderdduizenden blokken per seconde, eventueel vanaf 3d objecten, maak er in een paar seconden een hele region file of schematic mee. En kan deze dan 60 fps renderen, (miljoen vertexes) en zo'n 30 frames per seconde dan opnemen met hardware versnelling. Het hele opslag formaat van minecraft is verkeerd, en vertraagt de hele bende. Ook de nbt routines doen niks anders dan miljoenen stukjes geheugen alloceren en de-alloceren, en arrays van bytes worden per byte gelezen en geschreven, dat is helemaal verkeerd.

De groeten.

gerardwensink@gmail.com

PixelCrusherCrusher commented 4 years ago

Ik probeer nu de optie: -flush_packets 1 toe te voegen aan het ffmpeg commando.

PixelCrusherCrusher commented 4 years ago

Wat ik vermoed is, dat de tijdens de opname gemaakte data, wordt geladen tijdens het renderen, (nauurlijk...), dan de GPU wordt geladen met de vertex/texture data, maar dat als het "uit beeld verdwijnt", NIET gewist wordt uit de GPU, waardoor deze allemaal ophopen in deze.

PixelCrusherCrusher commented 4 years ago

Dit zou tevens het geval kunnen zijn bij het instellen van de camera posities tijdens de edit, dan laat ReplayMod ook de hele scene zien. Ik neem aan dat in Minecraft zelf het wel goed gaat, maar tijdens het renderen er iets anders gebruik wordt gemaakt van bepaalde functies die met de GPU te maken hebben. Maar hoe de hele video file in het geheugen van de GPU, die ook het gewone geheugen daarvoor opeet, blijft hangen, is mij een raadsel. Of zou ik de/een verkeerde ffmpeg.exe gebruiken?

PixelCrusherCrusher commented 4 years ago

Naamloos2

Ook tijdens het vooruit spoelen in de edit, zie je hier dat de grafische kaart flink aan het rekenen is. Waarom eigenlijk, want je ziet helemaal niks, dus hoeft de grafische kaart ook niet worden gebruikt...... Hier wordt dus ook flink geladen en gewist in/uit de grafische kaart denk ik, wat dus helemaal niet nodig is. Natuurlijk snap ik niks van de complexe methodes gebruikt in ReplayMod, maar het lijkt alsof hier kinderen aan het programmeren zijn. ;)

PixelCrusherCrusher commented 4 years ago

Hier zie je tijdens het laden bij het starten van het renderen dat de GPU helemaal vol wordt geladen, en het ook het gewone ram geheugen aan het opeten is, waardoor dus vertraging, nogmaals, of dit alleen met GeForce kaarten is weet ik niet.

Naamloos2

PixelCrusherCrusher commented 4 years ago

En dat blijft dan zo.... dus heel traag allemaal. Naamloos

Naamloos

En hier zie je dat java alle GPU capaciteit opslokt, en ffmpeg.exe nauwelijks iets doet. Dus wat gaat er de videokaart in, en niet meer uit?