개인 자료란 (JE)

  서버 커뮤니티

Profile windy_wind 대표칭호 없음
Profile

질문하기 스크립트

누가 덜 렉걸리나? [on join: while ~ VS every 1 tick]

2024.02.07 조회 수 117 추천 수 0
이해도 초보자 
게임버전 (JE) 관련없음 
게임버전 (BE) 1.20.x 
스크립트 버전 2.6.4 

비록 지금도 every 1 tick을 혐오 하는 사람들도 있지만 저는 every 1 tick을 선호하는 편입니다.
물론 렉이 안걸리게 할려고 every 1 tick을 하나만 만들어서 모든 기능을 쑤셔넣는- 미친짓(?)을 하고 있는데,

최근에 안 사실로

on join:
 while ~

을 쓰시는 분들이 좀 있는 것 같더라고요.
while을 join에서 왜쓰냐 물어보니 이렇게 하면 every 1 tick보단 렉이 들 걸린다고 하더라고요..
다른곳에서도 보니까 분산적으로 실행? 그런거 때문에 좀 더 렉이 들 걸린다고 하는 사람들도 있는 걸 보았습니다..

위에 말한 이야기를 듣고나서 큰 고민에 빠졌습니다:
- 진짜 실제로 on join: while~을 사용하면 렉이 every 1 tick보다 엄청 큰 차이로 줄어드나요?
- 만약 렉이 줄어든다면 분산 머시기 때문에 그런건가요?
- 그것도 맞다면 every 1 tick을 여러개 만들어서 분산적으로 실행시키면 렉이 줄어드릴까요?
- every 1 tick 자체가 렉의 요소라면 on join: while을 사용해야 하나요? 다른 방법이 있나요?
- on join: while을 실제로 어떻게 사용하시고 있으신가요?

[정리]
1)every 1 tick과 on join: while~ 중에 렉이 덜 걸리는 것은?
2)렉의 격차가 그렇게 심한가요?
3)렉의 격차가 나는 이유를 좀만(?) 자세히 알려주세요
4)on join: while은 어캐쓰고 계시는지?

2개의 댓글

A_bins
2024.02.13

저는 플러그인을 주로하고 있어서 이에 대해서 정확한 답이라고 확신은 못드리는점..

 

- 진짜 실제로 on join: while~을 사용하면 렉이 every 1 tick보다 엄청 큰 차이로 줄어드나요?

: 동일한 비용을 가지는 코드 두 개를 돌려보면 차이가 없을 확률이 높아요!

 

- 만약 렉이 줄어든다면 분산 머시기 때문에 그런건가요?

: 하지만 스크립트의 for loop문 처리가 느리다면, on join식 스케듈링 방식이 더 빠를 확률이 있어요.

 

왜냐하면 every 1 tick에서는 loop all players: 라는 구문이 들어가는데 이 구문 자체가 느릴 경우,

플레이어 하나당 하나의 스케쥴러를 할당하는 on join; while문은 마인크래프트 버킷 소스코드 내에서의 for loop문을 돌기 때문에 조금 더 가벼울 것 같다는 생각은 드네요!

 

스크립트는 근본적으로 코드를 읽고 해석하고 실행하는 오버헤드가 있는 녀석이라서 스크립트의 for문이 더 무겁긴 하겠지만.. 정확한 벤치마크는 돌려보질 않기도 했고, 차이가 느껴질 정도였다면.. 이미 스크립트 본연의 사용 용도를 벗어났을 확률이 높습니다. 스크립트는 가벼운 기능 구현의 용도로 쓰셔야합니다.

 

- 그것도 맞다면 every 1 tick을 여러개 만들어서 분산적으로 실행시키면 렉이 줄어드릴까요?

: 그건 오히려 처리 비용이 증가할거 같네요.

버킷 스케쥴러를 분산해서 만든다고 해도.. 한 틱에 다 처리하는 것은 동일하며, 오히려 스케쥴러 객체가 생김으로써 생기는 오버헤드가 있기 때문에.. 의미가 없다고 생각이 드네요..

 

또한 오히려 for loop를 여러번 해서 비용이 증가 할 것 같아요!

 

예를 들어
 every 1 tick:
    loop all players: 
        A

 


 every 1 tick:
    loop all players: 
        B

 

이 구문을 하나로 합친다면 loop all players를 한 번만 할 수 있지만

분산하면 두 번이나 하게 되는 처참한 코드가 생깁니다..

 

- every 1 tick 자체가 렉의 요소라면 on join: while을 사용해야 하나요? 다른 방법이 있나요?

: 가장 좋은건 사용을 하지 않는겁니다! 정말 필요한 부분에만 사용을 해야하는게 가장 좋은 방법이기도 합니다.

또한 스크립트의 다른 최적화를 살펴보시는게 좋아요.

스크립트의 변수시스템은 정말 많은 IO를 거치기 때문에, 임시변수를 활용한 최적화를 알아보시는건 어떨까요!?

 

- on join: while을 실제로 어떻게 사용하시고 있으신가요?

: X

 

추가로 궁금하신 점은 discord: a_bins로 연락주세요!

windy_wind
2024.02.18
@A_bins

감사합니다♥