dcxdll icon indicating copy to clipboard operation
dcxdll copied to clipboard

Performance Bottleneck with complex CLA/DCXML

Open Daedalus11069 opened this issue 2 years ago • 1 comments

I'm using mIRC 7.75 and dcxdll-3.1-git978 on Windows 11 Pro (22H2, OS Build 22621.2861 with Experience Pack 1000.22681.1000.0)

As I alluded to at the end of #77, following the update from 469 to 952/978(both were affected), I encountered a performance issue with larger CLA/DCXML structures.

Whenever I open up the interface I made, there's a long period of what appears to be sizing/margin/padding adjustments visually taking place before the interface eventually settles and can be interacted with. Below is a gif example:

performance issues1

Below is the test case I used to create the interface:

DCXML
<dcxml>
    <!-- margin order: -->
    <!-- LEFT TOP RIGHT BOTTOM -->
    <dialogs>
        <dialog name="interface" caption="Interface" w="1010" h="200" margin="0 0 0 0">
            <control type="tab" id="id1" styles="hot gradient">
                <control type="panel" caption="Tab 1" cascade="v">
                    <pane cascade="h">
                        <control type="panel" cascade="v" weight="4">
                            <control type="text" caption="Title 1" height="16" />
                            <control type="list" id="id2" styles="vsbar" margin="0 0 5 5" />
                            <control type="panel" height="60">
                                <pane cascade="h">
                                    <control type="edit" id="id3" styles="tooltips group tabstop" />
                                    <control type="edit" id="id4" styles="tooltips tabstop" />
                                </pane>
                                <pane cascade="h">
                                    <control type="edit" id="id5" weight="7" styles="tooltips tabstop" />
                                    <control type="button" id="id6" caption="Btn" weight="3" />
                                </pane>
                                <control type="button" id="id7" caption="Button" height="20" />
                            </control>
                        </control>
                        <control type="panel" cascade="v" weight="3">
                            <control type="text" caption="Title 2" height="16" />
                            <control type="list" id="id8" styles="vsbar" weight="5" margin="0 0 5 5" />
                            <control type="panel" height="40">
                                <pane cascade="h">
                                    <control type="edit" id="id8" weight="7" styles="tabstop autohs" />
                                    <control type="button" id="id9" caption="Btn" weight="3" />
                                </pane>
                                <control type="button" id="id10" caption="Button" height="20" />
                            </control>
                        </control>
                        <control type="panel" cascade="v" weight="5">
                            <control type="text" caption="Title 3" height="16" />
                            <control type="panel" cascade="h">
                                <control type="panel" cascade="v" margin="0 0 5 0">
                                    <control type="list" id="id11" styles="vsbar" weight="10" />
                                    <control type="button" id="id12" eval="1" caption="Button -- $+ $chr(62)" height="20" />
                                    <control type="text" caption="Text" styles="center" />
                                </control>
                                <control type="panel" cascade="v">
                                    <control type="list" id="id13" styles="vsbar" weight="10" />
                                    <control type="button" id="id14" eval="1" caption="$chr(60) $+ -- Btn" height="20" />
                                    <control type="text" caption="Text" styles="center" />
                                </control>
                            </control>
                        </control>
                        <control type="panel" cascade="v" weight="4">
                            <control type="panel" cascade="h">
                                <control type="panel" cascade="v">
                                    <control type="panel" cascade="v">
                                        <control type="text" caption="Title 4" height="16" />
                                        <control type="panel" cascade="v">
                                            <control type="radio" id="id15" caption="Radio" height="20" />
                                            <control type="radio" id="id16" caption="Radio 2" height="20" />
                                            <control type="radio" id="id17" caption="Radio 3" height="20" />
                                            <control type="radio" id="id18" caption="Radio 4" height="20" />
                                        </control>
                                    </control>
                                    <control type="panel" cascade="v">
                                        <control type="text" caption="Title 5" height="16" margin="0 5 5 5" />
                                        <control type="button" id="id19" caption="Load" height="20" />
                                        <control type="button" id="id20" caption="Unload" height="20" />
                                    </control>
                                </control>
                                <control type="panel" cascade="v" margin="0 0 5 0">
                                    <control type="text" caption="Title 6" height="16" />
                                    <control type="panel" cascade="v">
                                        <control type="text" caption="Title 7" height="16" />
                                        <control type="panel" height="40" cascade="v">
                                            <control type="radio" id="id21" eval="1" caption="$chr(9854)" styles="group" />
                                            <control type="panel" cascade="h">
                                                <control type="radio" id="id22" width="20" />
                                                <control type="edit" id="id23" width="50" />
                                            </control>
                                        </control>
                                    </control>
                                    <control type="panel" cascade="v">
                                        <control type="text" caption="Title 8" height="16" />
                                        <control type="panel" height="40" cascade="v">
                                            <control type="radio" id="id24" eval="1" caption="$chr(9854)" />
                                            <pane cascade="h">
                                                <control type="radio" id="id25" width="20" />
                                                <control type="edit" id="id26" width="50" />
                                            </pane>
                                        </control>
                                    </control>
                                </control>
                            </control>
                        </control>
                        <control type="panel" cascade="v" weight="3">
                            <control type="text" caption="Title 9" height="16" />
                            <control type="panel" cascade="h">
                                <control type="panel" cascade="v" margin="0 0 5 0">
                                    <control type="text" caption="Caption" styles="center" height="16" />
                                    <control type="list" id="id27" styles="hsbar" />
                                    <control type="text" caption="Caption" styles="center" height="16" />
                                    <control type="list" id="id28" styles="hsbar" />
                                </control>
                            </control>
                        </control>
                        <control type="panel" cascade="v" weight="2">
                            <control type="text" caption="Title 10" height="16" />
                            <control type="panel" height="27" cascade="h">
                                <control type="radio" id="id29" caption="Caption" />
                                <control type="radio" id="id30" caption="Caption" />
                            </control>
                            <control type="text" caption="Title 11" height="16" />
                            <control type="check" id="id31" caption="Title 12" tooltip="(tooltip content)" styles="tooltips" height="20" />
                        </control>
                    </pane>
                </control>
            </control>
        </dialog>
    </dialogs>
