LlMessageLinked/ko

From Second Life Wiki
Jump to navigation Jump to search

설명

함수: llMessageLinked( integer linknum, integer num, string str, key id );
164 함수ID
0.0 지연
10.0 에너지

같은 물체에서의 통신을 위해 이 함수가 사용된다. 연결번호 linknum에 해당하는 프림에 담긴 스크립트들에서 link_message 사건을 같은 값을 갖는 매개변수 num, str, id들과 함께 일제히 발생시킨다.

• integer linknum link_message를 받을 프림을 나타내는 연결 번호 혹은 LINK_* 상수표시
• integer num link_message 사건이 받는 두 번째 매개변수.
• string str link_message 사건이 받는 세 번째 매개변수.
• key id link_message 사건이 받는 네 번째 매개변수.

id를 문자열 매개변수로 지정할 수 있다[1]. strid의 크기는 사용가능한 스크립트 메모리에 대해서만 제약을 받는다.

표시 설명
LINK_ROOT 1 연결된 집합의 모 프림에 전송
LINK_SET -1 모든 프림에 전송
LINK_ALL_OTHERS -2 다른 모든 프림에 전송
표시 설명
LINK_ALL_CHILDREN -3 모든 자식프림들에 전송 (모 프림 제외)
LINK_THIS -4 스크립트가 담겨있는 프림에 전송

주의

  • linknum이 프림 자기 자신을 가리키면 프림은 스스로 호출한 전문을 수신할 수 있다[2]. 이것은 (나쁜 결과인) 무한 순환을 발생시킬 가능성이 있는데, 전달문이 어떻게 다루어지고 전달되는지를 잘 살필 필요가 있다.
  • llMessageLinked함수를 통해 전달되는 전문은 수면, 연기, 또는 지연에 대해서는 지연이 끝날때 까지, 대기열에 쌓인다. 사건의 대기열은 64개의 사건 까지 저장할 수 있다.
    • 사건이 전문을 받았지만 대기열이 꽉 차 있다면 해당 사건은 조용히 버려진다.
    • 동시에 너무 많은 수의 스크립트에 전문을 전송해서는 안되며 갑작스런 지연을 발생시킬 수 있다. 이것은 대부분 다중 프림을 나타내는 상수표기 LINK_* 들을 사용할 때 일어나며 스크립트 수행을 느려지게 하거나 죽일 수 있다.
    • 목표 프림에서 처리할 수 있는 속도보다 빠르게 전문들을 전송하지 말 것. 그렇게 하는 것은 사건 대기열을 채울 위험이 있으며 그 다음 전달문이 전송되지 못하게 할 수 있다.
  • 스크립트의 상태가 바뀌면, 대기열에 저장된 것들을 포함하여 대기중이던 모든 사건은 소멸된다.
  • 만일 link_num이 유효하지 않은 번호라면 함수는 경고 없이 실행을 실패한다.
  • 만약 strid가 해당 스크립트가 사용가능한 메모리를 넘어선다면, 스크립트는 Stack-Heap Collision 오류와 함께 중단될 것이다.

예제

<lsl>default{ //가정 // 물체명: LSLWiki // 스크립트명: _lslwiki

   state_entry() {
       llMessageLinked(LINK_THIS, 0, llGetScriptName(), "");
   }
   link_message(integer sender_num, integer num, string msg, key id) {
       llOwnerSay(msg);
       // LSLWiki의 소유자는 다음 출력을 볼 것이다
       // LSLWiki:_lslwiki
   }    

}</lsl>

유용한 조각

<lsl>default { //빠르고 지저분한 성능점검 전문

   link_message(integer sender_num, integer num, string msg, key id) {
       llSay(DEBUG_CHANNEL, llList2CSV([sender_num, num, msg, id]));
   }

}</lsl> <lsl>//이것은 예제이므로, 단일 스크립트에서 이런 식으로 전문을 다루어서는 안된다.

default{ // 불특정 유형의 변수를 무제한으로 전달하기 // 나눔자 "

기록

  • 단일 프림 물제에 llMessageLinked를 사용하면 개발자가 해당 프림의 다른 스크립트들과 동시에 작동하는 기능성을 주어 몇몇 LSL의 제약을 뛰어넘게 해준다. 이를 위해서는 위에 언급한 대로 무한 순환을 발생시키지 않기 위해 최대한 주의를 기울여야 한다.
  • 몇몇 사용자들은 LINK_SET, LINK_ALL_OTHERS, LINK_ALL_CHILDREN와 같은 다중프림 지시자들에 의해 발생되는 과도한 숫자의 사건 호출로 스크립트 작동이 실패하는 것을 자주 경험한다. 만약 이런 문제에 부딪히게 되면 모든 자식 프림들의 스크립트를 하나의 프림에 넣고 llSetLinkPrimitiveParams로 표적 프림을 지정하는 것이 한 가지 해결책이다. -- Void Singer

함께 보기

사건

•  link_message

함수

•  llGetLinkNumber 스크립트가 포함된 프림의 연결 번호를 반환한다.

상세 기록

주석

  1. ^ LSL에서 key형은 string으로 제공된다. (그러나 연산자들이 달라지며 제약이 있다). 문자열과 키 유형 사이의 형변환은 포함된 자료들에는 영향을 미치지 않는다.
  2. ^ 스크립트가 프림 자신을 가리키는 데에는 네 가지 방법이 있다: 연결 번호(link number), LINK_THIS, LINK_SET 그리고 LINK_ALL_CHILDREN (만약 해당 프림이 자식 프림일 경우).
이 글이 유용하지 않으세요? LSL Wiki의 관련항목이 도움을 줄 수 있을 지도 모릅니다.