확장팩 FFF 모음 정리 링크



오늘 FFF 내용은 기술적인 내용이 무척 많음

나도 완벽히 이해하고 번역한게 아니니 잘 아는사람 오역있으면 댓좀

특히 아래 최적화 부분


https://www.factorio.com/blog/post/fff-390



FFF #390 - 노이즈 표현식 2.0

게시자 Earendel, Genhis

2023-12-22



안녕하세요,

맵 생성 방식에 대한 설명 요청을 많이 받았습니다. 노이즈 표현식을 먼저 설명하지 않고 맵 생성에 대해 이야기하기는 어렵습니다. 노이즈 표현식은 게임에서 매우 중요한 부분이기 때문에 언젠가는 이야기해야 하지만, 실제로 노이즈 표현식이 무엇인지 높은 수준에서 잘 설명한 적은 없었던 것 같습니다. 앞으로 행성의 맵 생성 방식에 대해 다시 자세히 살펴보겠지만, 지금은 기본 개념을 소개하고 나중을 위한 튜토리얼 역할을 하도록 하려고 합니다.






노이즈 표현식이란 무엇인가요? - Earendel


"표현식(Expression)" 부분


팩토리오에서 게임 월드를 만들 때는 무엇이 어디에 배치될지 결정해야 합니다. 실제로 작업해야 하는 것은 X와 Y 위치뿐입니다. 지형 생성기는 이미 배치된 것에 대해 아무것도 알 수 없습니다. 어떻게든 X와 Y를 배치할 타일 유형으로 변환하고 어떤 나무, 바위, 자원, 장식물, 절벽 또는 적을 배치할지 결정하는 코드가 필요합니다.







X와 Y가 모두 0인 지도의 중앙이 원점이자 시작 위치입니다. 원점으로부터의 거리를 계산하여 '원뿔'을 구하고 이를 사용하여 일정 값 이상이면 육지, 그 미만이면 물로 표시되는 원형 섬을 만들 수 있습니다.




(위 이미지는 실제 크기와 동일하지는 않습니다.)



비록 항상 두 타일의 확률을 한꺼번에 변경할 필요는 없지만, 원하는 타일이 원하는 위치에 가장 큰 영향을 미치도록 하면 됩니다. 예를 들어, 땅은 항상 '가중치'를 1로 설정한 다음 물이 나타나기를 원할 때 가중치를 1보다 높게 설정하면 됩니다.


거리 함수에 들어가기 전에 X 및 Y 좌표에 값을 추가할 수 있으면 원뿔을 다른 위치로 이동합니다. 오프셋 원뿔을 사용하여 새 섬을 만들거나, 기존 섬에 섹션을 추가하거나, 새 원뿔을 반전시켜 섬에서 일부 덩어리를 제거할 수 있습니다.






또한 절대값, 모듈러 연산, 지수, 삼각함수 등 대부분의 산술 연산자가 있습니다. 삼각 함수는 오프셋을 사용하는 대신 위치를 회전하는 데 사용할 수 있으며, 이것이 바로 불카누스의 시작 영역을 만들때 사용한 주요 비결입니다.





표현식의 핵심은 다음과 같이 이러한 연산을 서로 연결할 수 있다는 것입니다: test_1 = A + B * C. 또한 하나의 노이즈 표현식이 다른 표현식의 출력을 참조하도록 할 수도 있습니다(예: test_doubler = test_1 * 2).


이 모든 것이 훌륭하고, 원한다면 흥미로운 크롭 서클 패턴을 만들 수 있지만 이건 자연적인 풍경에는 적합하지 않습니다. 그러기 위해서는 약간의 노이즈가 필요합니다.








"노이즈" 부분


지형 생성에서 노이즈는 소리를 의미하는 것이 아니라 단지 임의의 랜덤한 숫자, 즉 난수를 의미합니다.


