[Java] 변수에 대한 이야기

변수에 대한 이야기




변수의 타입에는 크게 기본형, 참조형으로 2가지로 나눌 수 있다.


참조형 객체의 주소를 저장한다.


Date today =null;

또는

Date today = new Date();

 

연산자 new의 연산결과생성된 객체의 주소이다.

대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다.

 

 


 boolean  

 1 byte

 char       

 2 byte



char는 문자를 내부적으로 정수값 코드로 저장하기 때문에 정수형 ( byte, short , int ,long )과 밀접한 관계가 있다.


char형은 Java에서 유니코드(2 byte 문자 체계)를 사용하므로 2 byte입니다.



큰값을 다루어야 하는 경우가 아니라면 int 와 float를 사용하자.

 

int 형은 대략 9자리 수 ( 약 20억)의 값을 저장할 수 있다.

9자릿수에 가까운 자리 수 (6~8자리)의 수를 계산 할 때는 넉넉하게 long형(약 19자리)를 사용하는 것이 좋다.

 

 

정수형 변수는 자신이 저장할 수 있는 범위를 넘어서면최소값부터 다시 반복된다.

 

만일 000~ 999까지 표현 할 수 있는데

999를 넘어서면 ( 오버 플로우 발생 )

 

000부터 다시 반복한다.

 

따라서, byte의 경우 -128(최소값)부터 시작해서 127( 최대값)을 넘으면

다시 -128부터 시작하게 된다.

 

 

[Unity3D] 카메라 광선 (Ray)

카메라 광선 (Rays)




유니티 공식 문서 

http://unitykoreawiki.com/index.php?n=KrMain.CameraRays





Rays가 뭐죠?


시작점(Origin), 방향(Direction)을 가지고, 시작점에서 정해진 방향으로 광선을 쏩니다.

Camera에서 한방향으로 광선을 쏘는거죠.



Camera 클래스에는 2가지 기능이 있습니다.

 ScreenPointToRay 

 픽셀 좌표로 제공됩니다. 왼쪽아래(0 , 0), 오른쪽위(pixelWidth, pixelHeight)



 ViewportPointToRay

 0~1범위 내에서 정규화 된 좌표입니다. 왼쪽아래(0 , 0) 오른쪽위(1 , 1)





Ray로 뭘 할 수 있죠?



카메라에서 광선을 뙇 쏴서 

어떤 물건을 바라보고 있는지, 유저가 클릭한게 뭔지를 알 수 있습니다.

Ray로 광선을 쏘고, Ray를 따라가는 RayCasting으로 알아낼 수 있습니다.




레이 캐스팅 (RayCasting)?


Raycast는 '가상의 레이저빔!!'입니다. 

해당 Ray를 따라서 충돌체(Collider)에 부딪힐 때까지 전송을 합니다.

부딪힌 오브젝트에 대한 정보와 부딪힌 지점이 반환됩니다.





글만봐서는 이해가 잘 안갈수도 있지만 예제코드를 보시면 이해가 가실거에요.


마우스 위치에 있는 오브젝트 알아 내기 코드

private RaycastHit hit = new RaycastHit();

private Ray ray;

void Update()

{

     ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray, out hit)
    {
       Transform objectHit = hit.transform;
    }
}



광선이 어딜 쏘는지 보고 싶어요!


아래 코드를 적용하면 카메라의 광선을 Scene View에서 확인 가능합니다.

그냥 광선은 빨간색으로 표현하고, 어떠한 물체에 부딪히면 초록색 광선을 쏘도록 했습니다.



   


[Unity3D] The referenced script on this Behaviour is missing!

Prefab 모두 괜찮은데 자꾸 에러가 났을 때!


New Scene으로 들어가서

오류가 나는 Prefab을 넣어두고 Play 시켜본다.

 

Missing이 안뜨면

 

중지 한 뒤에

Prefab - Apply 시키면 된다.

[Unity3D] 드로우 콜(Draw Call)?

Draw call




‘Draw Call’ 이 뭔가요?


Scene에 있는 Vertex들을 그리기위해 CPU가 GPU에 보내는 요청이지요. 요청을 보낼 때마다 DrawCall이 추가됩니다.


카메라를 통해 한 프레임의 화면을 만들어 내는 동안

1개의 셰이더 패스, 1개의 Material로 오브젝트를 1번 그리는 작업의 단위입니다.


같은 Shader, 같은 Material을 갖는 여러 개의 오브젝트는 1번의 Draw Call로 작업합니다.


예를들어,

화면에 Cube_1, Cube_2를 만듭니다.


Cube_1Material_1을 적용시키죠. Draw Call은 1입니다.

Cube_2Material_2를 적용시키면? Draw Call은 2입니다.


Draw Call이 하나 더 추가됐다니!

Cube_2Material_1을 적용합니다. Draw Call은 1이됩니다.



Material을 공유하지 않는 2 개의 오브젝트들을 함께 결합하는 것은 

성능상 아무런 개선을 주지 않는다는 것을 명심해주세요.


Draw Call수를 줄이는 일이 최적화에서 가장 중요한 요소입니다.




Unity에서 Draw Call은 어떻게 보나요?

Draw Call 확인.PNG

<Game View>에서 상단에 Stats라는 버튼 클릭 후 Draw Call 확인.

그외에 FPS, 버텍스 수, 사용한 텍스쳐량, 화면크기 등 확인가능합니다.  





Draw Call을 어떻게 줄이나요?


유니티에서 제공을하는 배칭(Batching)기술을 사용하는거지요.

배칭 기술에는 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching)2개가 있습니다. 이게 무엇인지는 나중에 이야기하죠. Draw Call을 줄이는 방법부터 볼게요.

먼저 아래 항목을 봐주세요.


1. 가능한 많은 오브젝트를 1개의 Material(1장의 텍스쳐)로 묶어야 합니다.

2. 정적배칭(Static Batching), 동적 배칭 (Dynamic Batching) 기능을 켜라. (기본으로 설정되어있음)

메뉴 Edit> Project Settings > Player  


Dynamic Batching.PNG





'배칭(Batching)'이라니요?


자동적으로 DrawCall을 줄여주는 기술이고, CPU가 GPU에 렌더링 요청을 할 때 

데이터 처리 작업을 한꺼번에 해줘서 GPU의 부담을 줄이게 해주는 것입니다.

2개가 있는데 정적배칭, 동적배칭이 있습니다.


이 2개를 켜두면 모든 오브젝트를 공유된 Material 단위로 묶습니다.

(스크립트에서 수정할 때는 materil 멤버변수 대신 sharedMaterial 멤버를 사용합니다!)




1. 동적 배칭

    • 버텍스 300개 이상인 오브젝트는 안하는게 좋다.

    • Material을 기준으로 Scene에 보이는 오브젝트들을 그룹으로 묶어 분류한다.


2. 정적 배칭(Static Batching)

    • 배칭을 위한 300개의 버텍스 상한선이 없다.

    • 동적 배칭과 유사하지만 배칭하려는 오브젝트를 움직일 수 없다.

    • 움직이지 않는 오브젝트는 Static을 체크한다. (static으로 설정된 GameObject에서 동일한 재질을 사용하는 물체가 있는 경우 자동으로 통합)



Static 설정.PNG