Punkland
한국어
한국어
  • PUNKLAND
    • Punkland 소개
    • ⬆️업데이트 내역
      • 스튜디오 업데이트 내역
      • 앱 업데이트 내역
        • AI 자동번역 기능
      • 서버 업데이트 내역
      • 업데이트 아카이브
  • Punkland Studio
    • 📖시작하기
      • 펑크랜드 스튜디오 다운로드
      • 버전 확인 및 업데이트
      • 신규 프로젝트 생성
      • 맵 만들기
        • 신규 맵 생성
        • 하위 맵 생성
        • 맵 편집
      • 스튜디오 인터페이스
        • [파일]탭
        • [편집]탭
        • [보기]탭
        • [게임]탭
        • [도구]탭
      • 테스트 플레이 진행
      • 게임 출시하기
    • 💻기본 제작 가이드
      • 데이터베이스
      • 리소스 관리자
      • 레이아웃 관리자
      • MP3 -> OGG 변환기
      • 번역파일 내보내기
      • 번역파일 불러오기
      • 스크립트
      • 리소스 마켓
      • 데이터 내보내기
        • 데이터 불러오기
      • 도움말
      • 프로젝트 관리
      • 대사 꾸미기
      • GM 명령어
      • 스탯
      • 피해량 공식
      • 아이템 조건식
      • 팁과 노하우
      • 예제 게임
      • 펑크랜드 네이버 카페
      • 자주 묻는 질문
    • 👑심화 제작 가이드
      • 탑메뉴 관리자
      • 리소스 관리자
      • 스프라이트 관리자
      • 레이아웃 관리자
      • 이벤트 페이지 관리자
      • 데이터베이스
      • 스파인 적용법
    • 스크립트 튜토리얼
      • 사용 방법
      • [스크립트 도움말]
      • 서버 스크립트
        • ScriptClan
        • ScriptColor
      • 클라이언트 스크립트
      • 예제
        • 인터페이스 스크립팅
        • 몬스터 AI 스크립팅
        • 펫 AI 스크립팅
        • 파티클 스크립팅
    • 유튜브 튜토리얼
      • 펑크랜드 유튜브 강좌
    • Web3 튜토리얼
      • NFT 민팅하기
      • 게임에 외부 NFT 연결하기
      • 게임에 ERC-20 토큰 연결하기
    • Effective Punkland
      • 서버와 통신하기
      • RunLater 주의사항
      • HTTP 요청 보내기
    • 개발자 가이드라인
      • 정산정보 등록 및 변경
        • 미성년자 법정대리인 동의서
      • 매출 및 수익금 정산 가이드라인
      • 유료 아이템 판매 관련 안내
      • 뒷거래 부정행위 관련 안내
      • 마케팅 가이드라인
      • 게임 운영 가이드라인
      • 콜라보레이션 가이드라인
      • 공지사항/이벤트 & 푸시 안내
      • 인게임 광고 가이드라인
      • 지적재산권 권리 침해 관련 안내
      • 게임 라이브를 위한 심사 시스템
  • 바로가기
    • 스튜디오 다운로드
    • 펑크랜드 홈페이지
    • 펑크랜드 개발자 카페
    • 공식 디스코드
    • 공식 유튜브
Powered by GitBook
On this page
  • RunLater 사용
  • 시간 간격 보장 문제
  • 성능 문제
  • 유효성 보장 문제
  1. Punkland Studio
  2. Effective Punkland

RunLater 주의사항

펑크랜드에서 자주 사용되는 메소드인 RunLater의 주의사항에 대해 알아봅니다.

RunLater 사용


RunLater함수는 실행 순서를 순차적으로 제어하는데 사용 됩니다. 아래는 예시 코드입니다.

--2초 뒤 Hello, World 출력하기
Client.RunLater(function()
 print("Hello, World") 
end, 2)

위와 같이 n초 뒤 첫번째 파라미터로 넘겨진 익명함수를 실행하게 됩니다. 이를 사용하여 특정 시간이 지난 후에 원하는 작업을 수월하게 제어할 수 있습니다.

시간 간격 보장 문제