난수를 만들 때 가장 기본적인 설정은 필요할 때마다 완전히 무작위 숫자를 생성하는 것입니다. 이를 비일관성(incoherent) 노이즈라고 하며 어떤 부분도 다른 난수들과 관련이 없습니다. 확대하면 더 완전한 무작위성을 얻게 되므로 유용성이 상당히 제한됩니다.





일관적(Coherent) 노이즈는 다릅니다. 주변 위치가 비슷한 값을 가질 수 있도록 X 및 Y 좌표를 잘 활용합니다. 즉, 풍경 위로 이동하면 사물이 부드럽고 일관되게 변화합니다.


우리가 사용하는 주요 일관적 노이즈는 FFF-112의 기본 노이즈(펄린 스타일 노이즈)입니다. 출력 값은 대략적인 피처 크기로 끝납니다. 축소하면 비일관성 노이즈와 구분할 수 없지만, 확대하면(피처를 더 크게 만들면) 거의 평평해질 때까지 모든 점이 이웃된 점과 부드럽게 연결되는걸 관찰할 수 있습니다.





대륙에는 큰 크기의 노이즈를, 섬과 만에는 중간 크기의 노이즈를, 해안선을 좀 더 세분화하기 위해 작은 노이즈를 사용할 수 있기 때문에 이 방법이 좋습니다. 이것이 프랙탈 노이즈의 기본 개념입니다. 크기가 다른 여러 레이어가 함께 중첩되고, 특정 영역에 작은 디테일을 추가할수록 영향력이 점차 줄어드는 작은 레이어가 추가됩니다.





다음 유형의 노이즈는 스팟 노이즈(Spot Noise)입니다. 지형에 일정한 간격을 두고 여러 개의 스팟을 생성합니다. 일반적으로 광석 배치에 사용하는 방식입니다. 각 스팟은 실제로 원뿔 모양이므로 각 패치 중앙에 더 많은 광석을 배치할 수 있습니다. 그런 다음 광석 원뿔은 약간의 기본 노이즈를 추가하여 교란되므로 깨끗한 원이 아닙니다. 스팟 노이즈에 대해 자세히 알아보려면 FFF-258을 확인하는 것이 좋습니다.





왼쪽 : 노이즈가 추가되기 전의 나우비스 자원 원뿔.

오른쪽 : 자원 원뿔이 반영된 일반적인 나우비스 맵.






모든 것을 섞기


진정한 힘은 이러한 것들을 예술적으로 제어하고 이를 효율적으로 수행하는 데 필요한 수학을 찾아내는 데서 나옵니다. 다음은 몇 가지 예시입니다:


스팟 노이즈는 자원뿐만 아니라 화산에도 사용할 수 있습니다. 고도에 거대한 스팟 원뿔을 추가하여 주 화산 몸체를 만듭니다. 산봉우리 끝을 '마이너스'방향으로 뒤집어 용암 구덩이를 만들 수도 있습니다.





이러한 종류의 반전은 어떤 경우에는 매우 중요합니다. 대부분 물로 이루어진 지도를 만들고 싶다면 고도를 낮추면 되지만, 이렇게 하면 수많은 섬이 생기는 경향이 있습니다. 대부분 물로 이루어졌지만 육지가 모두 연결되게 하려면 어떻게 해야 할까요?


이를 위해 절대값을 사용하고 음수 값을 양수로 반전시킬 수 있습니다. 그런 다음 반전하면 모든 값이 음수이지만 작은 덧셈을 통해 좁은 구간이 양수 영역으로 바뀝니다. 이렇게 하면 거의 항상 연결되는 일련의 좁은 땅길이 만들어집니다. 불카누스 용암 지역에서는 미로를 통과할 수 있는 길이 있는지 확인하기 위해 이러한 패턴을 사용합니다.










노이즈 도구 - Earendel


