12
28

 

 

 

최근 쉐이더 분석해보던중 Ping-Pong 버퍼링을 알게되었습니다.

게임 개발에서 자주 사용되는 Ping-Pong 버퍼링(더블 버퍼링)에 대해 알아보겠습니다. 

 

Ping-Pong 버퍼링이란?

Ping-Pong 버퍼링은 두 개의 버퍼를 번갈아가며 읽기와 쓰기 작업을 수행하는 기법입니다.

마치 탁구(ping-pong)에서 공이 양쪽을 오가는 것처럼, 데이터가 두 버퍼 사이를 왔다갔다 하면서 처리됩니다.

작동 원리

 

1. 기본 구조

public class FboPingPong {
    private RenderTexture[] _buffer = new RenderTexture[2]; // 두 개의 버퍼
    private int _readTex = 0;  // 읽기 버퍼 인덱스
    private int _writeTex = 1; // 쓰기 버퍼 인덱스
}



2. 버퍼 스왑 과정

public void Swap() {
    int temp = _readTex;
    _readTex = _writeTex;
    _writeTex = temp;
}

 

 

예시

 

물감이 종이에 번지는 과정

프레임 1:
[버퍼 A] = 물감을 찍은 초기 상태
[버퍼 B] = 물감이 번진 상태를 계산

프레임 2:
[버퍼 B] = 이전에 번진 상태를 기준으로
[버퍼 A] = 더 번진 상태를 계산

 

유체 시뮬레이션


프레임 1:
[버퍼 A] = 현재 물 표면 상태
[버퍼 B] = 파동 계산 결과

 

프레임 2:
[버퍼 B] = 이전 파동 상태
[버퍼 A] = 새로운 파동 계산

코드 예시

수목화 효과

public class WatercolorEffect : MonoBehaviour {
    private FboPingPong _buffers;
    private Material _material;

    void Start() {
        // 버퍼 초기화
        _buffers = new FboPingPong(width, height);
    }

    void Update() {
        // 1. 현재 상태 읽기
        _material.SetTexture("_MainTex", _buffers.GetReadTex());
        
        // 2. 다음 상태 계산
        Graphics.Blit(_buffers.GetReadTex(), _buffers.GetWriteTex(), _material);
        
        // 3. 버퍼 스왑
        _buffers.Swap();
    }
}

 

장점


 데이터 일관성
   - 계산 중에 원본 데이터가 변경되지 않음
   - 안정적인 결과 보장

메모리 효율
   - 두 개의 버퍼만으로 복잡한 처리 가능
   - 추가 메모리 할당 최소화

성능 최적화
   - GPU 메모리 접근 최적화
   - 병렬 처리 가능

 

 

주의사항

초기화
   - 버퍼 생성 시 적절한 포맷과 크기 설정
   - 사용 후 메모리 해제 필수

동기화
   - 읽기/쓰기 작업의 순서 관리
   - 프레임 간 일관성 유지

메모리 관리
   - RenderTexture 사용 시 적절한 해제
   - 불필요한 버퍼 스왑 피하기

 

Ping-Pong 버퍼링은 게임 개발에서 복잡한 이미지 처리나 시뮬레이션을 구현할 때 필수적인 기법입니다.

특히 Unity의 셰이더 시스템에서 이 기법을 활용하면 효율적이고 안정적인 처리가 가능합니다.

이 기법을 잘 이해하고 활용하면, 물리 기반 시뮬레이션이나 고급 이미지 효과 등 다양한 기능을 구현할 수 있습니다.

 

관련 자료

https://www.reddit.com/r/FPGA/comments/xvmfrx/can_someone_explain_what_is_a_ping_pong_buffer/

 

From the FPGA community on Reddit

Explore this post and more from the FPGA community

www.reddit.com

https://discussions.unity.com/t/help-with-simple-ping-pong-buffer/945063

 

 

COMMENT