Managing resources
BlitzMax Forums/BlitzMax Beginners Area/Managing resources
| ||
| Hi to all. After a long break I'm writing a little library for my projects: its goal is to manage every resource I load. But I'm thinking on its working way. Here it's a little extract
Type tresource
Field tipo:Int
Field file:Object
Field handle:Object
Global tresource_list:TList=New TList
Function ResLoadImage:timage(url:Object,parameter=-1)
DebugLog "GCMemAlloced "+GCMemAlloced()
Local temp_image:timage=LoadImage(url,parameter)
If temp_image=Null DebugLog "NO image! "+String(url);Return
Addresource(url,temp_image)
Print "Load image"
Return temp_image
End Function
Function AddResource(url:Object,handle:Object)
If url=Null Or handle=Null Return
Local tres:tresource=New tresource
tres.file=url
tres.handle=handle
tresource_list.addlast(tres)
DebugLog "ADD RESOURCE:["+GCMemAlloced()+"]"
End Function
Function ClearAll(fine:Int=0)
GCCollect
DebugLog "Clear resource"+GCMemAlloced()
For Local i:tresource=EachIn tresource_list
i.handle=Null
Next
ClearList tresource_list
If fine=1 tresource_list=Null
GCCollect
DebugLog "FREED: ["+GCMemAlloced()+"]"
End Function
End Type
Graphics 640,480
Global myimage:timage=tresource.ResLoadImage("gfx/back3.png")
DrawImage myimage,0,0
Global myimage:timage=tresource.ResLoadImage("gfx/back3.png")
DrawImage myimage,0,0
Flip
WaitKey
tresource.ClearAll()
'myimage=Null <--- with this I'm OK
Cls
DrawImage myimage,0,0
Flip
WaitKey
End
The program itself is very stupid: in this case I want to load an Image and I use the .ResLoadImage() function I created. The reference is returned to main program and stored in the tresource_list. My problem is: when I call tresource.ClearAll() it DOESN'T DESTROY the resource because there is myimage still live... How do you resolve this, if possibile? Yes I know I'm lazy, and that the best solution is to keep track 'by hand' of all the resources used... This is the second way (not very easy to manage). It's the same thing, but I return to main program a TResource reference, that I need to cast manually as I need.
Type tresource
Field tipo:Int
Field file:Object
Field handle:Object
Global tresource_list:TList=New TList
Function ResLoadImage:tresource(url:Object,parameter=-1)
DebugLog "GCMemAlloced "+GCMemAlloced()
Local temp_image:timage=LoadImage(url,parameter)
If temp_image=Null DebugLog "NO image! "+String(url);Return
Local han:tresource=Addresource(url,temp_image)
Print "Load image"
Return han
End Function
Function AddResource:tresource(url:Object,handle:Object)
If url=Null Or handle=Null Return
Local tres:tresource=New tresource
tres.file=url
tres.handle=handle
tresource_list.addlast(tres)
DebugLog "ADD RESOURCE:["+GCMemAlloced()+"]"
Return tres
End Function
Function ClearAll(fine:Int=0)
GCCollect
DebugLog "Clear resource"+GCMemAlloced()
For Local i:tresource=EachIn tresource_list
i.handle=Null
Next
ClearList tresource_list
If fine=1 tresource_list=Null
GCCollect
DebugLog "FREED: ["+GCMemAlloced()+"]"
End Function
End Type
Graphics 640,480
Global myimage:tresource=tresource.ResLoadImage("gfx/back3.png")
DrawImage timage(myimage.handle),0,0' I need to cast it manually...
Flip
WaitKey
Print GCMemAlloced()
tresource.ClearAll()
'myimage=Null
Cls
DrawImage timage(myimage.handle),0,0
Flip
WaitKey
End
This works like I want, but the price is to 'cast' to the right object the reference passed... PS: I wrote different module for my projects (particle, sprite, animated background and so on) so there are many resources involved, and a system like this I think is useful... |
| ||
| . |
| ||
| Why use GCCollect() when bmx has a built in garbage collector? Isn't this sort of handling your data slowing the whole app down a lot? |
| ||
| In fact it is just an idea to see if it is worth or not. The basic solution is to manage all the resources by hand (global image:timage=LoadImage() and then image=NULL), but if you have many resources (images, anim_images, sounds...) and you need to load/unload them at some point this is very costly (well I think so): logo image,title image, menu music, player image (this could be loaded once), particle image, level music, gfx level and so on...(these could change every level). Moreover in the full code I added a log function to check if & when any resource is missing and so on... GCCollect is only to force BMax to release resource (the OS behind I think...) OK...back to the old system so. Thanks again. |