IDLE

Intergrated Development Environment, 통합 개발 환경

파이썬 1.5.2B1 이후에 같이 설치되는 통합 개발 환경이다. 파이썬 명령어를 쉽게 사용할 수 있도록 제공되는 GUI 툴이다.

 

기본적인 연산 동작을 IDLE로 테스트해 본다.

IDLE은 시작에서 IDLE을 검색해서 찾아서 명령어창을 실행시킬 수 있다.

 

IDLE에는 여러 기능들이 제공된다.

 

자동완성

명령어를 빠르게 입력하거나 제공되는 함수를 찾을 수 있다.

 

구문강조

 

등의 편의성을 제공한다.

728x90
반응형

파이썬은 읽고 쓰기 쉽고 프로그래머의 작업 효율을 높이도록 디자인된 프로그래밍 언어이다.

윈도우, 맥 os, 리눅스는 물론 라즈베리 파이 등 다양한 운영체제를 지원한다. 이러한 장점들이 수많은 사용자를 이끌었고 거기에 따라서 자료도 찾기 쉬워 접근성이 더 높아지면서 그에 따라 더욱더 성장할 가능성이 있는 언어라고 볼 수 있다.

 

라이브러리

파이썬의 가장 큰 특징은 풍부한 라이브러리이다. 

문법이 간단해서 코드를 작성하는 데는 어려움이 없지만 무언가를 만들기 위해서는 목적에 맞는 라이브러리를 사용할 필요가 있다. 

 

파일을 읽고 쓰고, 네트워크에 접근하는 등 표준으로 준비돼 있는 것뿐만 아니라 서드파티가 공개하는 것도 많다.

 

대표적으로 유명한 라이브러리들이 있다.

NumPy                수치 계산 라이브러리
SciPy                   과학 기술 계산 라이브러리
PIL                       영상처리 라이브러리
Tkinter                  GUI 라이브러리
Beautiful Soup      HTML 정보 수집(스크래핑) 라이브러리
PyGame               게임 작성용 라이브러리

 

PyGame

python 3.8 버전을 기준으로 작업한다. 

게임을 개발하는데 필요한 라이브러리를 설치한다.

Anaconda

아나콘다는 파이썬에서 자주 쓰이는 패키지를 일괄적으로 설치할 수 있도록 한다.

Free Download | Anaconda

 

경로에 한글이 포함되어 있으면 에러가 발생할 수 있기 때문에 아나콘다를 설치하는 경로에는 한글이 포함되지 않도록 해주는 것이 좋다.

 

이때 환경변수를 Anaconda 폴더 내의 python.exe 가 실행되도록 경로를 맞춰야 한다.

 

게임에서 사용할 패키지를 설치한다.

 

pip install pygame

 

Error

다음과 같은 에러가 발생하면  pip이 설치되지 않아서 발생할 수 있기 때문에 직접 설치한다.

'pip'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.

pip은 보통 파이썬을 설치된다. 만약 이때 설치되지 못했다면 직접 명령어를 통해서 설치한다.

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

 

명령어를 입력하는 방법 외에도 python 인스톨러를 다시 실행시켜서 pip 설치에 대한 체크를 하고 파이썬 설치를 진행해도 된다.

 

pip 설치 후 다시 pygame 명령어 실행 시 제대로 설치가 된다.

 

완료된 패키지 파일을 실행시켜 설치한다.

python
import pygame

 

설치가 완료되면 다음 경로에 샘플이 생성된 것을 확인할 수 있다.

'[Anaconda 설치 경로]\Lib\site-packages\pygame\examples'

 

세팅 끝

 

728x90
반응형

프로그래밍에 대한 공부를 어느 정도 진행했을 무렵 다양한 언어들 중 평가가 좋은 언어를 따로 체크해 두고 학습해 보기로 하였다. 그렇게 미루고 미루다 언젠가 서점에서 책 하나가 눈에 들어왔다.

 

게임으로 배우는 파이썬

 

마침 체크리스트에는 파이썬도 있었다.

 

프로그래밍 언어는 특히 새로운 것을 학습할 때는 무언가를 만들면서 하는 게 쉽고 빠르게 습득이 된다고 생각한다.

 

게임으로 파이썬을 배울 수 있다는게 흥미가 생겨 목차만 대강 훑어보고 바로 구매하였다.

 

이 책을 시작으로 파이썬에 대해서 기본이라도 얻어갈 수 있게 된다면 의미가 있을 거라고 생각한다.

 

 책의 저자인 다나카 겐이치로는 파이썬을 배우기 위해서 입문서도 읽고 세미나도 다녔지만 익숙해지지 않았는데 자바스크립트로 만든 게임을 파이썬에 이식했더니 금방 익숙해졌다고 한다. 그래서 게임을 만들면서 파이썬을 배울 수 있도록 이 책을 만들었다.

 

또한 저자는 파이썬이 적용될 수 있는 분야가 다양하고 가능성이 무한하다고 하는데 역자 또한 동일한 맥락으로 도입글을 작성했다. 파이썬은 간결하고 쉬우며 방대한 기능을 하는 라이브러리가 매력적이라고 한다.

 

커뮤니티나 포탈에서도 파이썬에 대한 호평을 많이 봐왔는데 시작하는 글에서 다시 보게 되니 과연 파이썬이 얼마나 쉽고 간다 하며 활용성이 좋은 것일까 기대가 된다.

728x90
반응형

Collections

. Net Framework에서 사용되던 라이브러리이다. Generic 기능이 도입되기 이전에 사용되었으며 Collections의 클래스들은 모든 요소를 object 타입으로 처리하여  요소를 다룰 때에 형변환을 필요로 한다.

 

대표적의로 ArrayList, Hashtable, sortedList, Stack, Queue 등이 있다.

 

