Lua가 있다는 것만 알고 있었고, C++이나 Python같은 언어와 크게 다르지 않다고 생각하고 있었는데, 인터프리터 언어로써 주로 C++이 코어로 이용되는 프로젝트에서 스크립트에 사용된다고 한다.
C++과 비교하여 장단점이 확실해 보인다.
성능적으로 중요한 코어, 그래픽 렌더링, 물리엔진, AI, 네트워크 처리 등은 C++이 사용되고 빠른 개발 속도와 유연성을 필요로 하는 게임로직, 이벤트처리, 퀘스트, NPC요소 등은 Lua로 작성하면 좋다고 한다.
Lua는 C랑 C++에 쉽게 임베드 될 수 있도록 설계되었고, 특히 C++과 시너지가 좋다고도 한다. 추가적으로 Lua의 특징을 더 적어보면 '경량 스크립팅 언어', '적은 메모리 소비', '빠른 실행 속도(인터프리터 언어 중에서도 인 듯)', 'C++과의 간단한 데이터 교환', '동적 기능 구현에 유용', '높은 유지보수성과 확장성'... 등 적자면 더 있지만 대충 이 정도.
This privacy policy applies to the 미고미고 app (hereby referred to as "Application") for mobile devices that was created by (hereby referred to as "Service Provider") as a Free service. This service is intended for use "AS IS".
Information Collection and Use
The Application collects information when you download and use it. This information may include information such as
Your device's Internet Protocol address (e.g. IP address)
The pages of the Application that you visit, the time and date of your visit, the time spent on those pages
The time spent on the Application
The operating system you use on your mobile device
The Application does not gather precise information about the location of your mobile device.
The Application collects your device's location, which helps the Service Provider determine your approximate geographical location and make use of in below ways:
Geolocation Services: The Service Provider utilizes location data to provide features such as personalized content, relevant recommendations, and location-based services.
Analytics and Improvements: Aggregated and anonymized location data helps the Service Provider to analyze user behavior, identify trends, and improve the overall performance and functionality of the Application.
Third-Party Services: Periodically, the Service Provider may transmit anonymized location data to external services. These services assist them in enhancing the Application and optimizing their offerings.
The Service Provider may use the information you provided to contact you from time to time to provide you with important information, required notices and marketing promotions.
For a better experience, while using the Application, the Service Provider may require you to provide us with certain personally identifiable information. The information that the Service Provider request will be retained by them and used as described in this privacy policy.
Third Party Access
Only aggregated, anonymized data is periodically transmitted to external services to aid the Service Provider in improving the Application and their service. The Service Provider may share your information with third parties in the ways that are described in this privacy statement.
Please note that the Application utilizes third-party services that have their own Privacy Policy about handling data. Below are the links to the Privacy Policy of the third-party service providers used by the Application:
The Service Provider may disclose User Provided and Automatically Collected Information:
as required by law, such as to comply with a subpoena, or similar legal process;
when they believe in good faith that disclosure is necessary to protect their rights, protect your safety or the safety of others, investigate fraud, or respond to a government request;
with their trusted services providers who work on their behalf, do not have an independent use of the information we disclose to them, and have agreed to adhere to the rules set forth in this privacy statement.
Opt-Out Rights
You can stop all collection of information by the Application easily by uninstalling it. You may use the standard uninstall processes as may be available as part of your mobile device or via the mobile application marketplace or network.
Data Retention Policy
The Service Provider will retain User Provided data for as long as you use the Application and for a reasonable time thereafter. If you'd like them to delete User Provided Data that you have provided via the Application, please contact them at aa01092308481@gmail.com and they will respond in a reasonable time.
Children
The Service Provider does not use the Application to knowingly solicit data from or market to children under the age of 13.
The Application does not address anyone under the age of 13. The Service Provider does not knowingly collect personally identifiable information from children under 13 years of age. In the case the Service Provider discover that a child under 13 has provided personal information, the Service Provider will immediately delete this from their servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact the Service Provider (aa01092308481@gmail.com) so that they will be able to take the necessary actions.
Security
The Service Provider is concerned about safeguarding the confidentiality of your information. The Service Provider provides physical, electronic, and procedural safeguards to protect information the Service Provider processes and maintains.
Changes
This Privacy Policy may be updated from time to time for any reason. The Service Provider will notify you of any changes to the Privacy Policy by updating this page with the new Privacy Policy. You are advised to consult this Privacy Policy regularly for any changes, as continued use is deemed approval of all changes.
This privacy policy is effective as of 2024-04-21
Your Consent
By using the Application, you are consenting to the processing of your information as set forth in this Privacy Policy now and as amended by us.
Contact Us
If you have any questions regarding privacy while using the Application, or have questions about the practices, please contact the Service Provider via email at aa01092308481@gmail.com.
3D Sci-fi 분위기의 탄막슈팅게임(주 레퍼런스: 아머드코어)을 반쯤 순조롭게 제작 진행중. 나는 지금까지 거의 탄막을 제작한 게 다 이다. 이제 대충 양산을 할 수 있는 상태가 되기는 했지만 여전히 부족한 게 많은 상태. 특히 코드가 무척 스파게티 상태라서 리팩토링을 하고 싶다. 탄막 작업이 끝나면, 업적 시스템에 착수해야 한다.
누가봐도 최적화 문제 + 왠지 씬에 남아있는 투명한 탄막 + 뭔가 시간이 지날수록 점점 무거워지는 게 무엇인가가 메모리에 누적되어가는 것 같은 문제
0.3 FPS (3035.8ms)를 보이며 도저히 게임을 진행할 수 없는 상태로 보인다. (20만 배치수가 무척 심각한 상태라는 것은 이슈를 해결하고 나서야 알았다)
영상으로 보면 아래와 같다.
이후 탄막의 렌더러를 없애봐도 비슷한 타이밍에 fps가 나락가는 걸 보면, 정말 단순하게 연산쪽이 무거워서 그런 것으로 보인다(코드가 지저분해서 그럴 만 하다고 생각했다)
버그 픽스를 위해
오브젝트 풀에서 초기화 또는 반환 도중 에러가 난 아이들
원점에 돌아갔지만, 움직이지 않고 Update문을 반복하며 오류를 뿜는다.
초기화 오류인가, 반환 오류인가?
수동으로 반환 메서드를 실행하면 잘 되며, 여러가지 초기화 해 주어야 할 값이 모두 null인 것으로 보아, 초기화가 제대로 이루어지지 않은 것으로 보인다. 즉 DanmakuGenerator에서 미스가 있다.
var danmakuGo = DanmakuPoolManager.instance.GetGo(settings.danmakuPrefab.name);
try
{
if (danmakuGo != null)
{
Vector3 initPosition = masterTransform.position; // 마스터의 위치를 기본값으로
// ... 기타 로직 및 탄막 파라미터들 초기화
}
}
catch
{
Pool.Release(danmakuGo);
}
아무래도 로직 도중 masterObject가 소실되어 Pool에서의 탄막 생성 후 이후 로직이 모두 무산되고 danmakuController.Initialize도 실행되지 않은 것으로 보인다. 해당 로직을 try문으로 감싸, 초기화가 제대로 이루어지지 않을 경우 바로 Pool에 반환을 할 수 있도록 해야겠다.
var danmakuGo = DanmakuPoolManager.instance.GetGo(settings.danmakuPrefab.name);
try
{
if (danmakuGo != null)
{
Vector3 initPosition = masterTransform.position; // 마스터의 위치를 기본값으로
// ... 기타 로직 및 탄막 파라미터들 초기화
}
}
catch
{
Pool.Release(danmakuGo);
}
해결되지 않았다. 아직 활성화 직전인 오브젝트를 반환 할 수 없는 게 이유인 것으로 보인다. 새로운 탄막 오브젝트를 Pool에서 꺼내오기 전에 masterObject의 상태를 체크하여 코루틴을 종료 할 수 있도록 해 보았다.
// masterObject의 상태 확인
if (masterObject == null || !masterObject.activeInHierarchy)
{
yield break; // masterObject가 비활성화되거나 파괴되면 코루틴 중단
}
var danmakuGo = DanmakuPoolManager.instance.GetGo(settings.danmakuPrefab.name);
해결 된 듯 보여 탄막 오브젝트를 1.6^4 = 6.6배정도 증량하여 더 부하를 줘 보았다.
FPS가 1.0 이하로 떨어지고 탄막의 반환이 살짝 늦을지언정 더 이상 Pool 버그는 일어나지 않았다.
참고로 위 영상에서 최대 탄막수는 4096개였다. Pool의 크기는 100였기 때문에, 사실상 Instantiate와 Destroy가 커버를 친 셈.
번외로 Pool의 크기를 4100으로 하여 FPS를 확인 해 보자. 버그를 찾으며 프로파일러를 확인하면서, Destory 등이 CPU성능이 90프로 이상인 시점이 있었던 것도 생각하면 왠지 FPS 저하가 플레이에 지장이 없을 정도가 될 것이라고도 생각된다.
워메… 아니었다. 프로파일러를 켜고 다시 확인 해 보자.
일단 랜더러쪽은 전혀 문제가 되지 않았고, 정말 그냥 Pool 반환을 위한 Deactive 량이 너무 많은 것이 원인이었다.(1.6초에 4000회) 그런데 이 반환 처리가 생성파괴와 성능차이가 크게 나지 않는다는 건 생각보다 쇼크.
생명주기 시간을 좀 늘려 반환이 이루어지지 않는 시점에도 FPS가 많이 떨어지는지 확인 해 보아야겠다. 실제 게임에서는 반환이 이렇게 짧은 시간에 대량으로 몰려있지는 않을 것으로 예상되기 때문에.
생성이 갑작스럽게 한꺼번에 이루어져 7.7 FPS를 가지긴 했지만, 이후 약 5000개의 탄막 오브젝트가 이동하는 데에는 11.5 FPS부터 시작하여 약 20 FPS까지 올라간다.
생각 해 보니 하이에라키 등 게임 씬 이외의 요소가 성능저하의 문제가 될 가능성이 있어, Play Maximized 모드에서 추가로 확인을 해 보았다.
생성순간이 13 FPS, 이후 18 FPS부터 시작하여 카메라에서 탄막이 사라지면서(낮아지는 Batches 수) 30 FPS 이상까지 회복한다. Play Maximized 모드에서 대략 1.5배정도의 성능을 보였다.
보스몬스터가 탄막을 무척 남발하도록 하고 싶은데, 이런 상태라면 좀 어려울 것으로 생각된다. 최적화가 필요한 부분이다.
다만, 현재 최우선순위는 패턴의 다양화이고, 이후 탄막의 네온 효과, 카메라에 포스트 프로세서등을 달아 어느 정도의 최적화가 더 필요한지 확인하여 견적을 잡아야겠다.
3. 과제에 대해
탄막의 네온효과, 카메라의 포스트 프로세싱 적용, 실제 게임 중 탄막 사용 예상량 등을 근거로 프레임 저하가 어느 정도 더 일어나는지 확인한다. 이후 견적을 내어 필요한 만큼의 최적화를 진행. 다만 후순위 작업이 될 것이고, 패턴의 다양화를 위한 추가 스크립팅을 하는 것을 우선으로 한다.
Q 1. 자기소개 해주세요 Q 2. 게임개발을 하게 된 이유는 Q 3. 유니티 생명주기에 대해 설명해주세요 Q 4. 객체지향에 대해 설명해주세요 Q 5. 상속에 대해 설명해주세요
대답
대학 졸업하고 이것저것 프밍공부 하고 게임개발 공부중.. 어버버
게임을 하는 것도 좋아하기도 하고, 비쥬얼적으로 뭔갈 만들어서 보여주는 것에 특화되어있고 게임 뿐 아니라 여러 시뮬레이션을 만들어 보는 것에 대해서도 유니티가 적합하다고 생각하여 열심히 배우고 있음. 여기도 어버버
게임 시작 시점에 실행되는 무언가. [] 대괄호로 둘러싼 키워드와 함께 하는 그거. 이후에 Awake, OnEnable, Start 등 오브젝트 컴포넌트의 활성화 단계에서 한 번 메서드를 실행하여 여러 초기화 역할을 하며, Update 메서드 등에서 프레임 당 필요한 작업을 한다. (FixedUpdate나 콜백 등에 대해서는 빼먹음) 오브젝트의 파괴 시 OnDistroy 메서드에서 필요한 장치를 마련하여 마무리.
순차적으로 진행되는 절차지향과는 다른 결의 프로그래밍 방식으로, 모듈화를 중심으로 프로그래밍을 하는 방식을 객체지향 프로그래밍이라고 한다.
특정 클래스에 어떠한 기능을 만들어 이를 다른 클래스에서 이어받아 추가적인 메서드나 변수를 작성하여 사용 할 수 있는 구조. 몬스터를 예로 들면, 몬스터 클래스에 몬스터가 가지는 기능을 구현한 후, 보스 몬스터에서 몬스터 클래스를 상속받고 보스몬스터만의 추가적인 메서드 등을 구현하여 사용. 쫄 몬스터에서도 마찬가지로 몬스터 클래스를 상속받아 쫄 몬스터에 대한 메서드 등을 추가로 작성하여 사용한다.
피드백
나에 대한 소개 : 내가 어떤 사람이고, 내가 왜 게임개발을 하려고 하는지. 나라는 사람이 어떠한 사람인지 표현할 수 있도록 정리를 해 보자.
전반적으로 부족한 자신감 : 내가 부족하다고 생각하는 부분을 스스로 인지하게 되면 자신감이 떨어지는 경향이 있음.
본인소개부터 막혀서 거기에서 자신감이 떨어지고, 기술적인 부분에서도 설명을 하다가 막히기 시작하면 떨어지는 자신감.
대답을 하다가 흐리는 경향. "~게 한다고.....합니다.". "~라고 생각합니다" 는 지양하도록. "~게 됩니다."라고 깔끔하게 끝내기.
시선처리 : 흔들리는 시선
기술에 대한 대답도 정리가 필요.
AtoZ를 모두 말하는 것 보다 AtoZ를 모두 알고있다는 것을 요약.(예:생명주기)
요약 : 자신감 / 마인드(걔네는 면접하는 게 일) / 내가 생각하는 걸 잘 말할 수 있도록 연습