Wube에 합류하기 전에는 우주 탐사 모드를 위한 새로운 행성을 개발 중이었으며 지금도 개발 중입니다. 우주 탐사 모드에서 각 행성 유형은 우주 시대 DLC의 행성처럼 독특한 맵을 생성합니다. 완전히 새로운 행성을 하나만 만드는 것은 엄청난 작업량이기 때문에 14개 이상의 새로운 유형을 만들기 시작할 때 저는 프로세스를 더 쉽게 만들기 위해 몇 가지 새로운 도구를 만드는 데 투자하기로 결정했습니다. 그 결과 다양한 기능을 갖춘 저만의 노이즈 툴 세트를 만들게 되었습니다:


- 자동 청소 기능으로 테스트 속도가 훨씬 빨라집니다.

- 행성 전환 프리셋을 통해 다른 행성을 미리 볼 수 있습니다.

- 지도 미리보기 화면에서 노이즈 표현식 값을 조정할 수 있도록 임시 디버그 슬라이더를 추가하는 편리한 방식입니다.

- 마지막으로, 지도 미리보기를 사용하여 노이즈 표현 출력을 직접 시각화할 수 있는 기능도 있습니다.


마지막 내용인 노이즈 시각화는 정말로 중요한 기능입니다. 이 기능이 없으면 시스템의 출력을 살피기 매우 어렵습니다. 예를 들어 맵의 기존 모래를 노란색 버전에서 빨간색 버전으로 바꾸는 새로운 코드를 추가했다고 가정해 보겠습니다. 게임을 로드하고 돌아다니는데 붉은 모래가 보이지 않습니다. 무엇이 잘못되었을까요? 여러 가지 이유가 있을 수 있습니다. 실제로는 제대로 작동하지만 공교롭게도 빨간색으로 표시되어야 할 영역이 모래가 아닌 바다와 풀 아래에 있을 수도 있습니다. 넓은 지역을 탐험했는데도 빨간 모래를 찾지 못했다면 어딘가 고장 났을 가능성이 더 크지만, 어디서 고장 났을까요?


노이즈 시각화 도구를 사용하면 특정 노이즈 표현식을 선택하고 미리보기 화면에서 이미지로 변환할 수 있습니다. 이를 통해 표현식의 분포와 출력 값 등을 확인할 수 있습니다. 예를 들어 눈금이 생각보다 너무 커서 10km까지 가야 차이를 찾을 수 있다거나 출력 범위가 너무 작아서 확인할 수 없을 정도로 강하지 않다거나 한 값이 실수로 음수가 되어 다른 음수와 곱해져 다른 예상치 못한 문제가 발생할 수 있다는 등의 정보를 얻을 수 있습니다.




왼쪽 : 일반적으로 볼 수 있는 나우비스 지도.

오른쪽 : 나우비스 고도. 파란색은 해수면 아래의 고도이며, 값이 어두울수록 더 깊습니다. 노란색은 높음을, 녹색은 매우 높음을 나타냅니다. 바다와 절벽 배치에 사용됩니다.



이 기능은 여러 생물군계와 같은 작업을 할 때 정말 빛을 발합니다. 일반적으로 타일의 변화만을 지표로 삼는다면 한 생물군계에서 다른 생물군계로 이동할 때 변화가 일어났다는 것을 알 수 있지만, 그 변화의 속도가 어떤지는 알 수 없습니다. 변화율이 완만할수록 건조해짐에 따라 식생이 희미해질 수 있지만, 일반적으로 이를 미리 알 수 있는 방법은 없습니다. 시각화 도구를 사용하면 최대 255개의 서로 다른 값을 표시하고 그라데이션을 보여줄 수 있으므로 생물군계의 경계가 딱딱한지 부드러운지 알 수 있습니다.




왼쪽: 벌카누스 고도. 파란색은 해수면 아래의 고도이며, 어두운 색일수록 깊습니다. 노란색은 높음, 녹색은 매우 높음.

오른쪽: 벌카누스 온도. 검은색은 차갑고, 빨간색은 따뜻하며, 노란색은 뜨겁습니다. 뜨거운 타일셋을 배치하는 데 사용됩니다.



