프로그래밍/C#

C# & Unity 면접용 질문?

MAKGA 2022. 10. 3. 22:40
320x100

cheatsheet의 개념으로 적어두자.

 

1. 변수

우클릭 -> Create -> C# Script
첫 글자가 대문자이고 띄어쓰기가 없음
void Start() == init(), 최초 1회만 실행하게 된다.
출력은  print를 사용
class 이름 == 유니티에서 대본 모양의 아이콘 아래 있는 이름과
일치시켜야 한다.

===============================

2. 자료형

정수 - int(-20억 ~ +20억, 4바이트), short(-30000 ~ +30000, 
2바이트), long(8바이트), sbyte(-128 ~ +127), byte(0 ~ 255)
실수 - float(f를 꼭 적어라), double, dscimal(끝에 m을 꼭 붙여라)
문자 - string(" "), char(유니코드 가능, ' ', 한 글자만 기억)
자료형이 다른 것들의 계산, 큰 것이 작은 것을 포함해야한다.
int와 float의 계산은 float로
형변환 == cast
int형 = string.ToString하면 문자열로 변환됨
string형 = int.Parse하면 int형으로 변환됨
U = Unsigned(음수 없음)

===============================

3. 함수

연산의 결과를 반영하거나 출력함
void 함수이름( ){ }
함수이름의 첫글자는 대문자여야함. 일종의 약속임
괄호 안에 (자료형 입력받을 값)을 적는다, 없으면 공란
괄호 안에 기본값을 함께 주었고, 코드에는 
건드리지 않았을 경우 기본값이 들어간다
반환을 위해 return을 입력해준다
return값이 함수의 결과값이 된다

===============================

4. 지정자

변수의 범위지정자, 접근지정자
맨 앞에 있는 것 : 맴버변수, 전역변수
중괄호 안에서만 사용 가능한 것 : 지역변수
지역변수는 같은 지역만 아니라면 같은 변수 이름 
사용 가능함
지역변수와 맴버변수의 이름이 같을 경우에는 지역
변수가 먼저 우선시된다.
함수가 끝난 후에는 지역변수는 소멸된다. ->메모리 
단편화가 생김
private 자료형 변수명
public 자료형 변수명
static 공공의 공유자원임
클래스타입 클래스명 = new 클래스타입();
공유자원으로 준 것(static)은 모든 클래스에 동일한 값
을 주게 됨

===============================

5. 연산자

기본연산자 : + - / * % =
c++ 후에 c에 1을 더함(선 코드실행 후 연산)
++c c에 1을 먼저 더함(선 연산 후 코드실행)
증감연산자 : ++ --
관계연산자 : == > < >= <= !=
논리연산자 : && ||
!( )
비트연산자 : 2진법, & ^ ~ | >> <<

===============================

6. 조건문

if, else if, else
switch, break
switch(비교할 변수)
{
case 조건(한글 가능 - 
string, char의 경우):
코드~
break;
}
삼항연산자
자료형 변수 = 조건 ? true일경우 : false일 경우;

===============================

7. 반복문

for, break, continue(해당 회차를 끝냄, 
다음회차 시작) -> 반복 횟수가 명확할 때 사용
while(조건) -> 조건에 만족하는 동안 계속해서 
실행 -> 반복 횟수가 명확하지 않을 때 사용
do{초기에 실행할 것}while{조건};
foreach(자료형 변수명 in 어떤걸)
{
}-> 어떤걸 변수명 안에 넣을거냐

===============================

8. 배열

자료형[] 변수명 = {값...}
비슷한 성격의 변수의 집합체
배열명[인덱스]
배열의 크기 : 배열명.lenght
이지만, 배열의 크기는 1부터 계산을 하므로 
for문에 사용하려면 -1을 해주거나, =를 빼도록 한다.
배열에 값을 추가하는 것은 불가능하지만, 값을 
변경하는 것은 가능함
배열의 크기만 선언하기 : 
자료형[] 배열명 = new 자료형[크기];
크기만 지정해 준 후 값을 나중에 넣어도 된다.
크기 자리에 다른 배열의 크기를 넣어도 가능
한 줄로 늘어져있다 : 1차원 배열
2차원 배열 : 자료형 [ , ] 배열명 = {{값}, {값}};
3차원 배열 : 자료형[ , , ] 배열명 = {{{값}, {값}}, {{값}, {값}}};
3차원 배열은 2차원 배열이 2개인 것

