[hanlp]이동이나 특정 행동을 많이 요청할 때 버벅거림을 없애려면?
member photo 탈퇴 8 2,153 0 2004-01-20 05:00:38
0
8Comments
member photo
MaGuN 2004.01.20(화) 오후 03:33:28
사실 공개적인 게임에서 1번 방식을 선택한다면 한 사람이 수백개의 명령을 실행하는 동안
다른 사람은 렉이 걸리거나 명령자체가 실행이 되지 않을수가 있습니다.
수십명또는 수백명의 사용자들이 접속해서 게임을 하는데.. 한 사람드로 인해서 많은 사람들이
불편해 질 수가 있습니다.

원래 LP머드의 특성중의 하나는 머드 엔진 자체에 일정한 evaluaction cost를 두고.. 있습니다.
이것은 한 하트비트에 실행할수 있는 cost를 제한 하는것으로..

게임의 운영진 레벨을 가진 사람이 <명령> 명령체크 라고 치면 명령이 얼마나 많은 evalu cost를
쓰는이 알수 있으며, 이런 evalu cost를 제한함으로 인해서 수 많은 명령의 입력과 처리를 위해서
머드 엔진에서 걸리는 과부하와 렉을 줄일수 있도록 한 것입니다.

되도록이면 두번째 방법을 선택하는것이 좋을듯 합니다.


member photo
MaGuN 2004.01.20(화) 오후 03:44:56
두번째 방법 처럼 어느정도의 명령만 수행하고 이후의 것은 무시 되도록 하려면

1. user.c의 heart_beat() 함수에 set_temp("입력제한",20); 을 넣습니다.
2. user.c의 cmd_hook() 함수의 루틴중 앞에 부분에서 this_object()의
query_temp("입력제한") 을 검색해서 만약 수치가 1보다 작다면 return 0;
을 시킵니다.
그리고 cmd_hook()함수에서 return foo; 의 바로 윗줄 들에서
set_temp("입력제한",query_temp("입력제한")-1);
과 같은 형식으로 넣어 주면 됩니다.

이외에도 여러가지 방법이 있겠습니다만...
어떤 방법이 코딩하기에 편리한지, 또는 머드를 관리하기에 편리한지를 따져보고
코딩을 하시면 될것 같습니다. ^^
member photo
탈퇴 2004.01.20(화) 오후 09:44:29(220.88.xxx.xx)
여기도 먼저 답변에 대해 감사드리며, 꾸버벅~~ 아울러 ^^;; 에러에 대한 고찰을 ㅠㅠ;;
요거는 에러는 안 나는데 먹히지가 않네요..

nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;

 verb = query_verb();
 env = environment();

 if ( this_object()->query_temp("입력제한") < 1 ) return 0;

 if (env && env->valid_exit(verb)) {
  if( tmp < 0 ) return 0;
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));

 set_temp("입력제한",query_temp("입력제한")-1);

 if (file && file != "") {
  if( tmp < 0 ) return 0;
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
  return foo;
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
  return foo;
 }
 return 0;
}

void heart_beat() {
 int age;

 delete_temp("지난잡담");
 continue_attack();
 unblock_attack();
 heal_up();
 age = query("나이");
 if (!query_temp("last_age_set")) set_temp("last_age_set", time());
 age += (time() - query_temp("last_age_set"));
 set_temp("last_age_set", time());
 ob_data["나이"] = age;

 set_temp("입력제한",20);
}

어디가 잘못된 걸까요;; 어쩌다 한 번씩 명령이 안 먹히고 '^^;' <--이게 뜰 때도 있긴 한데.. 100개 정도 명령을 입력하면 뚝뚝 끊기면서 원래처럼 됩니당;;
member photo
탈퇴 2004.01.20(화) 오후 09:47:19(220.88.xxx.xx)
cmd_hook 함수부분을 아래와 같이 바꾸니(입력제한을 return foo; 바로 윗줄로!) 제한 이후의 명령을 무시하기는 하는데 또 다시 뚝뚝 끊기면서 실행이 됩니다. (제한이 20갠데, 50개의 명령을 입력했다면 20개의 명령이 실행되고 몇 개 무시하고 또 나머지는 명령이 실행이 됩니다.)

nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;

 verb = query_verb();
 env = environment();

 if ( this_object()->query_temp("입력제한") < 1 ) return 0;

 if (env && env->valid_exit(verb)) {
  if( tmp < 0 ) return 0;
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));

 if (file && file != "") {
  if( tmp < 0 ) return 0;
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
  set_temp("입력제한",query_temp("입력제한")-1);
  return foo;
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
  set_temp("입력제한",query_temp("입력제한")-1);
  return foo;
 }
 return 0;
}
member photo
MaGuN 2004.01.20(화) 오후 10:05:53
nomask static int cmd_hook(string cmd) {
 string file, verb;
 object env;
 int foo, tmp;

 verb = query_verb();
 env = environment();

tmp = queyr_temp("입력제한");

// 입력제한이 1보다 작다면 더 이상의 명령을 수행하지 않는다.
 if ( tmp < 1 ) {
return 0;
}

 if (env && env->valid_exit(verb)) {
  set_temp("입력제한",tmp-1);
  return go_exit(verb, env);
 }
 file = (string)CMD_D->find_cmd(verb, explode(query("경로"), ":"));
 if (file && file != "") {
  foo = (int)call_other(file, "cmd", cmd);
  if( !foo ) foo = (int)call_other(file, "cmd_" + verb, cmd);
if( foo ) {
set_temp("입력제한",tmp-1);
   return foo;
}
 }
 foo = (int)EMOTE_D->parse(verb, cmd);
 if (foo) {
set_temp("입력제한",tmp-1);
  return foo;
 }
 return 0;
}
member photo
MaGuN 2004.01.20(화) 오후 10:07:40
void heart_beat() {
 int age;

 delete_temp("지난잡담");
set_temp("입력제한",20);
 continue_attack();
 unblock_attack();
 heal_up();
 age = query("나이");
 if (!query_temp("last_age_set")) set_temp("last_age_set", time());
 age += (time() - query_temp("last_age_set"));
 set_temp("last_age_set", time());
 ob_data["나이"] = age;
}
member photo
MaGuN 2004.01.20(화) 오후 10:08:34
위 두가지 함수를 넣고 나서.. 머드를 리부팅 시키거나..

-R /std/user 갱신 이라고 입력하고..
재 접속하면 적용이 됩니다.

member photo
탈퇴 2004.01.21(수) 오전 04:02:49(220.88.xxx.xx)
음.. 이 소스를 적용시켜보았습니다만.. 왜 자꾸 뚝뚝 끊기면서 실행이 될까요.. Hanlp가 뚝뚝 끊기면서까지 실행을 모두 하려고만 하는데.. ㅠㅠ;;아.. 소스까지 주셨는데 잘 못 써먹는 거 같네요..;
코멘트를 삭제할 비밀번호를 입력하세요.
비밀번호:
정회원 이상만 코멘트 쓰기가 가능합니다.
총 게시물 954개 / 검색된 게시물: 954개
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
내용
쪽지가 도착하였습니다.
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--