게임 엔진의 일부가 아닌 모드로 실행되기 때문에 작동 방식은 여전히 약간 엉성합니다. 기본적으로 게임의 모든 타일을 가져와서 맵 색상을 검정색에서 흰색으로, 또는 파란색 > 빨간색 > 녹색으로 변경한 다음 시각화하려는 노이즈 표현에 따라 해당 타일이 어딘가에만 나타나도록 재할당합니다. 0 이하의 값에는 파란색을, 0 이상의 값에는 다른 색상을 사용하면 영점 전환이 매우 선명해지기 때문에 고도에 매우 유용하며, 이는 해안선에 중요한 영향을 미치기 때문에 매우 중요합니다. 시각화 도구는 이처럼 실제로 게임을 플레이할 수는 없지만 새로운 행성의 초기 단계나 무언가를 디버깅하려고 할 때 매우 유용합니다.


그래서 자연스럽게 Wube에서 행성을 만들기 시작하면서 우주 시대 DLC에도 사용할 수 있도록 도구를 업데이트했습니다. 이 툴을 사용하면 행성 작업 속도가 10배 정도 빨라진다고 자신 있게 말할 수 있습니다.


그뿐만 아니라 Genhis와 저는 멋진 새 노이즈 기능을 개발 중이며, 나중에 새로운 행성과 함께 공개할 예정입니다. 새로운 기능에는 설정이 많아서 노이즈 툴이 없었다면 이 모든 기능을 작동시키기가 쉽지 않았을 것입니다. 사실 노이즈 툴이 없었다면 새로운 시스템의 모든 기능을 완성할 수 있었을지 의문이 듭니다.


확장팩이 출시되면 2.0용 노이즈 도구도 함께 출시할 예정입니다.







C++로 지도 생성 - Genhis


첫 번째 불카누스 맵 생성 오버홀을 병합했을 때, 게임을 실행하고 행성 지형을 생성할 때 속도가 상당히 느려지는 것을 발견했습니다. 플레이어 입장에서는 가벼운 불편일 수 있지만 디버그 버전을 하루에 여러 번 실행하다 보니 눈에 띄게 느려졌습니다. 그래서 멋진 맵 생성을 포기하거나 시간을 들여 더 빠르게 만들거나 둘 중 하나를 선택해야만 했습니다.


맵 생성은 가능한 경우 이미 여러 스레드에서 실행되고 있으며, SIMD 실행(단일 명령어, 다중 데이터)을 위해 코드를 최적화하려고 노력합니다. 따라서 런타임 맵 생성은 충분히 효율적이며, 일반적으로 불카누스에서 관찰한 것과 일치했습니다. 문제는 다른 곳에 있었습니다. 노이즈 표현식을 점점 더 깊이 파고들면서 몇 가지 개선해야 할 부분을 발견했습니다.


C++에서 노이즈 표현식은 수학 연산의 추상 구문 트리(AST)를 나타냅니다. 각 노이즈 표현식은 자식을 저장하는 클래스 인스턴스입니다. 무슨 뜻인지 잘 모르겠다면 다른 가방을 담을 수 있는 가방이라고 생각하면 됩니다. 하드웨어 한계까지 결합하고 중첩할 수 있습니다. 이 구조는 Lua에서 완전히 구축되었습니다. 지도 표면이 생성되면 노이즈 표현식이 노이즈 프로그램으로 컴파일됩니다. 일반적으로 각 NamedNoiseExpression은 프로그램의 프로시저입니다. 프로시저는 여러 단계에서 데이터를 재사용할 수 있기 때문에 유용합니다. 프로시저에는 이미 종속성이 해결된 선형 노이즈 연산 시퀀스가 포함되어 있으므로 이후 연산에 대한 자식이 이미 계산되었음을 보장할 수 있습니다. 이 구조는 모든 데이터가 필요할 때 빠르게 계산하는 데 최적화되어 있으므로 IF문 같은 일부 단락을 쉽게 변경이 가능합니다. 또한 노이즈 표현식이 컴파일되기 전에 재귀적으로 단순화되어 모든 자식이 상수인 경우 상수로 접을 수 있습니다. 일부 변수는 맵 설정에 따라 달라지므로 이 단계를 더 빨리 수행할 수 없습니다.