===============================

9. 컬렉션

배열과 비슷하지만, 크기가 자유자재
*ArrayList 어레이리스트명 = new ArrayList();
생성도 함께 해줘야 함
변수 추가 : ArrayList.Add(넣을 값);
메소드 라고 함
ArrayList의 크기는 ArrayList.count
변수 제거 : ArrayList.remove(지울 값);
ArrayList.RemoveAt(인덱스);
ArrayList.RemoveRange(시작 인덱스, 몇개를 지울지);
변수 변경 : ArrayList[인덱스] = 바꿀 값;
초기화 : ArrayList.Clear
해당 값이 있나 없나 : ArrayList.Contains(어떤 
값이 있으면 true 없으면 false);
ArrayList.insert(넣을 인덱스, 넣을 값);
*List<자료형> 리스트명 = new List<자료형>();
*HashTable 해쉬테이블명 = new HashTable();
HashTable.Add("키 값", 값);
접근 방법은 키값으로 : HashTable["키 값"];
*Dictionary<키 값 자료형, 벨류 자료형>딕셔너리명 = new ~
*Queue<자료형 넣어도 되고 안 넣어도 됨> 큐 명 = new ~
큐에 있는 값을 쓰려면 꺼내야 함. 참조로는 쓰지 못함.
큐명.Dequeue : 큐에 있는 값을 뺌, 큐를 빼면 인덱스를
하나씩 당김
큐명.Enqueue : 큐에 값을 넣음
큐의 크기 : 큐명.count
선입선출 FIFO
*stack<자료형 넣어도 되고 안 넣어도 됨>스택명 = new ~
스택명.Push : 스택에 넣기
스택명.Pop : 스택에서 빼기
후입선출 LIFO

===============================

10. 네임스페이스

using 이름;
namespace 이름
{
}
협업, 대형프로젝트, 외부 라이브러리 때문에. 
클래스 등 이름이 겹칠 경우 명시적으로 사용 가능하다.
이름.클래스명

===============================

11. 구조체

그릇 역할만 하기 때문에 값을 직접 대입할 수는 없다
구조체는 구 버전, 클래스는 신 버전
구조체는 상속이 불가능하다
구조체는 선언과 동시에 생성이 된다
구조체는 값 타입 클래스는 주소 타입
클래스에는 주소가 들어있고 그 주소에 가니 값이 
있는 느낌

===============================

12. 델리게이트

델리게이트, 이벤트
함수들을 한꺼번에 관리 가능
public deligate void 클래스명(자료형 벨류)
이벤트
public static event 클래스명 이벤트명;
onDisable : 게임이 꺼지면 호출됨

===============================

13. 상속

자식클래스명 : 부모클래스명
private, public, protected
재정의(오버라이드) : virtual
가상함수
base(부모클래스를 가리킴).함수명( )
추상함수 : abstract 
부모클래스에서 미완성인 상태로 두고, 
자식클래스에서 반드시 완성시켜야 함(실수로 자식
클래스에서 완성시키지 않을 때를 대비)
미리 토대를 만들어 둠 : 다형성

===============================

14. 프로퍼티
중요 변수에 대한 은닉성을 위함
돈 ->set은 private get는 public으로 하는 등
민감한 변수 1개에 2개의 함수가 필요
public 자료형 이름(get{return 변수;} private
set {변수 = value;})
set, get{이 안에 조건을 넣을 수 있음}
public 자료형 이름 {get; set;}
--> 모든곳에서 쓸 수 있게 됨

===============================

15. 인덱서