Generic

Collections의 클래스들은 형변환이 필요하기 때문에 잘못된 타입을 사용할 경우 에러가 발생하게 된다. 

이 문제를 해결하기 위해서 안정성을 제공하는 새로운 클래스들이 Generic 네임스페이스로 추가되었다.

 

대표적으로 List, Dictionary, Queue <T>, Stack <T> 등이 있다.

 

 

Collections Generic
ArrayList List<T>
Hashtable Dictionary<TKey, TValue>
Queue Queue<T>
Stack Stack<T>

 

Compare

옛날부터 작성된 코드인 경우에는 Collections 라이브러리를 사용하기 위해서 해당 네임스페이스를 선언해 주는 경우가 많다. 거기다 새로 추가된 Generic도 사용하기 위해서 두 라이브러리를 모두 선언하는 경우가 많은데 공식 문서에 따르면 Collections에서 사용하는 클래스들은 Generic에 안정성이 추가된 대체할 수 있는 클래스들이 있기 때문에 되도록이면 Generic만 사용하기를 권장한다.

 

대표적으로 ArrayList와 List<T>를 비교해 본다. 

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // ArrayList
        ArrayList arrayList = new ArrayList();

        // 요소 추가
        arrayList.Add("Hello");
        arrayList.Add(30);
        arrayList.Add(true);

        // 요소 접근
        string str = (string)arrayList[0];
        int num = (int)arrayList[1];
        bool flag = (bool)arrayList[2];

        Console.WriteLine(str);  // 출력: Hello
        Console.WriteLine(num);  // 출력: 30
        Console.WriteLine(flag); // 출력: True
        
        // List<T>
        List<object> list = new List<object>();

        // 요소 추가
        list.Add("Hello");
        list.Add(30);
        list.Add(true);

        // 요소 접근
        string str = list[0];
        int num = list[1];
        bool flag = list[2];

        Console.WriteLine(str);  // 출력: Hello
        Console.WriteLine(num);  // 출력: 30
        Console.WriteLine(flag); // 출력: True
    }
}

arrayList와 list 변수 모두 가변 배열로 요소를 추가하고 인덱스로 접근하여 값을 사용하고 있다.

하지만 사용법에서 차이가 발생한다.

 

ArrayList는 Add 메서드를 사용하여 요소를 추가하고 접근할 때에는 형변환을 수행해야 한다. 모든 요소를 object 타입으로 처리하므로 요소를 사용하기 전에 타입을 캐스팅해야 한다.

 

하지만 List 요소의 타입은 컴파일 시점에 검사 되기 때문에 추가한 요소에 접근할 때 형변환이 따로 필요하지 않다. 

즉 Generic을 사용하게 되면 타입의 안정성이 보장되고 컴파일러가 타입을 검사를 수행하기 때문에 타입으로 인해 발생하는 문제를 사전에 발견할 수 있으며 형변환 코드를 작성할 필요가 없기 때문에 코드가 간결해진다.

728x90
반응형

C#은 객체지향 언어로 객체지향 프로그래밍을 위한 개념들이 있다.

 

Class

객체를 정의하는 템플릿이며 객체의 상태를 나타내는 필드와 동작을 나타내는 메서드를 포함한다.

즉 클래스는 객체를 표현하기 위한 설계도로 볼 수 있다.

public class MyClass
{
    // field, 멤버 변수
    public int id;
    public string name;
    public int age;
    
    // method, 멤버 함수
    public void Introduc()
    {
        string introduce = "My age : " + agem + "\nMy name : " + name;
    	Cosole.WriteLine(introduce);
    }
}

MyClass라는 객체에는 id, name, age 멤버변수와 Introduce 메서드를 포함하고 있다.

 

Instance

클래스의 인스턴스로 실제로 메모리에 할당된 데이터이다. 객체는 클래스에서 정의된 필드와 메서드를 사용할 수 있으며 개별적인 상태를 유지한다.

public void Main(string[] args)
{
    // Instance, MyClass 클래스의 객체
    MyClass myClass = new MyClass();
    myClass.id = 1;
    myClass.name = "bak";
    myClass.age = 30;
    myClass.Introduce();
    
    // Instance, myClass와는 개별적인 객체
    MyClass myClass2 = new MyClass();
    myClass2.id = 2;
    myClass2.name = "kim";
    myClass2.age = 25;
    myClass2.Introduce();
}

동일한 MyClass를 인스턴스화한 myClass와 myClass2는 개별적인 객체이다.

 

Inherit

클래스 간의 계층 구조를 형성하여 코드의 재사용성과 구조화를 실현한다. 기존 클래스를 기반으로 새로운 클래스를 정의하고 확장할 수 있는데 ㅅ상속을 통해 부모 클래스의 멤버를 자식 클래스에서 사용하는 것이 가능하다.

 

public class Parent
{ 
    public int id;
    public string name;
    
    public void MethodParent()
    {
    	Console.Log(id, name);
    }
}

public class Child
{
    public void MethodChild()
    {
    	id = 10;
        name = "bak";
        MethodParent();
    }
}

재사용할 코드는 부모 클래스로 만들어서 자식 클래스에서 상속하여 그대로 사용할 수 있다.

 

Polymophism

다형성은 같은 이름의 메서드나 속성을 다른 방식으로 구현하는 개념이다. 다형성은 상속과 관련이 깊으며 부모 클래스의 타입으로 자식 클래스의 객체를 참조하면 다형성을 활용할 수 있다.

 

public class Parent
{
    public virtual void MethodParent()
    {
    	Console.WriteLine("Call Parent Method");
    }
}

public class Child
{
 	public override void MethodParent()
    {
    	Console.WriteLine("Call Parent Method From Child");
    }
}

