FANDOM


Scripters_cafeログ


08/10/25 編集

「LSLは1文で書くと効率がいい」という話が出ました。

これは、単純にそのように考えると逆の結果で非効率になる可能性が高いので、内部処理を理解せずに闇雲に1文に記述しようとすることはやめるべきです。


例えば、チャットキーボードの処理の最適化のサンプルコードにあるtimerイベント内の以下の部分

timer() {
    integer now;
    if ( ( now = llGetAgentInfo( OWNER_UUID ) & AGENT_TYPING )
            ^ PREV_AGENTINFO ) {

★nowへの代入結果をそのままXOR演算、というようにまとめられます。


これは、以下のような処理の書き方を工夫したものです。

timer() {
    integer now = llGetAgentInfo( OWNER_UUID ) & AGENT_TYPING;
    if ( now ^ PREV_AGENTINFO ) {

★nowへの代入処理後、スタックが一旦クリアされ、再度nowの内容をスタックに読み込んでXOR演算が行われます。


nowへの代入時に演算結果を入れていますが、素直に記述すると以下のように分解されます。

timer() {
    integer flag; 
    integer now;
    flag = llGetAgentInfo( OWNER_UUID );
    now = flag & AGENT_TYPING;
    if ( now ^ PREV_AGENTINFO ) {

★この場合、flagのスタックへの読み込み、nowのスタックへの読み込みがそれぞれ処理としては無駄になります。


このページの先頭のコードのように記述すると、内部オペレーションを減らすことはできます。


また、当然ですが、1文にしたからといって同じ内容を何度も書くのは無駄です。

timer() {
    if ( ( llGetAgentInfo( OWNER_UUID ) & AGENT_TYPING )
        ^ PREV_AGENTINFO ) {
        // :
    } else if ( ( llGetAgentInfo( OWNER_UUID ) & AGENT_TYPING )
        ^ PREV_AGENTINFO2 ) {
        // :
    } else {
        // :
    }

★これは分かりやすくするための例です。

このような場合は「llGetAgentInfo( OWNER_UUID ) & AGENT_TYPING」の内容を変数に代入すべきです。




このページのTinyURL:http://tinyurl.com/SC-one-statement

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki