사이드 프로젝트/Voxel System

[Voxel System] 2025-04-09 ~ 2025-04-18 구조변경

라일라엘 2025. 6. 14. 18:33
반응형

2025-04-09

청크 테스트를 마치고, 여러 개의 큐브를 하나의 청크로 묶는 과정을 하나의 클래스에서 처리하도록 수정했다.

어차피 모든 청크들이 큐브를 묶을 땐 동일한 동작을 할 텐데, 이 과정에서 많은 가비지가 발생할 것으로 보여서 별도의 클래스로 만들었다. 최대한 데이터를 캐싱할 수 있도록 구현했다.

후기

CubeGenerator의 구조를 어떻게 설계해야 할지 아직 감이 잘 오지 않는다. 나중에 LOD를 구현하는 것도 고려해봐야 하는데, 일단 나중에 생각해 보자.

2025-04-12

기존에 테스트로 하나의 청크만 사용되도록 하는 구조를 큐브의 개수에 맞게 청크가 늘어나는 방향으로 수정했다.

후기

지금은 큐브에 메시와 렌더러가 컴포넌트로 들어가 있고, 큐브의 개수만큼 게임 오브젝트가 늘어나는 구조이다. 근데 생각해 보니 굳이 이럴 필요가 없어 보여서, 메시만 가지고 있는 클래스를 두는 방식으로 해도 될 거 같다. 심지어 플레이어의 주변에 있는 메시만 변경되고 멀리 있는 청크는 청크 게임 오브젝트만 있으면 되니까 플레이어 주변에 있을 수 있는 최대 크기만큼의 큐브만 캐싱해 두고 관리하면 될 거 같다.

지금 시점에서도 최적화할 수 있는 여지가 상당히 있어서, 이 부분이 개선되고 난 뒤에 LOD를 도전해도 되겠다

2025-04-13

Cube 자체를 렌더링 하기 위해선 게임오브젝트가 필요했는데, 실제로 대부분의 Cube는 Chunk가 렌더링을 해줄 것이기 때문에 그만큼 게임오브젝트가 필요하진 않았다. 따라서 Cube를 렌더링 하기 위해 필요한 데이터(메시, 위치, 서브메시 인덱스 등)는 Cube가 가지고 있고, 렌더링 하기 위해서 필요한 컴포넌트를 들고 있는 클래스인 CubeRenderer를 추가하여 기존 기능을 나눴다.

이로써 필요한 만큼 게임 오브젝트를 생성하기 때문에 메모리 사용량이 줄어들 것으로 예상되고, 불필요한 이벤트 함수가 호출되지 않을 것이다.

후기

코드에 주석을 달며 하나씩 수정하다 보니 Cube는 Scalar값을 따로 리스트의 형태로 가지고 있었다. 이 부분이 조금 아쉬웠는데, 직접 값을 가지고 있는 방식보다는, 참조를 해서 가져오는 방식이 더 낫지 않을까 싶다.

기존 방식은 scalarField 변수가 수정되면 업데이트할 때 Cube객체 하나하나의 scalarField값을 수정해줘야 했었다. 하지만 scalarField 변수를 CubeGenerator에서 원본을 가지고 있고, 큐브가 이 값을 참조하는 방식으로 동작한다면, scalarField이 값이 수정되면 그냥 Cube를 업데이트하는 방식으로 한 번에 처리할 수 있을 것 같아 보인다. 당장 중요하진 않으니 나중에 생각해 봐도 되겠다!

2025-04-16

기존에는 Cube의 스칼라 필드를 변경하기 위해서 제너레이터의 SetScalar함수 → Cube의 ScalarValue 배열에 접근하여 처리를 해야 했다. 이 방법은 추후에 LOD를 적용하기 위해서 두 개의 스칼라 필드를 둘 때 적용하기 어렵다는 단점도 있고, 값을 바꾸기 위해 두 번의 참조가 필요하다는 점에서 아쉬웠다. 따라서 Cube가 제너레이터의 스칼라 필드 값을 참조하고, SetScalar함수로 스칼라 값을 변경하면 Cube가 자동으로 바뀌도록 수정했다.

하지만 적용하고 있는데, 어디에서 값이 틀어지는지 자꾸 메시가 엉뚱하게 나오고 있다.. 디버깅하는데 시간이 너무 오래 걸리고 있어서, 일단 여기에서 스톱하기로 했다.

후기

메시를 다루는 부분이 생각보다 디버깅하기 까다로웠다. 좀 더 효과적으로 디버깅할 수 있는 방법이 있을지 생각해 보는 것도 좋아 보인다.

요즘 잠을 잘 못 자서 더 버그가 안 보이는 것도 한몫하는 것 같다. 이만 정리하고 내일 다시 보자

2025-04-18

이전에 렌더링이 안되던 문제는 파라미터로 넘겨준 값을 사용하지 않은 문제였다.. 잠을 못 자니 이런 게 안 보이는구나 싶었다.

겸사겸사 안 쓰는 주석도 제거하고, 요소의 개수가 변하지 않는 List를 배열로 바꿔줬다. 유의미하게 최적화가 될만한 수정은 아니지만, 그래도 이게 좀 더 보기에 명확할 거 같아 수정했다. 다른 모든 큐브에서 사용하는 값도 static으로 수정해서 공용으로 사용할 수 있도록 바꿨다.

이제 남은 건 LOD와 런타임에 큐브와 청크를 왔다 갔다 하며 바인딩했다가 푸는 부분인데, 로직을 어떻게 설계해야 할지 고민이다.

Update마다 마칭큐브 값을 계산할 텐데 Chunk는 그럴 필요가 없고, 최초 1회만 계산해 주면 된다. 더티플래그로 갱신된 애들만 수정하면 될 거 같은데, 어떤 식으로 로직을 만들지 잘 모르겠다. 방법만 알지 어떻게 연결해줘야 할지는 잘 모르는 점이 드러나는 거 같다.

728x90
반응형