다형성의 대표적인 예는 부모 클래스의 메서드를 자식에서 오버라이딩하는 경우가 있다.

 

Encapsulation

객체의 상태와 동작을 외부로부터 감추는것을 뜻한다.  클래스는 필드와 메서드를 적절한 접근 제한자로 제어하여 캡슐화를 구현할 수 있다. 이는 객체의 내부 구현을 보호하며 외부에서는 필요한 기능만 사용할 수 있도록 한다.

 

public class MyClass
{
    private string name;
    private int age;
    
    public void SetName(string name)
    {
    	this.name = name;
    }
    
    public string GetName()
    {
    	return name;
    }
    
    public void SetAge(int age)
    {
    	this.age = age;
    }
    
    public int GetAge()
    {
    	return age;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
    	MyClass myClass = new MyClass();
        myClass.SetName("Bak");
        myClass.SetAge(30);
        Console.WriteLine("Name : " + myClass.GetName());
        Console.WriteLine("Age : " + myClass.GetAge());
    }
}

클래스에서 접근을 허용할 부분을 public 불필요한 부분은 private로 접근 제한자를 두어 필요한 부분만 제어할 수 있도록 한다.

 

Abstract

복잡한 시스템을 단순화하고 핵심적인 요소만을 추출하여 모델링하는 과정을 말한다. 추상화는 클래스의 공통적인 특징을 추출하여 부모 클래스나 인터페이스로 정의할 수 있다.

 

public class Person
{
    public int age;
    public string name;
    public int countryCode;
    
    public virtual void Eat() {}
    public virtual void Sleep() {}
    public virtual void Work() {}
}

public class Student : Person
{
    public override void Work()
    {
    	Console.WirteLine("Studying");
    }
}

public class Teacher : Person
{
    public override void Work()
    {
    	Console.WriteLine("Teaching");
    }
}

추상화는 클래스를 만들 때 필요한 기본 개념으로 재사용, 다형성 등을 고려하여 최대한 구체적이지 않으면서 공통적인 부분을 부모 클래스로 만들 때 필요하다.

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 인스턴스 생성 키워드 : new - 생성자와 소멸자  (0) 2024.05.06
C# 라이브러리 Collections, Generic  (0) 2023.05.16
C# Operator 키워드  (0) 2023.04.27
C# Method Parameter 키워드  (0) 2023.04.27
C# Namespace 키워드  (0) 2023.04.27

에디터 버전 : 2021.3.28f1 (LTS)

 

Audio

오디오 시스템을 구성하는 데 사용되는 설정으로 모든 Audio 컴포넌트에 영향을 미치는 전역적인 설정을 제공한다.

 

Unity Project Settings - Audio

 

Global Volume

오디오 시스템의 볼륨을 전역으로 적용한다.

Audio - Global Volume

볼륨의 초기값에 곱해주는 수로 AudioListner.volume과 동일하다.

 

Volume Rolloff Scale

볼륨이 감쇠되는 정도를 전역으로 조절한다. 

Audio Volume Rolloff Scale

단 Logarithmic Volume Curves 인 경우에만 적용된다.

Logarithmic Volume Curves는 로그 함수 곡선형태로 사운드가 감쇠되는 경우에만 적용되는데 이 사운드는 Audio Source 컴포넌트의 속성값 중에 3D Sound Settings의 Volume Rolloff에서 선택할 수 있는 옵션이다.

( 기본으로 Logarithmic Rolloff 설정 )

 

값은 기본적으로 1로 되어있는데 이 값이 현실에 가장 가까운 수치이다.

 

Doppler Factor

소리에 도플러 효과(Doppler Effect)를 적용시키기 위한 수치이다. 

Audio Doppler Factor

원하는 도플러 효과를 얻기 위해서 해당 수치를 조절할 수 있다.

 

Doppler Effect

도플러 효과란 파동의 진동수가 왜곡되는 현상이다. 음원(소리의 근원지)가 움직이면서 파원이 다가오고 있을 때 정지한 관찰자에게는 파동의 파장이 실제보다 짧게 느껴지고 다시 멀어지게 되면 파장이 실제보다 길게 느껴지는 것이다.

 

예를 들어 멀리서부터 소방차가 사이렌을 켜고 달려오고 있다. 이때 멀리서부터 나에게 가까워지는 동안에는 사이렌의 소리가 점점 높아지는 것처럼 들리다가 내 옆을 지나쳐 멀어질 때는 낮아지는 것처럼 느껴진다. 하지만  이는 상대적인 효과로 관찰자만 느끼는 현상이고 소방차에 탑승한 사람에게는 일정한 소리로 들린다.

 

유니티의 프로젝트 세팅에서 Doppler Factor 수치는 기본적으로 1이다. 이 수치는 소리의 움직임이 실제 도플러 효과와 거의 동일하게 시뮬레이션되며 값이 0에 가까워질수록 도플러 효과가 감소하고 값이 높아질수록 강조된다.

 

Default Speaker Mode

프로젝트의 오디오 출력을 설정할 수 있는 옵션이다. 유니티 엔진에서 오디오가 재생될 때 사용되는 스피커의 타입을 지정할 수 있다.

Audio - Default Speaker Mode

옵션의 종류는 다음과 같다.

Default Speaker Mode - Option

 

Mono

채널 개수가 1개이다.

오디오를 단일 스피커에서 재생한다. 오디오 소스는 좌우 채널이 결합된 단일 스피커로 재생된다. 

주로 모노 오디오 효과나 음성 등 단일 채널 오디오를 재생하는 데 사용된다.

 

Stereo

채널 개수가 2개이다.

좌우 스피커에서 각각의 채널이 재생된다. 대부분의 오디오에서 사용되는 일반적인 스테레오 효과를 재생할 때 사용되며 기본으로 선택된 설정이다.

 

