Inflearn brand logo image

인프런 커뮤니티 질문&답변

케이초라님의 프로필 이미지
케이초라

작성한 질문수

C++을 이용한 자체 엔진 제작(유니티 엔진 클론코딩)

Layer 클래스

Gdiplus 이미지 띄울 시 급격한 프레임 저하

해결된 질문

작성

·

127

0

안녕하세요 얌얌님.

Gdiplus로 Ocean 이미지를 띄우면 급격하게 프레임이 떨어지는 문제가 있어서 문의드리게 되었습니다.

이미지를 띄우지 않았을 땐 2~3000프레임까지 나왔었는데,
Scene에서 Gdiplus::Image로 Ocean 이미지를 띄우면 100프레임으로 뚝 떨어지고,
Layer 계층을 추가해서 Image를 띄우면 4~5프레임까지 떨어져서 정상적인 조작이 불가능해집니다.

https://github.com/9kyo-hwang/Unity-Clone

강의 영상 보고 따라한 코드를 깃헙에 올려놓았는데, 혹시 확인 한 번 해주시면 감사하겠습니다...

답변 2

1

케이초라님의 프로필 이미지
케이초라
질문자

아이고 해결했습니다... 생각치도 못한 곳에서 문제가 발견됐네요.

 

namespace Unity
{
	Scene::Scene()
		: _layers(static_cast<size_t>(LayerTypes::Max, new Layer()))
	{
	}
}

기존에 이런 식으로 생성자에서 초기화 리스트 방식으로 레이어들을 담는 벡터를 초기화해주고 있었는데, 이런 식으로 하니까 무슨 원리인지는 정확히 모르겠는데 디버깅으로 확인해보니까 안에 들어있는 Layer들의 데이터가 전부 동일하더라구요...? 얕은 복사가 일어난 건지 모두 같은 객체마냥...

 

namespace Unity
{
	Scene::Scene()
		: _layers(static_cast<size_t>(LayerTypes::Max))
	{
		for (Layer*& layer : _layers)
		{
			layer = new Layer();
		}
	}
}

이런 식으로 반복문으로 일일이 new Layer 해주니 프레임 저하 현상이 사라졌습니다 :)

0

안녕하세요, 인프런 AI 인턴입니다.

Gdiplus를 이용하여 이미지를 출력할 때 급격한 프레임 저하가 발생하는 문제는 성능 최적화와 관련이 깊습니다. 특히 이미지 처리와 그래픽스 파이프라인에서 발생할 수 있는 문제 중 하나는 대량의 픽셀 데이터 처리로 인한 CPU 및 메모리 사용 증가입니다.

  1. 이미지 로딩 및 캐싱: 매 프레임마다 이미지를 새로 로딩하지 않도록 하고, 가급적 제자리에서 재사용하며 필요한 경우에만 갱신하는 방식으로 성능을 개선할 수 있습니다.

  2. 이미지 포맷 및 사이즈: 이미지를 최적화된 포맷과 크기로 변환하는 것도 성능에 큰 영향을 줄 수 있습니다. 과도한 해상도의 이미지는 컴퓨터 리소스를 많이 소모할 수 있기 때문에 경우에 따라 더 낮은 해상도로 변환 후 사용하도록 합니다.

  3. 레이어링: 여러 레이어를 사용하는 경우, 각 레이어의 불필요한 부분을 클리어하거나 완전 투명한 레이어는 스킵함으로써 성능을 향상시킬 수 있습니다.

  4. 프레임비율 측정: 코드에서 프레임비율을 측정하고 CPU 및 GPU 사용률과 메모리 활용도를 확인하여 병목이 발생하는 부분을 구체화할 수 있습니다.

기타 자세한 성능 최적화 방법에 대한 논의는 강의 토론 게시판에서 비슷한 문제가 논의되었던 기록이 있어, 이를 참조하셔서 문제 해결에 도움이 되실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

얌얌코딩님의 프로필 이미지
얌얌코딩
지식공유자

gdi plus는 회전, 투명도 처리 등등 다양한 기능을 제공하지만 연산양이 매우 많은 친구입니다.
플레이어정도에 사용하길 추천드리며 조금 불편하더라도 회전에 관한 처리가 없다면 bitblt, transparentblt 등등을 사용해주셔야 합니다.

케이초라님의 프로필 이미지
케이초라
질문자

아하 그렇군요... Gdiplus 이미지를 띄우냐 안띄우냐에 따라 프레임이 급격하게 달라지길래 해당 객체가 많이 무겁겠거니 하고 있었는데...

그런데 현재 섹션 13의 Layer 계층 추가가 이뤄진 상태에서 Gdiplus Image를 한 장 띄웠는데 프레임이 4~5가 뜨는 것이면, 사실상 특별한 처리 없이는 정상적인 사용이 안되지 않나...?란 의문이 생기네요.

우선은 Gdiplus 방식을 사용하지 않고 bmp 이미지를 띄우는 것으로 대체하는 식으로 진행해도 괜찮을까요...?

케이초라님의 프로필 이미지
케이초라

작성한 질문수

질문하기