Cheesed off by 32xxx
Mark Waddingham
mark at livecode.com
Mon Apr 3 02:58:42 EDT 2017
On 2017-04-02 19:07, Richmond Mathewson via use-livecode wrote:
> The problem, such as it is, is that the Unicode specifications have
> 128 * 8703 slots for glyphs (= a big number my mind cannot cope with)
> and the display in my "CHAR REF" stack is set up to cope with 128
> glyphs a go: hence 8703 buttons.
>
> Of course I could be racist and leave out the Chinese ideograph slots
> (= about 70%) . . .
You'd probably be okay with 8703 buttons (were there not a co-ordinate
magnitude limit), but certainly not with 128*8703 buttons.
To give some context...
Each button takes up at least 128 bytes in memory, so:
8703 buttons is about 1.4Mb - which isn't too bad
8703*128 buttons would be about 150Mb - which is substantially more
Admittedly, neither of these will 'break the bank' in terms of memory
availability, even on machines of a G3 Mac vintage, however just storing
the representation of such things in memory is not the only issue. The
engine has to do things like:
- render all the controls on the card
- perform hit testing when the user clicks or interacts with the card
- search for controls when you reference them in script
Rendering requires a linear back to front scan of each control, painting
each one which is within the visible rect of the window the card sits
in. This means that if you have 8703*128 buttons it will need to perform
that many steps to render. Additionally, whenever a small amount
changes, it needs to do this again - as any one control *could* have
been moved or intersect with the area which has changed (and thus
require rendering).
Hit testing is similar, although the process is from front to back, and
stops as soon as a control says it is the target of the mouse / user
interaction event.
The third case, is the killer though. Looking up a control by name or by
later requires (on average) number of controls on card / 2 steps to
perform. If you use the (short) id, then there is a per-stack cache
which makes the lookup take 1 step if it has been looked up before but
the normal number of steps if it has not.
In general, we'd never advise using so many controls on a single card -
and a data-oriented approach which is what others have suggested is
generally the best approach in this case. i.e. Update the content of a
small set of buttons as the user browses through the list.
> I wonder if that limit is "cast in stone" or the Livecode people could
> expand it?
Currently engine controls are limited to 16-bit quantities for
co-ordinates - which means a range of -32768 to 32768. The underlying
rendering library we use (libgraphics), however, uses floats (32-bit
real numbers which given an integer range up to around 2^24). So,
updating the engine to use floats or similar in its co-ordinates for
controls is certainly possible, just not a task we've undertaken yet.
Warmest Regards,
Mark.
--
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps
More information about the use-livecode
mailing list