Quad

채널 개수가 4개이다.

전후좌우  4개의 스피커에 각각의 채널이 재생되며 3D 오디오 효과를 표현할 수 있다.

 

Surround

채널 개수는 5개이다.

전면 좌우, 중앙, 후면 좌우 5개의 스피커를 사용한다. 더 입체적인 공간 음향 효과를 재생할 수 있다.

 

Surround 5.1/7.1

채널 개수는 5개 이상이다.

전면 좌우, 중앙, 후면 좌우 + 서브 우퍼 채널을 통해 사운드가 재생된다.

 

Prologic DTS(Digital Theater System)

채널 개수는 2개이다.

스피커는 스테레오로 출력되지만 데이터는 Prologic/Prologic2 디코더에서 인식하고 5.1 채널 스피커로 분리되도록 인코딩 된다.

 

System Sample Rate

출력되는 샘플 레이트를 설정한다. 해당 수치를 조절하면 오디오 주파수의 표현 범위를 조정할 수 있다. 0으로 설정하면 시스템의 샘플 레이트를 사용하고 0 이외의 값을 설정하면 입력한 값을 샘플 레이트로 사용하게 된다. iOS나 Android와 같은 특정 플랫폼에서 샘플 레이트를 변경할 수 있는 경우에만 해당한다.

 

Sample Rate

샘플의 빈도수 즉, 1초당 추출되는 샘플의 개수를 뜻한다. 샘플 레이트의 수치가 높을수록 정확한 음원을 저장할 수 있지만 그만큼 용량이 기하급수적으로 증가한다. 이에 따라 적당한 타협선인 44.1kHz의 샘플 레이트가 일반적으로 사용된다. 

 

DSP Buffer Size

Digital Signal Processing 버퍼 크기

실시간으로 들어오는 오디오 데이터를 처리하고 재생하기 위해서 일시적으로 저장하는 공간의 크기를 설정한다.

Audio - DSP Buffer Size

해당 저장공간이 작으면 오디오 데이터가 빠르게 처리되지만 CPU 부하가 증가하고 지연 시간이 감소한다. 반면에 공간이 큰 경우에는 한 번에 더 많은 오디오 데이터가 처리되므로 CPU부하가 감소하고 지연 시간이 증가한다.

 

DSP Buffer Size

Default

유니티의 기본 DSP 버퍼 크기를 사용한다. 대부분의 경우 적절한 응답성과 지연 시간을 제공하는 안정적인 설정이다.

 

Best latency

지연 시간을 고려하여 성능을 절충한다. 더 낮은 지연 시간이 요구되는 실시간 애플리케이션에 적합하다. CPU 부하가 증가할 수 있고 낮은 CPU 성능에서는 문제가 발생할 수 있다.

 

Good latency

지연 시간과 CPU 성능의 균형을 유지한다. 일반적인 오디오 처리 요구 사항을 충족하는데 적합하다.

 

Best performance

CPU 성능을 유리하도록 지연시간을 맞춘다. 높은 오디오 처리 요구 사항이 있거나 더 많은 CPU 성능을 활용해야 하는 경우에 적합하며 지연 시간이 증가할 수 있다.

 

Max Virtual Voices

Audio - Max Virtual Voices

오디오 시스템이 관리할 수 있는 최대 사운드의 개수를 설정한다. Real Voices의 수보다 크게 설정되어야 하며 그렇지 않은 경우 콘솔에서 경고 메시지가 표시된다. 가장 큰 소리들 중에서 Max Real Voices 수만큼만 실제로 재생되고 나머지 소리들은 재생 위치만 업데이트된다.

 

Max Real Voices

Audio - Max Real Voices

게임에서 동시에 재생 가능한 실제 음성의 수를 설정한다. 매 프레임마다 가장 큰 음성이 선택된다.

 

Spatializer Plugin

Audio - Spactializer Plugin

공간화된 오디오 처리를 수행하기 위한 플러그인이다. 오디오를 공간적으로 위치시키고 음향 효과를 적용하여 3D 소리의 현실감을 높이는 데 사용된다.

 

일반적으로 게임 엔진이나 오디오 미들웨어에서 제공되며 다양한 기능과 설정을 제공한다. 오디오 원본의 위치, 방향, 거리 등을 고려하여 소리를 공간 내에서 정확하게 재생할 수 있으며 일반 스피커 시스템이나 헤드폰을 사용하는 경우, 소리가 사용자 주변에서 움직이거나 공간의 특정 위치에서 들리는 것처럼 느껴지게 된다.

 

해당 기능을 사용하기 위해서는 해당 플러그인의 최신 SDK 설치가 필요하다.

현재 버전을 기준으로 공식문서에서 안내되는 플러그인 다운링크

 

Ambisonic Decoder Plugin

Audio - Ambisonic Decoder Plugin

Ambisonic을 Binaural 필터링하기 위한 플러그인을 설정할 수 있다.

유니티에서 제공되는 빌트인 디코더는 없으며 일부 VR 하드웨어 제조사의 경우 오디오 SDK에 유니티용 빌트인 디코더가 있다. 타깃 플랫폼 제조사의 문서를 통해 프로젝트에 적합한지 확인할 수 있다.

 

Ambisonic 오디오 클립을 임포트 하려면 임포트 한 파일의 Ambisonic 옵션을 체크해야 한다.

Import Ambisonic Audio Clip

Ambisonic 클립을 사용하기 위해서는 Audio Source 컴포넌트의 Spatialize 옵션을 비활성화해야 하고 해당 클립이 재생될 때 자동으로 프로젝트에서 선택된 플러그인을 통해서 디코딩된다.

 

Ambisonic

