Reviving YAGE

Martin Cejp minexew at gmail.com
Thu Feb 6 08:39:03 PST 2014


On Thursday, 6 February 2014 at 06:30:04 UTC, Benjamin Thaut 
wrote:
> Am 05.02.2014 23:39, schrieb Martin Cejp:
>> On Wednesday, 5 February 2014 at 21:37:22 UTC, Benjamin Thaut 
>> wrote:
>>> Am 05.02.2014 22:21, schrieb Ryan Voots:
>>>>
>>>> At the moment I don't think it really does deal with GC 
>>>> pause times and
>>>> it's one of the things that will need to be dealt with.  I 
>>>> believe it's
>>>> possible (I am still learning much of D) to tell it to not 
>>>> do any GC
>>>> during critical paths which should help keeping it from 
>>>> mangling things
>>>> mid-frame.  There also appears to be some threading support 
>>>> already in
>>>> the engine to do rendering on a seperate thread which should 
>>>> help out at
>>>> keeping frame rates up if the GC can be kept to a minimum 
>>>> there.
>>>>
>>>> In any case I'm not currently aiming for getting the engine 
>>>> capable of
>>>> 300fps with very low latency as it isn't necessary for what 
>>>> I'm after
>>>> though once it's working I certainly won't turn down someone 
>>>> who wants
>>>> to get it that far.
>>>>
>>>> What I'm hoping to get out of this is more a basic framework 
>>>> for
>>>> relative ease for making games more like say the engine 
>>>> Unity provides
>>>> or some of the other things out there.
>>>
>>> If you didn't deal with GC pause times, you will have quite 
>>> some fun
>>> with it. I wrote a small game engine in D, and I ended up 
>>> running the
>>> garbage collector every frame to get stable framerates. Not 
>>> doing it
>>> resultet in 3-10 second pauses during gameplay because of GC 
>>> collection.
>>>
>>> http://www.youtube.com/watch?v=mR2EQy3RRyM
>>>
>>> Because the GC used up to 8 milliseconds every frame (which 
>>> is 50% for
>>> a 60 FPS game), I finally removed the GC from druntime and 
>>> I'm using a
>>> GC free version of D since then. This however comes with 
>>> maintaining a
>>> custom version of druntime and phobos (stripped down to about 
>>> 10% of
>>> the modules) and writing my own standard library.
>>>
>>> You can read more about the GC issues here:
>>> http://3d.benjamin-thaut.de/?p=20
>>>
>>> Kind Regards
>>> Benjamin Thaut
>>
>> Those numbers are pretty scary. How many objects are you 
>> allocating and
>> trashing each frame?
>
> Well, consciously allocating, almost none, only if a new object 
> (like a particle effect) is spawned. But after moving to the no 
> GC version I discovered how many hidden allocations there are. 
> Especially array literals, lambdas, and array concardinationd 
> allocate like crazy. Also phobos functions (format etc). So 
> there where quite many allocations per frame. The allocations 
> per frame don't really matter though, because the runtime of a 
> Mark & Sweep collector does not depend on the amount of 
> Garbage. A Mark & Sweep has to look at all alive objects, so 
> that defines the runtime. And the Problem with a game is, you 
> usually end up with a lot of alive objects and almost nothing 
> of that is garbage. So the GC collect times are constantly high.
>
> Kind Regards
> Benjamin Thaut

Looks to me like all of those could be worked around. Surely 
wouldn't make the code easier to read, but it shouldn't be *that* 
difficult. Don't append to arrays (use own pre-allocated vector 
if needed), allocate particle structs in bulk with plain malloc, 
no array literals in the hot path etc. No GC allocations = no GC 
runs


More information about the Digitalmars-d mailing list