Deleting / Unsetting Hierachical Objects / Faces
[1/8] from: james::mustard::co::nz at: 20-Dec-2001 0:54
Hi All, At present I am working on a bit of code that encapsulates over 300 faces into a single context. Unfortunately since these faces are all ordered in an object-like manner and some have timers involved, doing a mass delete of the object is not always giving expected results and memory is not being released until the script ends - this gets to be an issue once the 65MB object is re-loaded a few times... (Am expecting on average about 1000 - 2000 reloads of the object as it is part of a game interface, also the test scripts and associated files are over 5MB compressed so they wont be sent anywhere in a hurry ;-) ) First I defined an object called desktop that is simply a screen-wide face (yes - i know this overrides the internal desktop command in view). To desktop/pane I append the my-object/my-top-face (which by default includes all its subfaces and animations). Then to test memory release I added a button to desktop (see below) to release my-top-face from the desktop and kill my-object like so: => button "Remove Object" [remove find desktop/pane my-object/my-top-face my-object: copy ] ;I also tried unset 'my-object in the remove button - but this did not affect sub-faces and timers Next I added a button to call in the %my-context-object.r file which creates the my-object and appends its my-object/my-top-face to the desktop. => button "Add Object" [do %my-context-object.r show desktop] (code from %my-context-object.r is merely an append desktop/pane my-top-face) What I need to know is: 1) How do I properly delete huge multi-level objects (please don't say property by property...) 2) How do I make sure that all memory is reclaimed (ie trigger garbage collection manually) - provided this is not already covered by step 1. Thanks :) James.
[2/8] from: james:mustard at: 20-Dec-2001 1:19
For the curious: http://www.mustard.co.nz/rebol/grid1.jpg http://www.mustard.co.nz/rebol/grid2.jpg (No I didn't draw all the pretty 3D ships - i'm "borrowing" them until I have the game mechanics worked out enough to go talk to a artist friend.) Making this in REBOL has so far proven quite fun as REBOL has got to be the most rapid platform for idea coding I have ever found :) James.
[3/8] from: petr:krenzelok:trz:cz at: 19-Dec-2001 13:43
Hi, 1) - let me say, that answers I am going to provide you belong more to Cyphre, who is nowadays sporadically connected to internet, so I will try to answer some of you questions ... - Cyphre uses different technique in his Beast game demo. He uses draw dialect, IIRC. He simply renders faces into background. Fast enough - you need only one update of the scene - the background update. - I am not sure above has something to do with timers. Too many of face timers could imo slow down the scene. Current fps rate is also limited to average of 20 fps IIRC. Let's hope RT removes that limitation .... - Cyphre also found a bug with even flow - although faces were hidden, their even mechanism was still active. I am not sure if it is corrected already or not. Maybe that is your case? Even removing face from its parent pane does not mean it is discarded? not sure .... - In opposite - Cyphre would welcome ability to "freeze" the face - so just let the face be part of the screen (visible), but stop receiving events for it ... - You can try to invoke garbage collection by calling 'recycle Take my comments with care, please, as I can be pretty inaccurate in above areas :-) Cheers, -pekr-
[4/8] from: james:mustard at: 20-Dec-2001 2:49
Thanks for the tips Petr :) I got most of the memory recovered now - it seems that when you reset / unset an object none of its member attributes / objects are sent to garbage collection - especially in the case of large series of images like i am using in my image-bank. These all had to be deleted manually before resetting parent objects. eg: while [(length? space-station/image-bank/images) > 0][remove space-station/image-bank/images space-station/image-bank/images/1] space-station: copy  recycle It would be nice if deleting the container removed all the contents rather than having to fish through the contents and kill each one... :) James.
[5/8] from: petr:krenzelok:trz:cz at: 19-Dec-2001 14:56
How's the speed of your game? It can be imo hardly snappy, if you use so many faces in the display, no? :-) Thanks, -pekr- James Marsden wrote:
[6/8] from: nitsch-lists:netcologne at: 19-Dec-2001 18:45
RE: [REBOL] Deleting / Unsetting Hierachical Objects / Faces ---releasing objects: Usually dont reference it and let gc do the work. but functions hold the arguments of their last call in current rebol. its freed when they are called again. with few large objects this is wastefull. clearing the tops levels of such a object/block might help. also there is 'load-image, which keeps a cache with all loaded images and looks there first. i expect rebol uses it internal. it has an option /clear to clear it. ---for referencing: why don't you use objects of objects? even if thats one-field objects like make object![value: something] this style is used in /view everywhere (like writing face/text the long way.. instead of hacking to use the 'text somehow). -volker [james--mustard--co--nz] wrote:
[7/8] from: james:mustard at: 20-Dec-2001 9:45
Petr Krenzelok wrote:
> How's the speed of your game? It can be imo hardly snappy, if you use so
> faces in the display, no? :-)
Its seems to be running at 32tps quite happily... go figure :) I haven't tried it at a higher rate yet :) James.
[8/8] from: james:mustard at: 20-Dec-2001 10:01
> Usually dont reference it and let gc do the work.
GC wasn't doing the work :)
> but functions hold the arguments of their last call in current rebol. > its freed when they are called again. > with few large objects this is wastefull. > clearing the tops levels of such a object/block might help.
Yup - that is what i resorted to.
> also there is 'load-image, which keeps a cache with all > loaded images and looks there first. > i expect rebol uses it internal. > it has an option /clear to clear it.
I didnt use this as i created my own image cache because I needed finer control over the structure.
> ---for referencing: > why don't you use objects of objects? > even if thats one-field objects like > make object![value: something] > this style is used in /view everywhere > (like writing face/text the long way.. instead of hacking to use the 'text
somehow). That's exactly what I did do :) my-object: context [ img: make object! [ img-path: none img-file: none image: none ] image-bank: make object! [ images: copy  make-images: func [image-path /local c][ for c 1 16 1 [ append self/images make img [img-path: image-path img-file: join image-path [c ".jpg"] image: load to-file self/img-file] ] ] ;.... <snip> .... ] James.