다중 마이크로폰 배열을 사용하여 소리의 공간 정보를 캡처하는 방법이다. 소리의 방향, 거리, 공간 위치 등을 캡처하여 공간적으로 정확한 사운드 재생을 가능하게 한다. 일반적으로 360도 환경 음향을 재현하거나 VR 및 3D 오디오 환경에서 사용된다. 다중 채널 포맷으로 저장되고 Ambisonic을 사용하면 각 채널을 특정 스피커에 매핑하지 않고 사운드필드가 더 전체적인 방법으로 표현된다. 

Binaural

인간의 이중귀를 모방하여 소리를 전달하는 기술이다. 두 개의 이어폰 또는 헤드폰을 사용해서 소리를 개별적으로 각 귀에 전달함으로 공간적인 사운드 경험을 제공한다. 3D 오디오를 더욱 현실적이고 공간적으로 인지할 수 있도록 한다.

 

Disable Unity Audio

Disable Unity Audio

런타임에 출력 장치를 할당하지 않도록 설정한다. 내장된 오디오 시스템 이외의 다른 사운드 시스템을 사용하는 경우에 활성화하는 옵션이다. 

 

Enable Output Suspension (editor only)

Enable Output Suspension

출력이 오랜 시간 동안 정지된 것이 감지되면 자동으로 오디오 출력을 일시 중단시킨다. 오디오 시스템을 중단하면 컴퓨터가 절전 모드로 전환되는 것을 방지하는 운영 체제의 기능이 비활성화되고 이를 통해 오랜 시간 동안 정지된 오디오 출력으로 인해 컴퓨터가 절전 모드로 전환되는 것을 방지할 수 있다. 주로 배터리 수명을 연장하거나 오디오가 정지된 상태에서 시스템의 에너지 소비를 최소화하기 위해 사용된다.

 

해당 설정은 기본적으로 활성화되어 있다.

 

Visualize Effects

컬링 되는 오브젝트의 Audio Source에서 Spatializer를 동적으로 비활성화하여 CPU를 절약한다. 

즉 카메라에 의해 렌더링 되지 않는 오브젝트에 대한 오디오 처리를 제한시킨다.

728x90
반응형

최근에 랩탑의 os를 Windows 11로 업그레이드했다.

Windows 10이 괜찮기 때문에 굳이 업그레이드할 이유가 없었지만 약간의 변경된 부분이 있다는 게 궁금해서 확인차 업그레이드를 진행했다. 출시되고 어느 정도 시간이 지난 지금에서야 하는 이유는 어느정도 업데이트가 되고 안정된 상태에서 사용하고 싶었기 때문이다.

 

 

Windows 11

현재까지 사용한 느낌으로는 몇 가지 자잘한 버그들이 남아있는 것 이외에는 크게 문제 되는 게 없는 거 같다. 물론 간단한 작업용으로 사용하는 랩탑이기 때문에 여러 프로그램을 테스트해보지는 못했다. 10에서와 크게 다른 점은 시작 메뉴의 기본 위치와 창의 최소화할 때 애니메이션 정도이다. 약간 경쟁사의 느낌이 들긴 하지만 MS는 모니터가 점점 비대해지는 시대에 맞춰 사용자의 불편함을 덜고자 구석이 아닌 가운데에 시작메뉴를 위치시켰다고 한다.

위치 이외에도 시작 메뉴 내부 구성도 변경되었는데 원래도 자주 쓰지 않았지만 기존 사용방식에 익숙했던 사람들에게는 호불호가 갈리는 가장 큰 변경사항이다.

 

이외에도 기능적으로 추가되고 변경된 게 있지만 굳이 11로 업그레이드할 만큼 눈에 띄는 건 없다. Windows 10의 서비스 기간이 25년까지이기 때문에 더 이후에 업그레이드를 해도 될 것 같다.

 

Edge Browser

Windows 11을 사용한 김에 Edge도 한번 사용해 보기로 한다.

브라우저는 이미 Chrome 이 잘 만들어져 있기 때문에 다른 걸 찾아서 써보진 않았지만 MS에서 만들었다고 하니 한번 사용해 보았다. 

 

우선 Edge와 Chrome의 브라우저 벤치마크부터 비교해 본다.

벤치마크 툴은 Motion Mark, Speedometer, JetStream을 돌려보았다.

 

좌 Chrome 우 Edge

 

Motion Mark

그래픽 성능과 애니메이션 처리 능력을 평가하기 위한 웹 브라우저 벤치마크 툴이다. 각 항목들은 특정 그래픽 및 애니메이션 작업을 수행하고 그 성능을 측정하는 데 사용된다.

Motion Mark

Multiply : 두 개의 이미지를 곱하는 연산을 픽셀 단위로 수행하여 이미지 처리 작업의 성능을 측정한다.

Canvas Arcs : <canvas> 요소를 사용하여 원을 그리는 작업을 수행하여 렌더링 능력을 평가한다.

Leaves : 움직이는 잎사귀들을 표시하는 작업을 수행하여 애니메이션 처리와 부드러운 움직임에 대한 성능을 평가한다.

Paths : 다양한 형태와 곡선을 따라 그려지는 경로를 생성하는 작업을 수행하여 벡터 그래픽 작업에 대한 성능을 측정한다.

Canvas Lines : <canvas> 요소를 사용하여 선을 그리는 작업을 수행하여 선그리기 능력을 평가한다.

 

Speedometer

웹 애플리케이션의 성능을 평가하기 위한 벤치마크 툴이다. 실제로 자주 사용되는 기술과 프레임워크를 사용하여 작성된 테스트 케이스를 실행하고 작업을 얼마나 잘 처리하는지를 측정한다. 

 

speedometer