클래스 내에 있는 배열을 간단하게 사용하기 위함
this.클래스명
public 자료형 this[자료형 받을변수]
{
get, set함수(이 안에서는 print가 사용 
불가이므로 Debug.log를 사용하도록 
한다.
}
인덱스가 있으면 인덱서를 사용할 수 있음

===============================

16. 인터페이스

추상메서드, 추상클래스 -> 미완성인 상태여야 함
--> 자식클래스에서 완성시켜야 한다.
인터페이스 --> 다중 상속이 가능함
interface 이름(이름 맨 첫 글자는 I(아이)로 시작
한다){ }
뼈대 제공. 오버라이드 없음. 변수를 가질 수 없음.
--> 함수, 프로퍼티, 인덱서, 이벤트만 가능함

===============================

17. 형식매개변수 T

어떤 매개변수가 올지 모를 때 사용
함수를 생성할 때 자료형 대신 <형식매개변수(보통 T)>
void 함수명<T>(T 벨류)(이곳에 제한 가능(where)
where T : struct, class등등

===============================

18. 람다식

여러개의 함수가 동시에.. -> 델리게이트
무명 메소드 : 함수를 만들지 않고도 델리게이트에 넣을 수 있음
델리게이트명 += deligate () {할 일;}; -> 무명메소드
무명메소드는 반드시 델리게이트를 통해서만 호출 가능
람다식 : 델리게이트명 += () => 할 일


===============================

19. Action 과 Func

델리게이트를 줄여놓은 것
델리게이트에 반환 값이 있으면 Func 없으면 Action
Action은 using System; 필요
Action<자료형1, 자료형2> 델리게이트명;
Func도 using System; 필요
Func<자료형1, 자료형2, 반환형> 델리게이트명;

===============================

20. 예외 처리

오류가 나더라도 그 오류가 게임진행에 있어 치명적이지
않도록 
catch(DivideByZeroException 이름(관례적으로 
ie를 사용)
catch(NullReference) ...
() 안에 여러 오류의 형태를 넣으면 됨
finally{이 안에 오류가 뜨든 안 뜨든 맨 마지막에 실행할 것}
throw new Exception -> 일부러 오류를 발생시키는 것

===============================

21. 코루틴

여러 함수를 동시에 실행시킴(병렬처리)
yield return new WaitForSeconds(시간);
시간에 따른 실행 시간 지연으로 여러 함수를 동시에 출력을 시킨다
IEnumerator
스톱 코루틴은 정해진 형식이 있다
Start Coroutine(코루틴명);
문자열은 최대 하나만 넘길 수 있음
값이 많다면 그 값을 전부 변수에 담아서 사용할 때 그것만 호출하기
StopAllCoroutine

 

===============================

 
45. C#에서의 Class와 Struct의 차이점 설명
-Class : 값 타입. 직접적으로 메모리 접근이 가능하여 메모리 낭비 방지
-Struct : 참조 타입

===========================================

46. C# 박싱, 언박싱 설명
-박싱 : 값 타입을 오브젝트 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것. 기존에 저장된 스택영역에서 힙 영역으로 값 형식을 저장, 값 형식 -> 참조 형식
-언박싱 : 오브젝트 형식에서 값 형식 또는 인터페이스 형식으로 해당 인터페이스를 구현하는 값 형식으로 변환, 참조 형식 -> 값 형식

===========================================

47. 오브젝트 타입에 벨류 타입을 대입하면 어떤 일이 일어나나?
-벨류를 레퍼런스타입으로 박싱한다. 스택에 있던 벨류를 힙으로 복사 후 주소값을 할당함.

============================================

48. 가비지 컬렉터에 대해 설명, 어떨 때 동작하는지 설명
-사용하지 않는 메모리를 회수하여 힙 메모리가 가득차면 자동으로 해제함

============================================

49. C#에서 Struct는 가비지컬렉터가 도는지?
-벨류타입이기 때문에 스택영역에 메모리가 할당되고, 힙 영역에 생성된 것이 아니기때문에 가비지컬렉터가 돌지 않는다.

============================================

50. 유니티의 4대 장점
-접근성이 좋다, 멀티 플랫폼이 가능하다, 스크립트 공유가 편리하다, 저렴하다 

============================================

51. MonoBehavior에 대해 설명
-유니티와 연결되는 기본 클래스. 멤버 함수는 크게 3가지로 나뉘며, Awake, Start, Update
new로 동적할당 받을 수 없음

============================================

52. ref와 out의 차이 설명
-참조에 의한 호출을 지원하기 위한 예약어
ref, out사용 시 깊은 복사(call of reference) -> 주소를 들고가기 때문에 값 변경이 가능하고, 그 값이 원본에 적용된다.
-out으로 넘길 변수는 초기화 하지 않아도 됨. 초기화 해도 변수를 받을 곳에서 초기화 값을 사용하지 못함
out으로 인자를 받는 메서드는 변수에 값을 넣어 반환해야 한다
-ref으로 넘길 변수는 초기화를 해야 한다.

============================================

53. 컬렉션 종류에 대해 다 설명
-컬렉션 : 데이터 모음집(자료구조), 네임스페이스를 선언 후에 사용 가능
-ArrayList : 배열과 비슷하지만 동적임, 주로 사용하는 함수는 Add(==push_back), Insert(==Insert), Remove(해당 데이터 삭제), RemoveAt(해당 인덱스 삭제)
-Queue : 선입선출(FIFO), 입력을 Enqueue, 출력을 Dequeue
-Stack : 후입선출(LIFO), 입력을 Push, 출력을 Pop
-Hashtable : 키와 벨류로 값을 저장
-단점 : 어떤 데이터든 다 담을수 있지만, 박싱 언박싱이 자주 일어난다
-일반화 컬렉션 : 컬렉션의 단점인 박싱, 언박싱을 보완한 컬렉션
-List : 타입을 미리 지정하여 그 타입의 값만 저장
-Queue : 형식을 지정한다
-Stack : 형식을 지정한다
-Dictionary : 형식을 지정한다

=============================================

54. Dictionary는 맵? 해쉬맵?
-해쉬맵!

=============================================

55. Deligate와 event 설명
-Deligate : 다른 함수들을  대신 불러줌, 타 클래스의 함수도 부름
-event : 특정 상황에서 발생되는 것, 델리게이트로 타 함수들에게 한꺼번에 이벤트를 발생시킨다
 
=============================================
 
56. 코루틴 설명

어떠한 작업을 처리할 때 필요에 따라 시간 간격을 두고 작업을 처리할 수 있도록 도와주는 함수
메인루틴과 함께 호출되어 실행된다
IEnumerator, yield return사용

========================================

57. Yield키워드에 대해 설명

컬렉션 데이터를 하나씩 리턴 시 사용, Enumerator라고 한다.
집합적인 데이터셋으로부터 데이터를 하나씩 리턴할 때 사용
yield break - 리턴을 중지하고 루프를 빠져나올 때 사용
yield return - 컬렉션 데이터를 하나씩 리턴 시 사용

========================================

58. 짐벌락에 대해 설명, EulerAngles, Quaternions 설명

-짐벌락 : 오일러 각도로 회전 시 90도 또는 270도에 가까워지면서 두 개의 회전축이 겹치게 되어 다른회전처럼 보이는 현상
-EulerAngles - 360도가 넘어가는 시점부터는 360도 이상의 각을 보여주는 것이 아니라 0도부터 다시 시작하여 보여주게 된다.
-Quatenions - 내부적으로 사용되는 값. 짐벌락 현상을 해결하기 위해 만든 회전 각도

========================================

59. 레거시 애니메이션과 메카님 애니메이션 설명
-레거시 애니메이션 - 3d모델이 Animation컴포넌트를 가지고 있음
모든 애니메이션 파일이 한 클립에 들어있고 그걸 개발자가 하나하나 분리해서 사용해야 한다.
-메카님 애니메이션 - 모션 캡쳐 애니메이션, 리타겟팅을 이용해 기존 애니메이션 재활용 가능
Generic - 비인간형, 리타겟팅 불가
Humanoid - 2족 보행모델(인간형), 리타겟팅 가능
리타겟팅 - 애니메이션을 공유하는 것(Humanoid만 가능)

========================================

60. 유니티의 Life Cycle이 어떻게 되는지 설명

Awake - OnEnable(객체가 활성되 될 때 호출되는 함수) - Start(시작) - 1회 호출되는 함수들(초기화)
FixedUpdate(고정된 프레임 주기로 실행) - OnTrigger~ - OnCollision~ - Update(매 프레임마다 실행) - LastUpdate(업데이트 다음)(업데이트)
OnDisable - OnDestroy - OnApplicationQuit(종료)
 
=============================================
 
 
61. 유니티 Dafault Method에 대해 각각 전부 설명, 호출 순서

Reset - 유니티 에디터에서 오브젝트 생성 후 인스펙터 뷰에서 리셋을 눌러줄 때 실행. 객체의 속성을 초기값으로 재설정

Awake - 프리팹이 인스턴스화 한 후 실행. 모든 오브젝트가 초기화 된 후 호출. GameObject.Fine같은 명령문을 안전하게 사용 가능. Start전에 호출(StartCoroutine사용 불가)
OnEnable - 라이프사이클 내에서 여러번 호출 가능, setActive()로 게임 오브젝트를 활성화 할 때마다 실행됨
Start - Update전에 한 번만 실행됨, 오브젝트가 활성화 되어 있어야 호출됨

FixedUpdate - 프레임과 상관 없이 시간 기준으로 고정 호출되는 함수 
yield WaitForFixedUpdate

OnTrigger
OnCollision

OnMouse

Update - 매 프레임마다 호출하는 함수, 오브젝트가 활성화 되어있어야 호출됨

yield null
yield WaitForSeconds
yield WWW
yield StartCoroutine

LateUpdate - Update의 모든 것이 호출된 후 호출됨

OnWillRenderObject
OnPreCull
OnBecameVisible
OnBecameInvisible
OnPreRender
OnRenderObject
OnPostRender
OnRenderImage

OnDrawGizmos

OnGUI

yield WaitForEndOfFrame

OnApplicationPause

OnDisable - 게임 오브젝트, 스크립트가 비활성화 되었을 때 호출

OnApplicationQuit - 앱이 종료되기 직전 모든 오브젝트를 호출

OnDestroy - 해당 오브젝트 파괴 전, Update실행 후 호출


=========================================

62. Distance & Magnitude보다 sqrMagnitude가 왜 더 빠른지 설명
-Distance와 Magnitude는 거리 계산 혹은 충돌처리를 미세하게 조정하기 위해 연산에 루트를 씌워 계산합니다.
반면에 sqrMagnitude는 거리 계산을 미세하게 하지 않아도 되는 연산을 적용하여, 연산이 안의 두 개 보다 훨씬 빠릅니다.

=========================================

63. 오클루전 컬링 설명, 그릴지 안 그릴지 어떻게 판단해야 하는지
-시야에 보이지 영역까지 과하게 그려 메모리가 낭비되는 것을 최소화 할 수 있는 방법
카메라의 범위에 혹은 플레이어의 시야 범위에 들어오는 것 만을 그려주고, 범위 외각은 그리지 않는다.

=========================================

64. 프로스텀 컬링에 대해 설명
-오브젝트가 완전하게 보이지 않지만 일부라도 보일 때, 폴리곤의 수를 조정하여 보이는 부분만 그리는 방식

=========================================

65. DrawCall 에 대해 정의
-CPU가 GPU에게 랜더를 하도록 명령. 
CPU가 랜더링 할 것들의 정보를 GPU에게 넘겨, 랜더링을 하도록 한다
CPU의 성능에 따라 성능이 좌우된다. 
발생 조건 : 오브젝트 하나에 여러 파츠로 나뉘어진 정보들이 있다면, 그 파츠 수대로 드로우콜 발생


==========================================

66. DrawCall을 줄이는 방법
-배칭 : 동일한 메테리얼을 공유하는 오브젝트들을 묶어서 드로우콜 하는 기법. 
동적 배칭 : 몇 가지 조건 필요, 자동 적용, 효율이 뛰어나지 않음
정적 배칭 : static으로 명시적 설정 필요, 위치, 회전, 스케일 값 변동 없어야 함
-텍스쳐 아틀라스 : 여러 이미지들을 한 묶음으로 만듦
-라이트 맵 : 실시간 연산(그림자 등)을 미리 처리하여 이미지로 만듦(Bake)
-오클루젼 컬링

===========================================

67. LightMap을 어떻게 활용했는지? Bake하면 어떤 현상이 벌어지는지
-실시간 연산이 필요한 부분(그림자 등)이 고정되어, 오브젝트가 이동해도 그림자가 그대로 있다.
움직이지 않는 배경 같은 맵들을 미리 라이트맵으로 이미지로 만들어, 실제 게임에서는 연산처리 하지 않도록 한다.

============================================

68. 평면과 한 점의 최단거리를 어떻게 구하는지
-법선 벡터(수직벡터)로..
-벡터 1과 벡터 2의 내적의 절대값을 벡터 1의 절대값으로 나누면 점과 평면사이의 최단거리가 나옴
 
============================================
 

69. 레이캐스트로 평면과 충돌했는지 어떻게 판단하는지
- 법선벡터로

============================================

70. 평면과 구가 충돌했는지 어떻게 판단하는지
-법선벡터로

============================================

71. Lambert광원과 Specular에 대해 설명
-Lambert광원 : 라이틴 구조 중 가장 가벼운 것으로(연산량이 적다), 둔탁하고 딱딱한 빛 처리
-Specular : 반사, 색상, 강도를 전부 처리하여, 연산량이 많다.

============================================

72. Forward와 deffered의 차이 설명
-랜더링 패스.
-Forward Rendering : 전통적인 랜더링 패스. 전형적인 유니티 그래픽 기능을 모두 갖춤. 디폴트는 밝은 라이트가 픽셀당 모드로 설정됨.
비교적 저사양에서도 잘 작동, 문제점에 대해 해결방식이 있는 경우가 많음.
라이팅 연산이 느리고, 폴리곤이 많은 모델에 렌더링 걸기에는 부적합. 포스트 이펙트는 따로 처리
-Deffered Shading : 제일 좋은 라이트 품질, 많은 실시간 연산량. 특정 수준 이상의 하드웨어 필요
동적 라이팅이 실시간으로 이루어짐. 많은 오브젝트를 그릴 때 적합.
요구하는 하드웨어의 사양이 높고, 안티앨리어스를 구현하기 어려우며, 알파가 빠지는 오브젝트를 구현할 수 없다.

==============================================

73. 유니티 최적화 기법에 대해 아는 대로 서술(최소 7개) 
-유니티 게임 오브젝트를 찾지 말고 캐싱하라 - FindObject는 느림
오브젝트 풀링 기법을 사용 - Instanitate, Destroy함수의 비용이 큼
Update보다는 Coroutine을 활용 - Update는 매 프레임마다 호출된다.매 프레임마다 호출되는 경우가 아니라면 코루틴 사용
문자열을 연결할 땐 StringBuilder 사용 - 일반적인 String + String은 가비지컬렉터를 돌게 한다. StringBuilder.Append()사용하기
나누기보다는 곱하기 - 나눗셈 보다 곱셈의 연산속도가 몇십 배로 빠름
가비지컬렉션이 최대한 안돌도록 하자 - readonly, const사용
객체 캐싱을 활용 - GetComponent()사용
빈 콜백함수 제거 - Start, Update같은 함수들은 비어있어도 한번씩 돌기 때문에 영향이 있음
-디바이스별로 권장하는 압축 텍스쳐 포맷 - 아이폰(powerVR) : RVRCT, 안드로이드(Tegra) : DXT, 안드로이드(Adreno) : ATC, 안드로이드(공통) : ETC!
이미지 가로세로는 무조건 2의 제곱 - Power Of Two 메모리상에서 로드할 때 2의 베곱으로 로드를 하게 되는데, 2의 제곱의 사이즈가 아닌 이미지도 2의 제곱으로 로드하므로 상당한 메모리 낭비가 일어나게 된다.
압축된 텍스쳐와 밉맵 활용 - 32비트가 아닌 16비트의 텍스쳐도 상황에 따라 활용하기
오디오는 92kb모노 인코딩으로 - 모바일에서 스테레오는 의미가 없음. 따라서 92kb모노로 인코딩 하기
오디오는 .wav로 저장 - 용량을 줄이기 위해 mp3로 저장하지 않아도, 자체 인코더가 용량을 원하는데로 압축하기 때문에 음향 손실을 피하기 위해 wav로 저장하기

 
==============================================
 
74. IOS와 Android의 기본 텍스처 포맷 설명
-IOS  ->  디폴트 : RGB - RGB Compressed PVRTC 4비트 - 압축된 RGB텍스처. 컬러데이터에 고품질 텍스처이지만 압축하는데 시간이 좀 걸림. 32KB
RGBA - RGBA Compressed PVRTC 4비트 - 압축된 RGB텍스처. 컬러데이터에 고품질 텍스처이지만 압축하는데 시간이 좀 걸림. 32KB

-Android -> 디폴트 : RGB - RGB Compressed ETC - 압축된 RGB텍스처. 안드로이드 프로젝트에서 알파 채널이 없는 텍스처에 대한 기본 텍스처 압축 포맷. 32KB
RGBA - RGBA Compressed ETC2 - 압축된 RGBA텍스터. 안드로이드 프로젝트에서 알파 채널이 있는 기본 텍스처 압축 포맷. 64KB
 
==============================================
 
 
 
 
320x100

'프로그래밍 > C#' 카테고리의 다른 글

프로세스 감시 및 관리  (0) 2022.02.19
IEnumerator 와 IEnumerable의 차이점  (0) 2022.01.18