매개변수로 인수 전달하기

1. 값에 의한 전달 ( call by value )

외부로 영향 x , 새롭게 값 정의 복사되어 초기화 됨. 


2. 참조에 의한 전달 ( call by reference )

주소가 모두 같음, 효율성이 높아서 사용성 높음.


3. 주소에 의한 전달 ( call by address )

주소값 같음. 메모리에 저장 된 값 같음. 
포인터 변수도 변수이기 때문에  포인터의 주소는 다르게 나옴. 

배열은 포인터 

배열 : 배열에 담긴 첫번재 값의 주소를 담음.

'programming > c++' 카테고리의 다른 글

6.7 포인터 기본  (0) 2020.01.26
6.5 정적 다차원 배열  (0) 2019.05.06
*6.4 배열과 선택 정렬 selection sort (복습)  (0) 2019.05.06
6.3 배열과 반복문  (0) 2019.05.06
6.1 배열 기초적인 사용법  (0) 2019.05.06
Posted by 도이(doi)
,

포인터

메모리 주소를 저장하는 변수 


포인터의 위험성

쓰레기 주소값이 들어간 경우 dereferencing을 시도하게 되면 
엉뚱한 곳에서 데이터를 찾기 때문에 오류가 발생한다. 

*de referencing : 주소 값을 찍어서 값을 가져오는 것 

이런 문제를 방지하기 위해서

Null Pointer를 많이 사용한다. 


array변수는 배열이 아니라 Pointer다.

주소 값을 찍어보면 array는 첫번째 요소의 주소 값을 가져온다. 

array[ ]가 parameter로 사용하게 될 경우 
내부적으로 포인터가 된다. 

함수 밖에서 포인터 값을 바꿔도  다른 함수에서 값이 적용된다. 

Posted by 도이(doi)
,

Awake 함수는 생성자이다.

component 생성할 awake함수에서 실행하면 된다.

무엇인가를 생성(set)해줄 사용. 


Start함수는 

업데이트 직전에 호출되며 스크립트가 활성화 되어야 작동.

기능을 부여할 사용. 


Physics 조절하는 방법(움직임 jitter줄이기)

rigidbody 

물리 연산 가능하게하는 component 일반적으로 collider와 함께 사용./ 

이동시 rigidbody의 velocity사용해서 이동하기(물리적용 이동)

collision detection(방법 선택 가능

interpolate(이전 씬과 다음 씬의 이동을 보간해줘서 움직임을 자연스럽게 만듦.) 

extrapolate - 속도에 따른 예상 범위로의 보간. 일정한 속도를 가지고 있는 경우에 사용함. 

physics Material 

마찰력, 탄성 조절 가능


물리엔진은 fixed time step 사용한다. 
따라서, fixedUpdate에서 움직인다. 


*‘|=‘ 연산자는 명시적으로 false값을 만들어 주기 전까지 
활성화 상태를 유지한다. 


Posted by 도이(doi)
,

vsync 체크 : cpu gpu 동기화 사용. 필요 없는 경우가 많음. 

dynamic batching 체크하기 : 유니티에서 자동으로 최적화 도와줌. 


GPU Instancing을 위한 쉐이더 기본 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Shader "Custom/GPUinstancing"
{
    //shader에서 사용할 속성 (인터페이스)
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        _Emission ("Emission", Color) = (000)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
 
        CGPROGRAM
        //전처리(스니핏) - 조명 설정 
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
 
        sampler2D _MainTex;
        
        //구조체 - 엔진으로부터 받아와야할 데이터 
        struct Input
        {
            float2 uv_MainTex;
        };
        
        //변수 선언 
        half _Glossiness;
        half _Metallic;
        fixed4 _Emission;
        
        //GPU Instancing을 사용하기 위한 기능
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
        UNITY_INSTANCING_BUFFER_END(Props)
        
        //함수 - 색상 이미지 출력  
        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * UNITY_ACCESS_INSTANCED_PROP(Props, _Color);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
            o.Emission = c.rgb + _Emission;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
 


cs


생성 오브젝트에 적용하는 스크립트 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GPUInstancingTest_ : MonoBehaviour
{
    public Transform prefab;
    public int instances = 5000;
    public float radius = 50f;
 
    private MaterialPropertyBlock properties;
    private Transform t;
 
    private List<Renderer> rendlist;
 
    private void Start()
    {
        rendlist = new List<Renderer>(); //render list생성 
        properties = new MaterialPropertyBlock(); //property 블록 생성 
 
        for (int i=0; i<instances; i++)
        {
             //prefab 생성 
            t = Instantiate(prefab);
            //render 리스트 추가 
            Renderer rend = t.GetComponent<Renderer>();
            rendlist.Add(rend);
 
            t.localPosition = Random.insideUnitSphere * radius; //random 위치 
            t.SetParent(transform); //생성된 오브젝트 하위로 
        }
    }
 
    private void Update()
    {
        for(int i=0; i<instances; i++)
        {
            //색상 지정하기 
            properties.SetColor(
               "_Color"new Color(Random.value, Random.value, Random.value)
           );
            //색상 적용하기 
            rendlist[i].SetPropertyBlock(properties);
        }
    }
}
 
cs


Posted by 도이(doi)
,