구체적인 의미를 제공하지 않지만 결과 점수를 통해서 상대적인 점수를 지표로 활용할 수 있다.

 

JetStream

브라우저의 JavaScript 성능을 평가한다. 웹 페이지가 동적으로 구현될 때 JavaScript 코드를 얼마나 효율적으로 실행하는지를 축정한다. 

JetStream

Java Script를 사용한 숫자 연산, 문자열 처리, 배열 조작, DOM 조작, 애니메이션 등의 작업을 처리한 결과를 종합하여 점수로 표기한다.

 

동일한 상태에서 돌려본 결과 모든 점수가 chrome이 더 높지만 엄청나게 큰 점수차가 나는 건 아니었다. 두 브라우저를 모두 사용해본 결과 이미 사용중이고 익숙한 브라우저가 있다면 굳이 다른 브라우저로 갈아탈만큼 큰 차이도 없고 브라우저를 갈아탄다고 해서 불편할것도 없어 보인다.

 

E-tree

edge의 사이드바 메뉴에서 플레이할 수 있는 미니게임이 있다.

tree

매일 일정량의 물이 제공되고 추가 미션을 통해서 더 획득할 수 있다. 미션 중에 환경을 키워드로 bing을 통해서 검색해 보는 미션이 있다. 가상이지만 나무를 키우면서 현실의 환경에 대해서 되돌아보다가도 사이버 나무를 키우기 위해서 컴퓨터를 켜고 전기를 사용하는 게 실제 나무에게 더 안 좋은 영향을 끼치는 게 아닐까 생각도 잠시 했지만 나무를 키우려고 컴퓨터를 켜지는 않고 애초에 켜져 있을 컴퓨터 이왕이면 하다가 한 번쯤 환경을 되돌아보게 만드는 점이 더 크게 작용할 것이다.

728x90
반응형

'Life' 카테고리의 다른 글

치토스 맥앤치즈  (0) 2023.10.23
오랜만에 만족스러운 영화관람! 슈퍼 마리오 브라더스  (0) 2023.05.08
베트남 콘삭 커피  (0) 2023.04.09
티스토리 단축키  (0) 2023.03.30
장 줄리앙 전시회 - 그리고 거기  (1) 2023.03.27

다국어를 제공하는 방법으로는 크게 3가지를 생각해 볼 수 있다.

 

1. 서버에서 json을 받아서 사용하기

2. 클라이언트에서 json을 하드코딩하기

3. 웹 문서 사이트 API 사용하기

 

서버에서 JSON 가져오기

서버로부터 JSON 형식으로 데이터를 받아서 클라이언트에서 적용만 하는 방식이다. 서버에서 데이터가 관리되기 때문에 내용에 변경사항이 생겨도 클라이언트에서 따로 수정이 필요하지 않으며 여러 플랫폼에서 동일한 데이터를 사용할 수 있다.

 

언어별 스키마 속성 추가

Monster라는 테이블이 있을 때 다음과 같이 정의한다.

Monster Table
{
	'monsterId' : '1',
    'monsterNameKor' : '박코딩',
    'monsterNameEng' : 'Coding Bak',
}

 

하나의 테이블에서 지원할 언어만큼 속성을 추가해서 만든다. 단순한 구조로 데이터가 추가되어도 DB가 크게 복잡해지지 않기 때문에 확장성이나 유지, 보수 측면에서 유리하다. 다만 사용하는 데 있어서 클라이언트에서는 적용할 때 서비스할 언어에 맞춰 Kor, Eng를 구분해서 접근하거나 또는 API 호출에서 구분해서 데이터를 받을 수 있도록 서버단에서 작업을 해줄 필요가 있다.

 

언어별 테이블 분리

제공할 언어마다 테이블을 따로 분리하는 구조이다.

Moster_Kor Table
{
	'id' : '1',
    'name' : '박코딩'
}

Monster_Eng Table
{
	'id' : '1',
    'name' : 'Coding Bak'
}

 

클라이언트에서는 별도로 처리할 필요 없이 name으로 접근해서 사용할 수 있어 편리하지만 서버 입장에서는 DB의 구조가 복잡해지고 지원할 언어의 수만큼 테이블이 배로 늘어나기 때문에 유지 보수에 불리하다.

 

다중 언어 전용 테이블 구조

다국어가 적용될 모든 데이터에 대한 정보를 모아두고 사용할 방식에 맞게 데이터를 정리해서 보낸다.

Monster Table
{
	'monsterId' : '1',
    'monsterName_tId' : '1'
}

Language Table
{
	'tId' : '1',
    'eng' : 'Coding Bak',
    'kor' : '박코딩',
}

 

 

번역이 필요한 정보들을 하나의 테이블에 묶고 별도의 키값을 통해서 데이터를 연동시켜 사용하는 방식이다. 한 곳에서 일괄적으로 정보들을 관리할 수 있기 때문에 데이터가 수정되거나 추가될 때 쉽게 처리가 가능하다. 하지만 데이터를 연관 짓고 필요한 정보만 묶어서 보내야 하기 때문에 DB구조와 쿼리문이 복잡해질 수 있다.

 

서버에서 언어 데이터를 관리하는 방식에는 여러 방법들이 있지만 서버에 요청하고 응답을 기다려야 하기 때문에 데이터량과 위치에 따라서 지연시간에 대한 문제가 발생할 수 있다. 서버에서 보낼 데이터량이나 서비스할 지역이 여러 곳이라면 각 지역별 인터넷 환경과 서버로부터 거리 또한 고려해서 대응이 필요하다.

 

이런 문제를 해결하기 위한 방법들도 존재한다.

 

Edge Computing