1.1의 노이즈 표현식 사이클





내부 구조 최적화


시스템이 한계에 부딪힐 것으로 예상되지 않았기 때문에 코드에서는 동일한 표현식을 중복하지 않고 별도로 할당했습니다. 기본 게임에서는 31,000개의 오브젝트를 할당했고, 불카누스에서는 그보다 훨씬 많은 280,000개의 오브젝트를 할당했습니다. 해시를 기반으로 표현식을 캐시하고 전체 오브젝트를 먼저 구성하지 않고도 검색할 수 있는 글로벌 스토리지를 추가했습니다. 그 결과 오브젝트 수가 5,300개로 줄었고 125MB의 RAM을 절약할 수 있었습니다.


중복 표현식이 너무 많다는 것은 분명 재사용하지 않는 다른 곳도 있다는 뜻이겠죠? 예를 들어, 단순화 단계가 그렇습니다. 상수 폴딩을 적용할 기회를 찾았을 때, 하나의 표현식을 상수로 대체하기 위해 AST의 전체 분기를 다시 만들어야 했습니다. 이 단계에서는 영구적으로 할당된 표현식의 수(불카누스의 경우 200,000개)만큼 많은 임시 객체가 생성되었습니다. 저는 이를 컴파일 단계로 통합하여 "제때" 표현식을 단순화하고 싶었습니다. 이 시도는 성공적이었고, 비효율적인 노이즈 표현식 트리에서 불카누스 표면을 생성하는 속도가 15배 빨라졌습니다.





최적의 노이즈 표현식을 작성하는 것이 어렵다는 점을 염두에 두고 리팩토링을 계속했습니다. 제 목표는 컴파일러가 최적화 단계에서 모더를 돕는 것이었습니다. 그래서 여러 프로시저에서 사용되는 표현식을 중복 제거하려고 했습니다. 새로운 시스템은 이를 별도의 프로시저로 추출하여 런타임에 그 결과를 재사용할 수 있도록 했습니다. 더 이상 `noise.delimit_procedure()`를 호출할 필요가 없으며 자동으로 수행됩니다!


하지만 여러 프로시저에서 어떤 표현식이 사용되는지 파악하는 것이 쉽지 않고 문제가 발생하기 시작했습니다. 완전히 중복 제거하려면 컴파일 성능을 희생해야 했고, 프로시저 간 종속성을 필요에 따라 계산하기 때문에 프로시저 실행을 요청하면 비용이 더 많이 들었습니다. 아직 미미한 수준이라 상관없겠지만 최적화하고 코드를 더 간단하게 만들 수 있는데 왜 비효율적인 작업을 해야 할까요?


그래서 저는 프로시저를 완전히 제거하기로 결정했습니다. 표면당 하나의 노이즈 프로그램 대신 세 개의 노이즈 프로그램(타일, 절벽, 엔티티 + 장식)이 생겼습니다. 이러한 부분은 개별적으로 실행되어 프로시저 결과를 재사용하지 않았습니다. 노이즈 표현식의 복잡성에 따라 결과가 달라지긴 했지만 런타임 맵 생성은 최대 20% 향상되었고 노이즈 프로그램 컴파일은 최대 50% 빨라졌습니다.


이제 노이즈 프로그램을 여러 개의 출력을 가진 하나의 프로시저로 생각할 수 있으며, 이는 장점이 있습니다. 종속성이 없고 모든 것이 인라인화되어 있습니다. 중간 결과가 더 이상 필요하지 않으면 메모리는 다른 노이즈 연산에 할당됩니다. 따라서 다소 간단한 버전이지만 스택 변수가 최적화되어 있는 긴 C++ 함수와 비슷합니다.







Lua 형식 관련 문제