RunLater 함수는 시간이 경과한 후에 함수를 실행하기 때문에, 게임의 프레임 속도에 영향을 받지 않습니다. 따라서, 정확한 시간 간격을 보장하지 않습니다. 아래 예시를 살펴보겠습니다.

-- 1초마다 메시지 출력
local startTime = os.time()

local function printMessage()
    local currentTime = os.time()
    local elapsedTime = currentTime - startTime
    print("경과 시간: " .. elapsedTime .. "초")
end

local function runLaterExample()
    Client.RunLater(function()
        printMessage()
        runLaterExample()
    end, 1)
end

runLaterExample()

위의 예제에서는 1초마다 경과 시간을 출력하는 함수를 RunLater를 사용하여 반복적으로 실행하도록 설정하였습니다. 하지만 RunLater 함수는 정확한 시간 간격을 보장 받지 않기 때문에, 실제로는 1초 보다 조금 더 긴 시간이 경과할 수 있습니다.

성능 문제


RunLater 함수는 게임의 메인 스레드에서 실행되므로, 오래 걸리는 작업을 실행하면 게임의 성능에 영향을 줄 수 있습니다. 만약 RunLater를 이용해 오래 걸리는 작업을 해야 한다면, 별도의 처리가 필요할 수 있습니다.

-- 5초 후에 오래 걸리는 작업 실행
Client.RunLater(5, function()
    -- 오래 걸리는 작업
    for i = 1, 1000000000 do
        -- 작업 수행
    end
end)

위의 예제에서는 5초 후에 오래 걸리는 작업을 실행하도록 설정하였습니다. 이 작업은 매우 오래 걸리는 작업이므로, 게임의 성능에 부정적인 영향을 줄 수 있습니다.

아래 예제에서는 그 중, 오래 걸리는 작업을 여러 단계로 나누어 처리하고, 각 단계마다 짧은 시간 동안 작업을 수행한 후 다음 단계로 넘어가는 예제를 확인해 보겠습니다.

local totalIterations = 1000000000
local iterationsPerFrame = 1000000
local currentIteration = 0

local function performWork()
    for i = 1, iterationsPerFrame do
        -- 작업 수행
        currentIteration = currentIteration + 1
        if currentIteration >= totalIterations then
            -- 작업 완료
            print("작업이 완료되었습니다.")
            return
        end
    end

    -- 다음 프레임에 작업 계속 수행
    Client.RunLater(performWork, 0)
end

-- 첫 번째 프레임에서 작업 시작
performWork()

Lua스크립트는 별도로 다중 스레드 기능을 제공하지 않음으로, 다른 방법을 사용하여 오래 걸리는 작업을 처리할 수 있습니다.

위의 예제에서는 오래 걸리는 작업을 100만 번씩 나누어 처리하도록 설정하였습니다. 각 프레임마다 100만 번의 작업을 수행하고, 작업이 완료되지 않았다면 다음 프레임에 작업을 계속 수행하도록 설정합니다.

유효성 보장 문제


n초 뒤에 실행되는 RunLater는 대기 이후 동작의 유효성을 보장할 수 없습니다. 예를 들어, 내가 접근하려는 개체가 n초 뒤에는 파괴되었을 수 있기 때문입니다.

local text = Text()
Client.RunLater(function()
    text.text = "Hello, World"
end, 2)

text = nil
print(text.text)

위 예제는 2초 뒤에 Text 개체의 속성에 접근합니다. 하지만, 2초 사이에 Text 개체가 파괴되었다면 에러가 날 수 있습니다. 따라서, RunLater 안에서 개체에 접근하려면 유효성 검사를 해주는 것이 좋습니다.

local text = Text()
Client.RunLater(function()
    if text ~= nil then
        text.text = "Hello, World"
    end
end, 2)

위와 같이 객체가 파괴된 후에도 RunLater 함수가 실행되는 경우를 대비하여 유효성 검사를 해주는 것이 좋습니다. 이러한 방법을 사용하여 객체가 파괴되는 경우에도 유효성을 보장할 수 있습니다.

Previous서버와 통신하기NextHTTP 요청 보내기

Last updated 1 year ago