사용자 또는 데이터 소소의 물리적인 위치나 그 근처에서 컴퓨팅을 수행하는 것으로 사용자가 단말 장치와 가까운 위치에서 컴퓨팅 서비스를 처리하면 더 빠르고 안정적인 서비스를 제공받을 수 있는 여러 위치에서 공통의 리소스 풀을 사용하여 데이터 연산 및 처리를 분산시키는 방법이다.

 

AWS Lambda, Cloudflare Workers 등에서 서비스를 사용할 수 있다.

 

SSG

Server Side Generation 또는 Static Site Generation

Next.js 같은 메타 프레임워크에서 사용할 수 있는 방식으로 빌듯이 데이터를 받아서 미리 언어별로 페이지를 분기처리하는 방식이다.  빌드할 때 서버로부터 요청을 보내고 데이터를 받아와서 파일들을 미리 생성해 놓기 때문에 지연시간이 발생하지 않게 하는 방식이다.

 

클라이언트에서 관리

언어 데이터를 클라이언트단에서 관리하는 방식이다. 별도의 서버 요청이 필요 없기 때문에 요청하고 응답을 대기하는 시간이 없다. 하지만 정보가 변경될 때마다 클라이언트에서 수정이 필요할 수 있다.

 

클라이언트 내부에서 하드코딩으로 직접 언어 데이터를 정리해서 사용하는 경우 데이터 수정 시 클라이언트의 수정이 필요하고 다른 플랫폼의 클라이언트도 있는 경우 모두 동일하게 수정해서 데이터를 일치시켜야 하는 번거로움이 있다.

 

일반적으로 json 형식으로 데이터 파일을 만들고 클라이언트에서는 파일을 로드하고 코드상에서 값들을 가져다 쓰는 방식을 사용한다. 

 

별도의 json 다국어 데이터 파일
{
  "en": {
    "greeting": "Hello!",
    "buttonText": "Submit"
  },
  "ko": {
    "greeting": "안녕하세요!",
    "buttonText": "제출"
  },
  "fr": {
    "greeting": "Bonjour!",
    "buttonText": "Soumettre"
  }
}
using System;
using System.IO;
using Newtonsoft.Json.Linq;

public class Program
{
    public static void Main()
    {
        // JSON 파일 경로
        string jsonFilePath = "path/to/your/json/file.json";

        // JSON 파일 로드
        string jsonContent = File.ReadAllText(jsonFilePath);

        // JSON 파싱
        JObject jsonData = JObject.Parse(jsonContent);

        // 사용자 언어 설정 (예: "en", "ko", "fr")
        string userLanguage = "en";

        // 다국어 데이터 가져오기
        string greeting = jsonData[userLanguage]["greeting"].ToString();
        string buttonText = jsonData[userLanguage]["buttonText"].ToString();

        // 다국어 데이터 사용 예시
        Console.WriteLine(greeting);       // 인사말 출력
        Console.WriteLine(buttonText);     // 버튼 텍스트 출력
    }
}

파일을 별도로 두고 클라이언트에서는 파일을 로드하고 데이터를 가공해서 사용하게 된다. 이때 파일 위치를 번들처럼 외부에 두고 사용하여 언어 정보만 변경이 된 경우에는 해당 파일만 수정해 주면 클라이언트상에서 수정 없이 작업이 가능하다.

 

문서 관리 서비스 사용

여기서 문서 관리 서비스란 구글 스프레드시트 처럼 제공되는 서비스를 말한다. 직관적인 형식으로 데이터를 관리할 수 있으며 여러 클라이언트에서 동일한 데이터를 사용할 수 있다. 하지만 접근하기 위해서는 API의 호출이 필요하고 이 과정에서 서버에 요청이 필요하기 때문에 지연시간이 발생할 수밖에 없으며 서비스마다 지원되는 API에 제한이 있다.

 

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using System;
using System.Collections.Generic;
using System.IO;

public class Program
{
    static readonly string spreadsheetId = "your-spreadsheet-id";
    static readonly string credentialsFilePath = "path/to/your/credentials.json";

    public static void Main()
    {
        // 인증 정보 로드
        GoogleCredential credential;
        using (var stream = new FileStream(credentialsFilePath, FileMode.Open, FileAccess.Read))
        {
            credential = GoogleCredential.FromStream(stream)
                .CreateScoped(SheetsService.Scope.Spreadsheets);
        }

        // SheetsService 생성
        var serviceInitializer = new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "Your Application Name"
        };
        var sheetsService = new SheetsService(serviceInitializer);

        // 데이터 가져오기
        IList<IList<object>> values = GetSpreadsheetValues(sheetsService, spreadsheetId, "Sheet1");

        // 가져온 데이터 출력
        if (values != null && values.Count > 0)
        {
            foreach (var row in values)
            {
                foreach (var cell in row)
                {
                    Console.Write(cell + "\t");
                }
                Console.WriteLine();
            }
        }
        else
        {
            Console.WriteLine("No data found.");
        }
    }

    public static IList<IList<object>> GetSpreadsheetValues(SheetsService sheetsService, string spreadsheetId, string sheetName)
    {
        string range = $"{sheetName}!A1:Z";
        SpreadsheetsResource.ValuesResource.GetRequest request =
            sheetsService.Spreadsheets.Values.Get(spreadsheetId, range);

        ValueRange response = request.Execute();
        IList<IList<object>> values = response.Values;

        return values;
    }
}

 

다양한 방법들로 다국어 데이터를 관리할 수 있는데 이 중 장단점들을 고려하여 프로젝트의 성격 및 특징에 알맞은 방식을 선택하는 것이 중요하다. 

728x90
반응형

'Memo' 카테고리의 다른 글

C# Class 크기 확인  (0) 2023.02.06

 