Lua 노이즈 표현식 형식은 FFF-207에 도입되었습니다. 많은 사람들이 이 형식이 마법과도 같고 작업하기 어렵다고 주장하지만, 모더들에게 뛰어난 유연성을 제공하고 독특하고 분위기 있는 맵을 만들 수 있게 해줍니다. 그럼에도 불구하고 몇 가지 문제가 있습니다. `data.raw` 프로토타입 테이블을 덤프하면 상당 부분을 노이즈 표현식이 차지하는 것을 알 수 있습니다. 이는 각 AST 노드가 Lua 테이블인 형식이 매우 장황하기 때문입니다. 개별 문자열과 테이블을 너무 많이 생성하면 성능에도 영향을 미칩니다.


노이즈 라이브러리에서 제공하는 Lua 함수와 메타테이블을 사용하지 않았다면 'x + 5'를 계산하기 위한 형식은 다음과 같을 것입니다.


{

  type = "function-application",

  function_name = "add",

  source_location = {filename = ..., line_number = ...}, -- debug symbols, optional

  arguments =

  {

    {

      type = "variable",

      variable_name = "x",

      source_location = {filename = ..., line_number = ...}

    },

    {

      type = "literal-number",

      literal_value = 5,

      source_location = {filename = ..., line_number = ...}

    }

  }

}


읽기 힘들죠? 다른 함수 및 연산과 100배만큼 연결한다고 상상해 보세요. 노이즈 라이브러리는 이를 숨겨주지만 성능 저하와 "엉망인" 출력은 여전히 그대로입니다. 그래서 우리는 이를 변경하기로 결정했습니다.


저는 형식을 수학처럼 읽을 수 있게 만드는 일, 즉 문자열 표현식을 AST로 처리할 수 있는 구문 분석기를 만드는 일을 맡았습니다. 처음에는 최대한 성능을 절약하는 데 집착하다 보니 모놀리식 설계를 하게 되었습니다. 기능은 좋았지만 테스트, 유지보수, 확장이 어려웠습니다. 그러다가 다른 구문 분석기가 어떻게 하는지에 대해 알아보기 시작했습니다. 구문 분석기를 생성하는 외부 문법 도구를 사용하는 것도 고려했지만, 사용법을 배우는 데 시간을 투자할 가치가 없고 생성된 코드가 최적이 아닐 것이라고 생각했습니다. 결국 사내 솔루션을 선택하기로 결정했습니다.


구문 분석기는 세 개의 논리적 부분으로 나뉩니다.


1. 토큰화 도구는 문자 스트림을 처리하고 개별 문자 그룹을 토큰 유형으로 분류합니다. 연산자 문자 집합은 C++ 및 Lua 구문이 모두 지원되는 몇 가지 예외를 제외하고는 Lua를 기반으로 합니다. 일반 숫자 외에도 과학적 표기법을 지원하며 필요에 따라 다른 형식을 추가할 수 있습니다.


2. 접두사 토큰을 접미사(역 폴란드어) 표기법으로 변환하는 PostfixTokenizer. 이 단계는 연산자 우선순위 규칙을 따르고 결과 표현식이 모호하지 않은지 확인하는 역할을 합니다. 수정된 버전의 션팅 야드 알고리즘을 사용하여 데이터를 처리합니다.


3. 노이즈 표현식 파서, 포스트픽스 토큰을 받아 노이즈 표현식 트리(AST)로 변환합니다.





값비싼 Lua 문자열 연결을 피하기 위해 가능한 한 많은 것을 C++로 옮기고 싶었습니다. 그래서 노이즈 표현식을 확장하고 명명된 노이즈 함수를 프로토타입으로 정의할 수 있도록 했습니다. 또한 글로벌 프로토타입 테이블에 노출되지 않는 로컬 노이즈 함수와 표현식에 대한 지원도 추가했습니다. 이러한 개선 사항에 대해 더 말씀드릴 수 있지만, 이는 개조 문서에 더 적합하고 흥미로운 블로그 포스팅이 되지 않을 것 같습니다.


