[hanlp]이동이나 특정 행동을 많이 요청할 때 버벅거림을 없애려면?
탈퇴
2,153
0
0
2004-01-20 05:00:38
8Comments
MaGuN
2004.01.20(화) 오후 03:33:28
사실 공개적인 게임에서 1번 방식을 선택한다면 한 사람이 수백개의 명령을 실행하는 동안
다른 사람은 렉이 걸리거나 명령자체가 실행이 되지 않을수가 있습니다.
수십명또는 수백명의 사용자들이 접속해서 게임을 하는데.. 한 사람드로 인해서 많은 사람들이
불편해 질 수가 있습니다.
원래 LP머드의 특성중의 하나는 머드 엔진 자체에 일정한 evaluaction cost를 두고.. 있습니다.
이것은 한 하트비트에 실행할수 있는 cost를 제한 하는것으로..
게임의 운영진 레벨을 가진 사람이 <명령> 명령체크 라고 치면 명령이 얼마나 많은 evalu cost를
쓰는이 알수 있으며, 이런 evalu cost를 제한함으로 인해서 수 많은 명령의 입력과 처리를 위해서
머드 엔진에서 걸리는 과부하와 렉을 줄일수 있도록 한 것입니다.
되도록이면 두번째 방법을 선택하는것이 좋을듯 합니다.
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);
과 같은 형식으로 넣어 주면 됩니다.
이외에도 여러가지 방법이 있겠습니다만...
어떤 방법이 코딩하기에 편리한지, 또는 머드를 관리하기에 편리한지를 따져보고
코딩을 하시면 될것 같습니다. ^^
탈퇴
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개 정도 명령을 입력하면 뚝뚝 끊기면서 원래처럼 됩니당;;
탈퇴
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;
}
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;
}
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;
}
MaGuN
2004.01.20(화) 오후 10:08:34
위 두가지 함수를 넣고 나서.. 머드를 리부팅 시키거나..
-R /std/user 갱신 이라고 입력하고..
재 접속하면 적용이 됩니다.
탈퇴
2004.01.21(수) 오전 04:02:49(220.88.xxx.xx)
음.. 이 소스를 적용시켜보았습니다만.. 왜 자꾸 뚝뚝 끊기면서 실행이 될까요.. Hanlp가 뚝뚝 끊기면서까지 실행을 모두 하려고만 하는데.. ㅠㅠ;;아.. 소스까지 주셨는데 잘 못 써먹는 거 같네요..;