슈퍼 마리오가 애니메이션으로 나온다는 소식을 처음 접했을 때는 과연 영화로 슈퍼 마리오의 스토리와 액션을 재밌게 풀어나갈 수 있을까 반신반의했다. 하지만 그런 걱정은 예고편을 보고 나서 사라졌다. 박진감 넘치는 액션과 익숙한 배경음악만으로 내 가슴은 두근거리기 시작했다.

 

2023 04 30 

강남의 메가박스에서 슈퍼 마리오 브라더스를 감상했다. 생각보다 사람들이 많이 없어서 한적하게 영화를 즐길 수 있었다.

 

우선 영화 감상부터 말하자면 캐릭터부터 배경, 음악, 스토리 모두 잘만들어진 작품이었다. 정교한 애니메이션으로 캐릭터들 하나하나 개성을 잘 살리고 표정과 액션을 잘 묘사했다. 배경으로 보이는 여러 요소들도 원작의 팬들이라면 반가워할 만큼 디테일하게 담아냈다. 배경 음악과 효과음 또한 영화에 어울리게 보정을 해서 튀지 않으면서도 원본을 잘 살려 반가움과 추억을 느낄 수 있었다. 

 

스토리는 원작의 느낌을 잘 녹여냈고 126분이라는 시간동안 지루할 틈 없이 매끄럽게 쭈욱 이어나간다.

너무 유치하지도 않으면서 개연성은 잘살렸고 나이 상관없이 모두 즐길 수 있는 유머들도 좋았다. 물론 원작을 전혀 몰라도 보는데 지장이 없는 작품이지만 나처럼 어린 시절에 슈퍼 마리오에 대한 추억이 있다면 더 몰입되고 반가운 요소들과 사운드 때문에 상영 내내 설레면서 보게 될 것 같다.

 

엔딩 크레딧이 모두 올라가고 나오는 쿠키 영상에서 상영관의 모든 사람들이 반가움의 감탄을 뱉어냈다. 그렇게 다음 후속작에 대한 떡밥까지 던지면서 영화는 마무리되었다. 

 

귀여운 펭귄

 

가정의 달인 5월에 가장 어울리는 영화라 생각한다.

이번편에서 자세하게 다루지 않은 부분들이 다음 편에 어떻게 나올지 기대되면서 후속작을 기다려본다.

728x90
반응형

'Life' 카테고리의 다른 글

치토스 맥앤치즈  (0) 2023.10.23
사이버 나무  (0) 2023.05.11
베트남 콘삭 커피  (0) 2023.04.09
티스토리 단축키  (0) 2023.03.30
장 줄리앙 전시회 - 그리고 거기  (1) 2023.03.27

에디터 버전 : 2021.3.28f1 (LTS)

 

Adaptive Performance

모바일 장치와 같은 저사양의 플랫폼에서 자동으로 프레임률을 관리하고 최적화할 수 있도록 기능을 제공한다.

기능이 활성화되면 하드웨어 자원을 최대한 활용하여 최적의 성능을 얻을 수 있다. 

 

기능을 사용하기 위해서는 Adaptive Performance 패키지부터 설치해야 한다. 아래의 인스톨 버튼을 클릭하면 해당 패키지의 최신 버전의 설치가 진행된다.

 

패키지 설치가 끝나면 다음과 같이 화면이 변경된다.

 

Adaptive Performance Docs

공식 문서부터 살펴본다.

view documentation

 

해당 패키지의 설명은 이렇다.

 

Adaptive Performance allows you to get feedback about the thermal and power state of your mobile device and react appropriately.
(Adaptive Performance를 사용하면 모바일 장치의 발열과 전원 상태에 대한 피드백을 가지고 적절하게 대응할 수 있다.)

 

여기서 전원 상태란 모바일 장치의 전력 상태를 의미한다.

(전력이 낮은지, 충분한지 또는 충전 중인지 등의 상태)

For example, you can create applications that react to temperature trends and events on the device, to ensure constant frame rates over a longer period of time and prevent thermal throttling.
(장치의 온도 추세나 이벤트에 반응해서 일관된 프레임률을 장기간 유지하고 열 제한을 방지하는 애플리케이션을 만들 수 있다.)

 

온도 추세는 모바일 장치의 온도 변화를 뜻한다. 모바일 장치는 사용자가 앱을 실행하거나 다양한 작업을 수행할 때 온도가 상승할 수 있다. 이벤트는 앱의 실행과 종료, 배터리 잔량 변화, 충전 상태 변화, 네트워크 상태, 알림, 회전 등과 같이 여러 상태 변화를 뜻한다. 

 

열 제한은 모바일 장치가 과열될 때 발생하는 현상으로 온도가 높아짐에 따라 장치의 성능이 저하되거나 충전이 중단되는 등의 문제가 발생한다. 따라서 열 제한을 방지한다는 것은 장치의 온도가 올라가서 열 제한을 발생시켜 성능이 저하되지 않도록 온도추세와 이벤트에 반응하여 프레임률 관리를 통해서 모바일 장치의 과열을 방지하는 것을 의미한다.

 

Thermal Throttling 

 

Provider

Adaptive Performance를 활용하기 위해서는 정보를 제공할 장치가 필요하다. 이 장치를 Provider라고 하며 빌드 대상에 맞는 Provider가 제공된다. PC 플랫폼인 경우 별도의 Provider는 제공되지 않으며 Simulator라는 가상 장치를 사용할 수 있다. Simulator는 Adaptive Performance 패키지가 설치될 때 함께 다운로드되며 Provider의 경우 선택될 때 패키지 설치가 진행된다. 하지만 선택을 해제해도 해당 패키지가 삭제되진 않으며 삭제하고 싶은 경우 패키지 매니저를 사용해야 한다.

 

 

Simulator = PC, Provider = Mobile (android, ios) 

 

 

728x90
반응형

+ Recent posts