When you put an icon in a grid using either the \icon macro or the <img> tag with the \ref macro, Dream Seeker allocates memory for the entire icon, even if you only wanted a specific state. Not only that, but if you ask again for the exact same icon and icon_state combo, it allocates all that memory again, and it never frees the memory! That leads to obscene amounts of memory usage. (Which can lead to crashes from lack of memory.)
Numbered Steps to Reproduce Problem:
- Make a grid in your interface file.
- Set the cells property to a large number of cells. (e.g. 500)
- Get an icon that is large, but has small individual icon states. ('Large' can be about 3KB.)
- Use output() to send a particular icon state from the icon to the grid in different cells.
- Use either \icon or <img> with \ref to show the image.
- Just repeat this until many different cells all have the same image.
Here is a demo that shows the bug in action.
Code Snippet (if applicable) to Reproduce Problem:
client
verb
FillGrid1()
set desc = "Works fine."
FillGrid('icon1.dmi')
FillGrid2()
set desc = "Uses obscene amounts of memory."
FillGrid('icon2.dmi')
proc
FillGrid(file)
winset(src, "grid", "cells=1x500")
for (var/i = 1, i <= 500, ++i)
winset(src, "grid", "current-cell=1,[i]")
src << output("<img src=\ref[file] iconstate='state'>", "grid")
Expected Results:
It should only allocate enough memory to show the one chosen icon_state.
OR
It should only allocate memory for the entire icon one time and reuse the icon in memory.
Actual Results:
When putting an image in the grid using the \ref macro, it allocates new memory
for the entire icon without freeing that memory every time.
Does the problem occur:
Every time? Or how often? Always.
In other games? Yes.
In other user accounts? Yes.
On other computers? I do not know.
When does the problem NOT occur?
If you have a small icon, then it only allocates memory for that icon each time, which can save memory allocation, but that's not a fix.
It always occurs as long as the icon is big enough.
Did the problem NOT occur in any earlier versions? If so, what was the last version that worked?
I'm not sure, but I'll assume it's been here for a while.
Workarounds:
I don't know of any workarounds that completely eliminate the problem.
I'll try to find one.
[EDIT]
A possible workaround is to get the icon downloaded from a website, instead of from within the game itself. (By using the enable-http-images property.) A nice solution would be the ability to get images from the user's cache (sent with browse_rsc) with this method.
I'll have to check out how the icon state case is handled because if you're right that it's never freeing that memory, that's obviously bad news.