이제 모든 노이즈 표현식은 문자열에서 구문 분석되며, 2.0에서는 Lua 테이블을 사용하는 레거시 형식이 제거되었습니다. 이 모든 작업의 원래 문제와 관련하여, 프로토타입 초기화 시 노이즈 표현식의 시간이 50% 단축되고 결과적으로 프로토타입이 20% 더 빠르게 로드됩니다.




추가 작업


지도 생성을 개선하기 위한 여정은 여기서 끝나지 않았습니다. 프로토타입에서 정의한 노이즈 함수를 도입하면서 AST에 결과에 영향을 주지 않는 상수가 포함되는 빈도가 상당히 잦아졌습니다. 저는 산술 아이덴티티를 사용하여 부분적인 상수 폴딩을 구현하여 "1*x + 0"과 같은 식이 "x"로 폴딩되고 모든 청크에 대해 평가되지 않도록 했습니다.


또한 기본 노이즈(펄린 스타일 노이즈)를 효율적으로 사용하고 있지 않다는 것을 알게 되었습니다. 그리드에서 작업한다는 것을 알고 있기 때문에 특수한 경우(x=x, y=y)에 최적화되어 있습니다. 중간 타일 값을 재사용할 수 있으므로 일반적인 구현보다 5배 빠릅니다. x 및 y 매개변수를 사용하여 그리드를 오프셋하려는 경우 더 이상 특수한 경우로 해석되지 않습니다. 별도의 오프셋 매개변수를 추가하면 성능이 더욱 향상되었습니다.


지도 생성과 관련하여 더 많은 작업을 했지만 이 블로그 게시물에 모든 내용을 담을 수는 없었습니다. 예를 들어 노이즈 레이어 프로토타입을 제거하고 노이즈 기능을 더 추가했으며 기타 몇 가지를 조정했습니다. 하지만 약간의 타협이 필요했습니다. 배열 구성을 포함한 일부 노이즈 함수가 제거되었습니다. 요청이 있을 경우 새 구문 분석기에 배열 지원을 추가할 수 있지만, 지금은 더 시급한 문제가 있습니다.




결과


첫 번째 불카누스 세대 프로토타입 이후 여러 번의 반복 작업을 거쳤으며, 개별 노이즈 표현도 최적화되었습니다. C++ 개선과 함께 청크당 18.35ms가 걸리던 작업이 이제 2.83ms로 단축되어 매우 만족스러운 결과를 얻었습니다.


이 모든 것이 1.1에서 얼마나 바뀌었는지 알고 싶으실 겁니다:


- 기본 게임에서 프로토타입을 7% 더 빠르게 초기화하고 노이즈 표현 프로토타입에 소요되는 시간을 87% 줄였습니다.

- 나우비스 노이즈 프로그램은 85% 더 빠르게 컴파일됩니다.

- 절차 제거 덕분에 노이즈 작업이 줄어듭니다 (6,016건 → 2,233건).

- 이를 통해 청크 생성 속도가 평균 25% 빨라졌습니다 (4.8ms → 3.58ms).


전체적으로 노이즈 표현식 엔진의 약 90%가 처음부터 다시 작성되었습니다. 맵 생성의 C++ 작업을 하는 데 약 4개월이 걸린 것 같습니다. 시스템이 더 빨라졌을 뿐만 아니라 유지 관리가 더 쉬워지고 필요에 따라 새로운 노이즈 표현식 유형을 쉽게 추가할 수 있기 때문에 그만한 가치가 있었습니다. 설계하는 것은 재미있는 도전이었습니다. 맵 생성만을 위해 시스템이 약간 과도하게 설계되었을 수도 있지만, 적어도 다른 프로젝트에서 원한다면 재사용할 수 있는 탄탄한 기반을 갖추게 되었습니다.





또 그 때가 왔어요 - Earendel


수고하셨습니다. 끝까지 해내셨습니다. 메리 코그마스.





평소와 같은 장소에서 노이즈를 내고 자신을 표현하세요.