강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của thd2tn1756
thd2tn1756

câu hỏi đã được viết

Gói bài tập thực hành lập trình game của Hong Jeong-mo

1.3 Hương vị tương tác - Đầu vào và phản hồi bàn phím

15:00 부근 질문 있습니다.

Viết

·

413

0

#pragma once

#include "Game2D.h"

namespace jm
{
	class MyTank
	{
	public:
		vec2 center = vec2(0.0f, 0.0f);
		//vec2 direction = vec2(1.0f, 0.0f, 0.0f);

		void draw()
		{
			beginTransformation();
			{
				translate(center);
				drawFilledBox(Colors::green, 0.25f, 0.1f); // body
				translate(-0.02f, 0.1f);
				drawFilledBox(Colors::blue, 0.15f, 0.09f); // turret
				translate(0.15f, 0.0f);
				drawFilledBox(Colors::red, 0.15f, 0.03f);  // barrel
			}
			endTransformation();
		}
	};

	class MyBullet
	{
	public:
		vec2 center = vec2(0.0f, 0.0f);
		vec2 velocity = vec2(0.0f, 0.0f);

		void draw()
		{
			beginTransformation();
			translate(center);
			drawFilledRegularConvexPolygon(Colors::yellow, 0.02f, 8);
			drawWiredRegularConvexPolygon(Colors::gray, 0.02f, 8);
			endTransformation();
		}

		void update(const float& dt)
		{
			center += velocity * dt;
		}
	};

	class TankExample : public Game2D
	{
	public:
		MyTank tank;

		//MyBullet* bullet = nullptr;
		//MyBullet* bullet2 = nullptr;
		// bullet은 총알이 발사됐을 때만 존재하기 때문에 포인터로 되어있고 nullptr로 초기화가 되어있다.

		//TODO: allow multiple bullets
		int index = 0;
		std::vector<MyBullet*> ptr_bullet_array = { nullptr };

		//TODO: delete bullets when they go out of the screen

	public:
		TankExample()
			: Game2D("This is my digital canvas!", 1024, 768, false, 2)
		{}

		~TankExample()
		{
			//if (bullet != nullptr) delete bullet;
			//if (bullet2 != nullptr) delete bullet2;

			for (int i = 0; i <= index; ++i)
			{
				if (ptr_bullet_array[i] != nullptr)
					delete ptr_bullet_array[i];
			}
		}

		void update() override
		{
			// move tank
			if (isKeyPressed(GLFW_KEY_LEFT))	tank.center.x -= 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_RIGHT))	tank.center.x += 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_UP))		tank.center.y += 0.5f * getTimeStep();
			if (isKeyPressed(GLFW_KEY_DOWN))	tank.center.y -= 0.5f * getTimeStep();

			// shoot a cannon ball
			if (isKeyPressedAndReleased(GLFW_KEY_SPACE))
			{
				//if (bullet == nullptr)
				//{
				//	bullet = new MyBullet;
				//	bullet->center = tank.center;
				//	bullet->center.x += 0.2f;
				//	bullet->center.y += 0.1f;
				//	bullet->velocity = vec2(2.0f, 0.0f);
				//}
				//else if (bullet2 == nullptr)
				//{
				//	bullet2 = new MyBullet;
				//	bullet2->center = tank.center;
				//	bullet2->center.x += 0.2f;
				//	bullet2->center.y += 0.1f;
				//	bullet2->velocity = vec2(2.0f, 0.0f);
				//}
			
				ptr_bullet_array.push_back(nullptr);
				ptr_bullet_array[index] = new MyBullet;
				ptr_bullet_array[index]->center = tank.center;
				ptr_bullet_array[index]->center.x += 0.2f;
				ptr_bullet_array[index]->center.y += 0.1f;
				ptr_bullet_array[index]->velocity = vec2(2.0f, 0.0f);
				index++;
			}

			//if (bullet != nullptr) bullet->update(getTimeStep());
			//if (bullet2 != nullptr) bullet2->update(getTimeStep());

			// rendering
			tank.draw();
			//if (bullet != nullptr)
			//{
			//	bullet->draw();
			//}
			//if (bullet2 != nullptr)
			//{
			//	bullet2->draw();
			//}


			//if (bullet != nullptr && bullet->center.x > 1.2f)
			//{
			//	delete bullet;
			//	bullet = nullptr;
			//}
			//if (bullet2 != nullptr && bullet2->center.x > 1.2f)
			//{
			//	delete bullet2;
			//	bullet2 = nullptr;
			//}

			//for (int i = 0; i <= index; ++i)
			//{
			//	if (ptr_bullet_array[i] != nullptr && ptr_bullet_array[i]->center.x > 1.2f)
			//	{
			//		delete ptr_bullet_array[i];
			//		ptr_bullet_array[i] = nullptr;
			//	}
			//}

			for (int i = 0; i <= index; ++i)
			{
				if (ptr_bullet_array[i] != nullptr)
				{
					ptr_bullet_array[i]->update(getTimeStep());
					ptr_bullet_array[i]->draw();

					if (ptr_bullet_array[i]->center.x > 1.2f)
					{
						delete ptr_bullet_array[i];
						ptr_bullet_array[i] = nullptr;
					}
				}
			}
		}
	};
}

교수님께서 설명하신 대로 연습문제를 풀어봤고 문제없이 잘 실행되는 거 같긴 한데 메모리 누수가 해결됐는지 잘 모르겠습니다. 연습문제를 풀기 전에 디버깅 모드로 봐도 CPU 사용량이 그대로인데 어디서 어떻게 확인할 수 있을까요?

c++객체지향oopC++OpenGL

Câu trả lời 1

1

메모리누수는 CPU 사용량보다는 메모리 사용량을 보시는 것이 더 좋습니다.

그리고 Visual Studio 내장 분석 도구 이외에도 다양한 메모리 누수 점검용 툴이 있습니다.

Valgrind, AddressSanitizer 등이 있습니다.

이런 툴을 활용해보는 것도 좋을 듯합니다.

Hình ảnh hồ sơ của thd2tn1756
thd2tn1756

câu hỏi đã được viết

Đặt câu hỏi