In case you didn't see, there's a blog post (by Jay) about writing Conway's game of life in Racket. It spends some time talking about various optimizations to get performance:
http://jeapostrophe.github.io/2013-11-18-life-post.html On Friday, January 5, 2018 at 9:14:39 AM UTC-5, cwebber wrote: > > Hello all, > > Last night out of curiosity I started lazily adding some code to see how > long it would take me to write a game of life implementation in Racket. > Not exactly a challenging expidition game-authoring-wise, but a fun > little exercise anyway. You can see and play with the results here: > > https://gitlab.com/dustyweb/racket-life > > (Don't expect astounding code or anything.) > > Here were my takeaways: > > - Racket is a real joy, especially due to its inclusion of its picture > language, to write this kind of thing in. I started playing with > this very idly last evening and was very quickly pulled in. > > - The icons library is a hidden gem in Racket... bitmap-render-icon > is a lovely way in particular to create the kinds of sprites you use > in puzzle games :) > > - The HTDP big-bang system is, from a programming perspective, a lot of > fun to code in. I can easily see how it would be great to teach > with. > > - It was easy to get an implementation of Conway's Game of Life going > and have it even be fairly pretty within almost no time. However, as > observed here: > https://groups.google.com/forum/#!topic/racket-users/yjRuIxypUQc > the functional drawing system isn't very fast once you get a lot of > objects on the screen. Fortunately I found it was possible to not > have to convert all my code, only the to-draw bit... I converted > it to a bitmap canvas that I blitted to imperatively. > > - But even this was not fast enough... I found that a 50x50 graph was > terribly slow. I found that even just creating the 1000x1000 px > bitmap every frame was very expensive, even before blitting to it, so > I stuck the bitmap in a parameter and kept it around between frames. > > - I then found out that the bitmap wasn't changing suddenly... I'm > guessing big-bang has an optimization where (since it's expecting a > functional program) if it sees an object that's eq? to the previous > object come out of to-draw, it doesn't draw it. So instead I > allocated two bitmaps as parameters and switched between which one I > was blitting to. That effectively tricked big-bang into blitting > to my reused bitmap every time ;) > > - With those optimizations in place, a 30x30 grid on my > 10-year-old-laptop would run at full speed, and a a 50x50 tile grid > (1000x1000 pixels) rendered at about 10FPS... a barely tolerable, but > tolerable speed, for something like this ;) > > - It seems that the blitting of bitmaps to the canvas (I didn't do > anything smart to "only blit the ones that changed", which would > speed this up certainly by a lot) is by far the slowest part of > my code, so I figured maybe it would be faster if I drew rects on > the canvas instead of blitting my pretty icon-derived bitmaps. > To my surprise it became 50% slower! > > I guess completely redrawing 2500 sprites per frame is just a lot for > the vanilla canvas. I see there's an opengl canvas... maybe I should > try that. > > Obviously there's "the most correct" optimization to do, given that I've > already gone down the route of committing imperative-rendering sins: I > ought to keep around the previous graph and see if it changed at all and > only blit the ones that actually changed. Well, I'm sure that would > make things lightning fast ;) > > I'm not sure if that's interesting to anyone at all. But I will say, > Racket really is a joy to work with! Thanks for making a toolbox so > much fun I accidentally lose a number of hours to something like this :) > > - Chris > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.