</dcxml>
mSL test case
dialog MainInterface {
  title "Interface"
  size 213 710 510 110
  option dbu
}

alias interfaceopen {
  clear
  if ($dialog(intf1) == $null) {
    dialog -m intf1 MainInterface
  }
  else {
    dialog -x intf1
    dialog -m intf1 MainInterface
  }
}

on *:DIALOG:intf1:init:0:{
  var %verbose = v
  dcx Mark $dname interface.events

  xdialog -b $dname +tz
  xdialog -T $dname +sp
  ;dcxml -d [DNAME] [Name of dialog element you wish to load] [path to dcxml file]
  dcxml -d $+ %verbose $dname interface $qt($mircdirscripts\interface.xml)

  .timer -d 1 0 xdialog -l $dname update
  .timer -d 1 0 xdialog -j $dname
  .timer -dm 1 500 xdock -m $dialog($dname).hwnd +b
  .timer -dm 1 500 xdock -r $dialog($dname).hwnd + 0 %h
}

alias interface.events {
  ; Nothing to do here
}

Daedalus11069 avatar Dec 28 '23 23:12 Daedalus11069

The dcxml/cla part runs fine when not docked. As a side note when using dcxml you must wait for the dcxml ready event before doing anything further to the dialog. I'll look into why xdock is messing up cla.

Here is a version that loads nice & fast.

dialog MainInterface {
  title "Interface"
  size 213 710 510 110
  option pixels
}

alias interfaceopen {
  clear
  if ($dialog(intf1) == $null) {
    dialog -m intf1 MainInterface
  }
  else {
    dialog -x intf1
    dialog -m intf1 MainInterface
  }
}
alias -l _after_init {
  xdock -p
}
on *:DIALOG:intf1:init:0:{
  var %verbose = v
  dcx Mark $dname interface.events

  xdialog -b $dname +tz
  xdialog -T $dname +sp

  xdock -m $dialog($dname).hwnd +b
  .timer 1 0 dcxml -d $dname interface $qt($mircdirscripts\interface.xml)
}

alias interface.events {
  if ($2 == ready) {
    .timer 1 0 _after_init $1
  }
  elseif ($2 == isverbose) {
    echo -s ask verbose (false)
    return $false
  }
  elseif ($2 == error) echo -s DCXError: $1 ID: $3 Type: $4 Prop: $5 Cmd: $6 Error: $7-
  ;else echo -s cc: $1-
}

OokEek avatar Jan 03 '24 22:01 OokEek