게임 엔진

Short Introduction

우리가 자주 하는 게임에서 사용되는 게임 엔진이 무엇인지 알아보고 공부를 통해서 직접 게임 엔진을 제작하는 프로젝트를 진행하였습니다.

Content

  • 프로젝트 진행 동기

C++이나 C#계열의 언어의 경우 .NET, Unity, Unreal Engine, SDL 등등 게임관련 프레임워크가 많은데 비해, Python에서는 유독 이런 부분이 부족하다는 생각이 들었습니다. Pygame과 Pyglet와 같은 여러 종류의 라이브러리들이 존재하고 있지만, Pyglet은 GPU를 사용할 수 있고, Pygame은 SDL wrapper라 CPU를 렌더링에 쓴다는 문제점이 있었습니다. 둘 모두 추가 기능으로 OpenGL을 사용할 수 있지만, OpenGL을 그대로 포함시켜놓은 것이라 그래픽 관련 지식이 없는 사람은 이를 다루기가 굉장히 어렵습니다. 그렇기에 OpenGL을 기본 렌더러로 가지고 몇몇 함수들만 사용하더라도 쉽게 이미지를 그려낼 수 있는 새로운 게임엔진을 만들어보고자 이 프로젝트를 시작하게 되었습니다.

  • 프로젝트의 진행 과정

PyOpenGL, GLFW, Nuitka등을 사용해 실제 창을 만들고 그 안에서 메인루프안에 지정한 대로 이미지를 그려내는데 성공하였습니다. PySide를 추가로 불러와 초반에 pillow로 이미지를 바이너리 상태로 로드하는데 오래걸리는 문제점을 개선하였습니다. Nuitka는 앱 패키징에 사용됩니다. 순서는 Python->C++->Binary로, 최대 파이썬의 성능을 3배 정도 개선시킬 수 있기에, 인터프리터 언어인 파이썬의 단점을 보완할 수 있다고 생각합니다.

  • 프로젝트의 결과

크롬의 오프라인 상태시 등장하는 공룡게임의 구현에 성공하였습니다.

실제 OpenGL에 비해 매우 간단해진 코드:

    if dinosaur_jump:

        if dinosaur_while_jump > 0:

            dinosaur_y -= 0.5 / DINOSAUR_JUMP_CONST

            dinosaur_while_jump -= 1

        else:

            dinosaur_jump = False

            dinosaur_while_jump = DINOSAUR_JUMP_CONST

            dinosaur_y = 0.6

    # print(dinosaur_jump, dinosaur_while_jump, dinosaur_y, keystate)

    px_texture.drawImage(

        centerX=-0.8,

        centerY=-dinosaur_y,

        textureID=dinosaur_1,

        ratio=2,

    )

    px_texture.drawImage(

        centerX=-(glfw.get_time() / 2 – math.floor(glfw.get_time() / 2)) * 2 + 1,

        centerY=0.8,

        textureID=moon_4,

        ratio=1.5,

    )

drawImage함수 하나로 OpenGL의 Rect를 그려내는 과정과, 이미지를 텍스쳐에 매핑시키는 과정을 생략 가능

  • 프로젝트 진행 소감

키보드 입력과 네트워킹 부분도 구현할 예정이었으나, 시간부족으로 이는 완성하지 못했습니다. 추후에 스레드를 분리 시켜서 비동기적 입력을 받을 수 있도록 할 예정입니다. 하지만 OpenGL을 공부하는 중 vulkan에 대해 알게 되어 그래픽 부분에서부터 다시 제작해야 할 수도 있습니다.

Attachments


About

본 글은 2022년도 2학기에 22 임도현, 22 송윤우 연구회원이 진행한 프로젝트입니다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다