전체 글

전체 글

    [Unity] 그래픽스 퍼포먼스 최적화

    1. 그래픽스 퍼포먼스 최적화 훌륭한 퍼포먼스는 많은 게임의 성공을 결정짓는 중요한 요소이다. 게임의 렌더링 속도를 최대로 끌어올리는 간단한 가이드라인을 아래에 소개한다. 1.1 높은 그래픽스 효과 찾기 게임의 그래픽 부분은 컴퓨터의 GPU와 CPU 시스템에 주로 영향을 준다. 어떤 최적화든 GPU 최적화와 CPU 최적화는 전략이 매우 다르기 때문에 첫 번째로 어디에서 퍼포먼스 문제가 발생하는지 찾아야 한다. 아예 정반대라고도 할 수 있다. 예를 들어, CPU 최적화를 위해 GPU의 작업을 늘리거나 그 반대인 경우가 흔히 발생한다. 일반적인 병목현상과 이를 체크하는 방법: GPU가 종종 필레이트 또는 메모리 대역폭의 제한을 받는다. 디스플레이 해상도를 낮춘 다음 게임을 실행한다. 낮은 디스플레이 해상도가..

    스택 포인터와 프레임 포인터

    스택 프레임 (Stack Frame) 기본적으로 함수가 호출될 때마다 전달한 인자와 정의한 지역(자동) 변수가 높은 주소부터 낮은 주소의 방향으로 차례대로 저장되는 구조이다. 이외에도 다른 함수를 호출할 때 복귀할 주소(다음 실행할 명령어의 주소), 프레임 포인터 및 보존되는 레지스터들이 스택에 저장된다. 스택 포인터는 함수 호출 시작부터 피호출 프로그램이 실행되는 단계 차례대로 저장되는 값들을 저장하기 위해 현 시점에서 저장할 메모리의 위치를 가리킨다. 스택 프레임에 저장되는 값 - 복귀 주소 - 호출자 루틴의 프레임 포인터 - 사용하던 보존 레지스터 - 피호출자에 전달하는 인자 - 피호출자에서 사용되는 지역 변수들 프레임 포인터 (Frame Pointer) 함수 호출이 끝난다면 상위 호출로 돌아기전에..

    레지스터 (Register)

    정의 - 명령어를 실행하기 위해 필요한 데이터와 상태, 명령어를 저장하는 기억 소자 - CPU 내부에 존재하며, 기억 장치 중 가장 빠르며 용량이 작음 - 데이터 레지스터와 제어용 레지스터로 구분 데이터 레지스터 - CPU가 명령어를 처리하는 과정에서 임시로 처리할 데이터를 저장하거나 메모리의 주소를 저장할 목적으로 사용 - 데이터 레지스터 (Data Register), 주소 레지스터 (Address Register), .범용 레지스터(General Register)로 구분 1) 주소 레지스터 스택 포인터 (SP , Stack Pointer) - CPU는 현재 실행하고 있는 프로그램의 메모리 영역을 스택으로 관리 - SP는 현재 스택 영역에서 가장 마지막 부분 (가장 최근에 저장된)을 가르킴 베이스 포인..

    해시(hash)와 암호화(Encryption) 차이점, 사용

    차이점 둘 다 암호화 기법이지만 Hash는 단방향 암호화 기법이고 Encryption은 양방향 암호화 기법이다. 쉽게 설명하면 Hash는 평문을 암호화된 문장(텍스트)으로 만들어주는 기능을 하고, Encryption은 평문을 암호화된 문장(텍스트)로 만들어주는 기능을 하고 + 암호화된 문장을 다시 평문으로 만드는 복호화 기능도 한다. 해시 (hash)는 어떻게 암호화가 이루어질까? 예시로 설명하면 평문의 비밀번호 "jeongpro1234"를 해시함수(해시 알고리즘)를 이용하여 고정된 길이의 암호화된 문자열로 바꿔 버리는 것이 해시를 이용한 암호화 기법이다. * 해시에서 알아야 할 것들 - 해시 알고리즘 및 밑에서 얘기할 암호화 알고리즘은 종류가 다양하며, 알고리즘은 모두에게(해커에게도) 공개되어있다. (..

    가상 메모리와 가상 주소 공간

    가상 메모리와 가상 주소 공간 서로 다른 개념이지만 혼용되서 사용된다. 가상 주소 공간은 각 프로세스 당 주어지는 논리적인 공간이다. 가상 주소 공간의 크기는 물리 메모리(RAM)의 크기와는 독립적이며, 레지스터 크기에 종속적이다. Word Size가 32비트인 컴퓨터의 경우, 일반적으로 레지스터의 크기도 32비트다, 이는 2^32 개의 주소를 나타낼 수 있음을 의미하고, 1 바이트당 주소가 주어지므로 최대 4GB의 가상 주소 공간을 갖을 수 있다. 같은 원리로 64비트 컴퓨터의 경우 2^64 바이트(16 엑사 바이트) 크기의 가상 주소 공간을 갖을 수 있게 된다. 프로세스의 주소 공간은 페이지(Page) 단위로 관리된다. 가상 주소 공간의 주소를 논리 주소라고 하는데, 모든 논리 주소가 반드시 물리적인..

    에이전트의 정의

    에이전트(Agent)는 인공지능 분야에 있어서 핵심 개념이 될 수 있다. 다음과 같이 정의를 내릴 수가 있다 "복잡한 동적 환경에서 목표를 달성하려 시도하는 시스템" 특징 특정 목적에 대해 사용자를 대신하여 작업을 수행하는 자율적 프로세스이다. 독자적으로 존재하지 않고 어떤 환경(운영 체제, 네트워크 등)의 일부이거나 그 안에서 동작하는 시스템이다. 지식 기반(Knowledge Base)과 추론 기능을 가지며, 자원 또는 다른 에이전트와의 정보 교환과 통신을 통해 문제를 해결한다. 스스로 환경의 변화를 인지하고 그에 대응하는 행동을 취하며, 경험을 바탕으로 학습하는 기능을 가진다. 분류 Simple Reflex Agents Condition-Action Rule을 내부에 가지고 있으며, 환경으로부터 받는..

    [Unity] 모바일 빌드 방법 (IL2CPP, MONO)

    IL2CPP 어셈블리 언어인 IL (Intermediate Language - 스택 기반 어셈블리 언어)를 C++ 소스 코드로 변환 C#이나 Unity 컴파일러가 작성한 IL를 C++ 코드로 바꿔서 apk나 exe 파일을 만들기 전에 C++로 어셈블리를 추가 할 수 있게 해주는 방법 (그래서 C코드로 변활할 수 있게 도와주는 NDK가 필요하다) 장단점 장점) 코드 크기를 줄일 수 있다. (사용하지 않는 유니티 모듈을 제거 할 수 있다) IOS 64 bit 빌드를 지원한다. 단점) 버그가 mono에 비해 많이 생긴다. 주로 리플렉션을 사용하는 JSON 라이브러리 빌드 시간이 mono보다 느리다 디버깅이 어렵다 Mono 빌드 SDK, JDK 필요 보통 많이 쓰는 방법 (빌드 속도가 빠름) 방법 유니티 Fil..

    [LeetCode] 1 - Two Sum

    class Solution { public: vector twoSum(vector& nums, int target) { unordered_map m; // 예시 2,7,11,15 / 9 for (int i = 0; i 2 : 0 * 9 - 7 = 2 > 2가 존재 * nums[i]=7 > 1, 9 * * int idx = target - nums[i]; if (m.find(idx) == m.end()) m[nums[i]] = i; else return { m[idx],i }; */ /* * 솔루션 2) 해당 값을 조합 * * 9 - 2 = 7 * m에 7이 없음 > m[2] = 0 * * 9 - 7 = ..

    [LeetCode] 6 - Zigzag Conversion

    class Solution { public: string convert(string s, int numRows) { string res; vector v(numRows); auto iter = s.begin(); int idx = 0; bool flag = true; // 1일 때 항상 일치함 if (numRows == 1) return s; // s의 시작점부터 실행 // 로직) 끝에 다다랐을 때 방향을 지정 while (iter != s.end()) { v[idx].push_back(*iter); idx = (flag) ? idx + 1 : idx - 1; if (idx == numRows - 1 || idx == 0) flag = !flag; iter++; } for (const auto& item..

    Flow Free 3 - UI

    UI Manager - 모든 UI들을 관리 / 로직 포함 캔버스에 직접 스크립트 추가하여 나머지 UI들은 자동으로 연동 딱히 다른 클래스 만들어서 이를 상속 받아 팝업 형태 할 정도로 개수가 많지 않아서 단순하게 구현 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.SceneManagement; public class UI_Manager : SingletonLocal { [SerializeField] GameObject GameUI_Prefab; public GameUI g..