정규식

|

http://docs.oracle.com/javase/tutorial/essential/regex/

 

 

대충 구조는 알았고 그럼 패턴을 만드는 방법을 알아보겠습니다.


10
Pattern p = Pattern.compile("(^[0-9]*$)");
cs


아까 예제1) 에서 사용한 Pattern 을 보면  "(^[0-9]*$)" 이 부분이 바로 패턴 부분입니다.


각각 의미를 알아보면..


표현식

 설명 

 ^

 문자열의 시작

 문자열의 종료

 .

 임의의 한 문자 (문자의 종류 가리지 않음)

 단, \ 는 넣을 수 없음

 *

 앞 문자가 없을 수도 무한정 많을 수도 있음

 앞 문자가 하나 이상

 앞 문자가 없거나 하나있음

 []

 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.

 {}

 횟수 또는 범위를 나타낸다.

 ()

 소괄호 안의 문자를 하나의 문자로 인식 

 |

 패턴 안에서 or 연산을 수행할 때 사용

 \s

 공백 문자

 \S

 공백 문자가 아닌 나머지 문자

 \w

 알파벳이나 숫자

\W 

 알파벳이나 숫자를 제외한 문자

\d 

 숫자 [0-9]와 동일

\D 

 숫자를 제외한 모든 문자

 정규표현식 역슬래시(\)는 확장 문자
 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미

(?i) 

 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음

▲ 출처 : http://lng1982.tistory.com/141

 

예제의 ^[0-9]*$ 를 분석해보면 


^ 으로 우선 패턴의 시작을 알립니다.

[0-9] 괄호사이에 두 숫자를 넣어 범위를 지정해줄 수 있습니다.

* 를 넣으면 글자 수를 상관하지 않고 검사합니다.

$ 으로 패턴의 종료를 알립니다.


즉 , 0부터 9 까지의 수를 글자 수 제한을 하지 않고 검사하는 패턴입니다.


[자주 쓰이는 패턴]


1) 숫자만 : ^[0-9]*$

2) 영문자만 : ^[a-zA-Z]*$

3) 한글만 : ^[가-힣]*$

4) 영어 & 숫자만 : ^[a-zA-Z0-9]*$

5) E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$

6) 휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$

7) 일반전화 : ^\d{2.3} - \d{3,4} - \d{4}$

8) 주민등록번호 : \d{6} \- [1-4]\d{6}

9) IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})


^[a-zA-Z]*$


a-z 까지 그리고 A-Z 까지 즉, 알파벳은 모두 허용.

* 글자 수 상관하지 않음


-> 알파벳이기만 하면 패턴에 맞음

 


^\\S+.(?i)(txt|pdf|hwp|xls)$


^ : 시작

\ : \ 가 왔기 때문에 다음에 올 문자는 특수문자로 취급하고 , \다음 특수문자고 오면 그 자체로 취급.

\S : 공백 아닌 문자

+. : .이 반드시 한개는 와야한다.

(?i) : 대소문자 구별하지 않음.

(txt|pdf|hwp|xls) : txt 혹은 pdf 혹은 hwp 혹은 xls 만 허용. | 을 이용한 or 연산!

$ : 끝


-> 공백아닌 문자와 .이 반드시 와야하고 뒤에는 txt, pdf, hwp, xls 만 허용.

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

.
하나의 문자를 의미합니다.
즉, ab. 은 abc나 abd가 될 수 있습니다.

?
해당 패턴의 앞에 문자가(1개)없거나 혹은 한개가 존재하는 경우를 의미합니다. 즉, a?c는 abc도 될 수 있고, bc도 될 수 있습니다.

*
위와 거의 동일하나 하나 이상의 문자를 의미하게 됩니다.
즉, ab*는 aaa도 ab도 될 수 있다는 의미입니다.

^
문자열의 시작을 의미합니다.
즉, ^a는 a로 시작되는 문자를 검색하게 됩니다.

+
앞의 문자가 하나이상의 반복을 의미합니다.
즉, ab+는 abbbb가 될 수도 있다는 의미입니다.

[^]
괄호안의 형식을 제외한다는 의미입니다.
즉, [^a]bc는 a를 제외한 bc, bcd등을 나타냅니다.

 
$
문자열의 끝을 의미합니다.
즉, ab$가 되는 경우 반드시 b로 끝나는 문자를 나타냅니다.

[ ]

괄호안의 형식이 일치하는 경우를 나타냅니다.
즉, [ab]는 a,b,ab모두가 일치하게 됩니다.

( )
()안의 내용을 하나의 묶음으로 사용합니다.
즉, (ab)+는 위 +에 따라 ababab등을 나타냅니다.

{ }
안의 숫자에 따른 반복개수를 의미합니다.
즉, ab{2}는 abab를 나타냅니다.

|
or연산자와 동일합니다.
즉, a|b|c 는 a,b,c,abc모두가 될 수 있습니다.

4. 정규식 패턴예제

위의 표현방법의 조합을 통해서 우리는 다양하고 편리한 코드를 작성할 수 있습니다. 

E-mail 주소를 찾아내는 패턴
^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@ [A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$

 
이미지파일을 찾아내는 패턴
([^\s]+(\.(?i)(jpg|png|gif|bmp))$)

IP주소를 찾아내는 패턴
^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.
([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$

 
HTML 태그 중 링크를 찾아내는 패턴
(?i)<a([^>]+)>(.+?)</a>\s*(?i)href\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+));
 

 

자바 정규식 표현 방법


 java.util.regex 패키지에 있는 Match 클래스와 Pattern 클래스를 사용하여 문자열을 정규표현식으로 검증할 수 있다.

boolean bln = Pattern.matches("^[a-zA-Z0-9]*$", this.input);


정규표현식은 다음과 같은 문법으로 되어 있다.

^ : 문자열의 시작을 나타냄.

$ : 문자열의 종료를 나타냄.

. : 임의의 한 문자를 나타냄. (문자의 종류는 가리지 않는다)

| : or를 나타냄.


? : 앞 문자가 없거나 하나있음을 나타냄.

+ : 앞 문자가 하나 이상임을 나타냄.

* : 앞 문자가 없을 수도 무한정 많을 수도 있음을 나타냄.


 만약, .* 으로 정규식이 시작한다면 시작하는 문자열과 같은 문자열이 뒤에 없거나 많을 수도 있는 경우에만 일치를 시킨다. 즉, abc 일 경우 시작문자인 a를 기준으로 a가 없을경우와 a가 무한정 많은 경우에도 true를 반환하기 때문에 abc의 경우는 true를 반환한다.


[] : 문자 클래스를 지정할 때 사용한다. 문자의 집합이나 범위를 나타내면 두 문자 사이는 '-' 기호로 범위를 나타낸다. []내에서 ^ 가 선행하여 나타나면 not 를 나타낸다.


{} : 선행문자가 나타나는 횟수 또는 범위를 나타낸다.

a{3} 인 경우 a가 3번 반복된 경우를 말하며, a{3,}이면 a가 3번 이상 반복인 경우를 말한다. 또한 a{3,5}인 경우 a가 3번 이상 5번 이하 반복된 경우를 나타낸다.



\w : 알파벳이나 숫자

\W : 알파벳이나 숫자를 제외한 문자

\d : 숫자 [0-9]와 동일

\D : 숫자를 제외한 모든 문자


기본적인 문자열 검증 정규식

^[0-9]*$  :  숫자만

^[a-zA-Z]*$  :  영문자만

^[가-�R]*$  :  한글만

^[a-zA-Z0-9]*$  :  영어/숫자만


정규식 표현 예제

이메일 : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$  or  ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*$


휴대폰 :  ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$


일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$


주민등록번호 : \d{6} \- [1-4]\d{6}


IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

 

 

'개발/활용정보 > Java' 카테고리의 다른 글

ManualResetEvent for Java  (0) 2017.09.07
event handling  (0) 2017.07.10
singleton pattern  (0) 2017.06.29
BundleActivator와 BundleContext  (0) 2014.12.16
guava  (0) 2013.08.08
And

singleton pattern

|

https://blog.seotory.com/post/2016/03/java-singleton-pattern

 

 

예전 블로그에서도 singleton 에 대한 글을 쓴적이 있다. 그때는 매우 단순하게 적었으나 이번에는 조금 방대할 것이다. 단일 인스턴스를 다양하게 만들 수 있는 방법을 예제로 통해 한번 알아 보도록 하자.

singleton 이란?

프로그래밍 세계에 OOP 의 개념이 생기면서 객체 자체에 대한 많은 연구와 패턴(pattern)들이 생겨났다. singleton pattern은 인스턴스가 사용될 때에 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일 인스턴스를 사용하게끔 하는 것이 기본 전략이다. 프로그램상에서 동일한 커넥션 객체를 만든다던지, 하나만 사용되야하는 객체를 만들때 매우 유용하다. singleton pattern은 4대 디자인 패턴에 들어갈 정도로 흔히 쓰이는 패턴이다. 물론 core java(java.lang.Runtime, java.awt.Desktop 등등)에서도 singleton pattern이 사용된다.

Eager initialization

아래가 가장 기본적인 singleton pattern이다. 전역 변수로 instance를 만드는데 private static을 이용한다. static이 붙은 클래스변수는 인스턴스화에 상관없이 사용이 가능하게 된다. 하지만 앞의 private 접근제어자로 인해 EagerInitialization.instance로의 접근은 불가능하다. 이런 상태에서 생성자를 private로 명시한다. 생성자를 private로 붙이게되면, new 키워드를 사용할 수 없게된다. 즉 다른 클래스에서 EagerInitialization instance = new EagerInitialization(); 이런 방법을 통한 인스턴스 생성은 불가능해진다. 결국 외부 클래스가 EagerInitialization 클래스의 인스턴스를 가질 수 있는 방법은 11번째 라인에 있는 getInstance() method를 사용하는 수 밖에 없다.

public class EagerInitialization {
	// private static 로 선언.
	private static EagerInitialization instance = new EagerInitialization();
	// 생성자
	private EagerInitialization () {
		System.out.println( "call EagerInitialization constructor." );
	}
	// 조회 method
	public static EagerInitialization getInstance () {
		return instance;
	}
	
	public void print () {
		System.out.println("It's print() method in EagerInitialization instance.");
		System.out.println("instance hashCode > " + instance.hashCode());
	}
}

위의 단순한 singleton pattern은 리소스가 작은 프로그램일때엔 고도화 대상이 아니다. 하지만 프로그램의 크기가 커져서 수 많은 클래스에서 위와 같은 singleton pattern을 사용한다고 가정해보자. 3번째 라인의 new EagerInitialization();으로 인해 클래스가 load 되는 시점에 인스턴스를 생성시키는데 이마저도 부담스러울 수가 있다. 또한 이 소스는 EagerInitialization 클래스가 인스턴스화 되는 시점에 어떠한 에러처리도 할 수가 없다.

static block initialization

public class StaticBlockInitalization {
	private static StaticBlockInitalization instance;
	private StaticBlockInitalization () {}
	
	static {
		try {
			System.out.println("instance create..");
			instance = new StaticBlockInitalization();
		} catch (Exception e) {
			throw new RuntimeException("Exception creating StaticBlockInitalization instance.");
		}
	}
	
	public static StaticBlockInitalization getInstance () {
		return instance;
	}
	
	public void print () {
		System.out.println("It's print() method in StaticBlockInitalization instance.");
		System.out.println("instance hashCode > " + instance.hashCode());
	}
	
}

static 초기화블럭을 이용하면 클래스가 로딩 될 때 최초 한번 실행하게 된다. 특히나 초기화블럭을 이용하면 logic을 담을 수 있기 때문에 복잡한 초기변수 셋팅이나 위와 같이 에러처리를 위한 구문을 담을 수 있다. 첫 번째 패턴보다 좋아보이지만 인스턴스가 사용되는 시점에 생성되는 것은 아니다.

lazy initialization

이제 클래스 인스턴스가 사용되는 시점에 인스턴스를 만드는 singleton pattern을 배워보도록 하자. 아래 소스의 lazy initialization pattern은 필요할때 인스턴스를 생성시키는 것이 핵심이다.

public class LazyInitialization {
	
	private static LazyInitialization instance;
	private LazyInitialization () {}
	
	public static LazyInitialization getInstance () {
		if ( instance == null )
			instance = new LazyInitialization();
		return instance;
	}
	
	public void print () {
		System.out.println("It's print() method in LazyInitialization instance.");
		System.out.println("instance hashCode > " + instance.hashCode());
	}
}

new LazyInitialization(); 가 어디에 선언되었는지 주목해보자. getInstance() method 안에서 사용되었다. if문을 이용해 instance가 null 인 경우에만 new를 사용해 객체를 생성하였다. 최초 사용시점에만 인스턴스화 시키기 때문에 프로그램이 메모리에 적재되는 시점에 부담이 많이 줄게된다. 하지만 여전히 문제는 남아있다. 만약 프로그램이 muilti thread 방식이라면 위와 같은 singleton pattern은 안전하지 않다. 동일 시점에 getInstance() method를 호출하면 인스턴스가 두번 생길 위험이 있다.

thread safe initalization

위에서 문제가 되었던 muilit thread문제를 해결하기 위해 synchronized(동기화)를 사용하여 singleton pattern을 구현한다. 여러 thread들이 동시에 접근해서 인스턴스를 생성시키는 위험은 없어졌다. 하지만 수 많은 thread 들이 getInstance() method 를 호출하게 되면 높은 cost 비용으로 인해 프로그램 전반에 성능저하가 일어난다.

public class ThreadSafeInitalization {
	
	private static ThreadSafeInitalization instance;
	private ThreadSafeInitalization () {}
	
	public static synchronized ThreadSafeInitalization getInstance () {
		if (instance == null)
			instance = new ThreadSafeInitalization();
		return instance;
	}
	
	public void print () {
		System.out.println("It's print() method in ThreadSafeInitalization instance.");
		System.out.println("instance hashCode > " + instance.hashCode());
	}
	
}

initialization on demand holder idiom

미국 메릴랜드 대학의 컴퓨터 과학 연구원인 Bill pugh 가 기존의 java singleton pattern이 가지고 있는 문제들을 해결 하기 위해 새로운 singleton pattern을 제시하였다. Initialization on demand holder idiom기법이다. 이것은 jvm 의 class loader의 매커니즘과 class의 load 시점을 이용하여 내부 class를 생성시킴으로 thread 간의 동기화 문제를 해결한다.

public class InitializationOnDemandHolderIdiom {
	
	private InitializationOnDemandHolderIdiom () {}
	private static class Singleton {
		private static final InitializationOnDemandHolderIdiom instance = new InitializationOnDemandHolderIdiom();
	}
	
	public static InitializationOnDemandHolderIdiom getInstance () {
		System.out.println("create instance");
		return Singleton.instance;
	}
}

initialization on demand holder idiom 역시 lazy initialization이 가능하며 모든 java 버젼과, jvm에서 사용이 가능하다. 현재 java 에서 singleton 을 생성시킨다고 하면 거의 위의 방법을 사용한다고 보면 된다.

enum initialization

Joshua Bloch가 작성한 effective java 책에서 enum singleton 방법이 소개 되었다.

public enum EnumInitialization {
	INSTANCE;
	static String test = "";
	public static EnumInitialization getInstance() {
		test = "test";
		return INSTANCE;
	}
}

enum 이 singleton pattern 으로 사용될 수 있는 이유는 아래와 같다.

  • INSTANCE 가 생성될 때, multi thread 로 부터 안전하다. (추가된 methed 들은 safed 하지 않을 수도 있다.)
  • 단 한번의 인스턴스 생성을 보장한다.
  • 사용이 간편하다.
  • enum value는 자바 프로그램 전역에서 접근이 가능하다.

using reflection to destroy singleton

위에서 여러 방법으로 singleton을 만들어 보았으니 이번엔 java의 reflection을 이용하여 singleton을 깨뜨려 보는법도 배워보자. 누군가 작성한 코드를 원본 수정없이 작업해야 할때 이용될 수 있을 것이다.

public class UsingReflectionToDestroySingleton {
	
	public static void main (String[] args) {
		EagerInitialization instance = EagerInitialization.getInstance();
		EagerInitialization instance2 = null;
		
		try {
			Constructor[] constructors = EagerInitialization.class.getDeclaredConstructors();
			for ( Constructor constructor : constructors ) {
				constructor.setAccessible(true);
				instance2 = (EagerInitialization)constructor.newInstance();
			}
		} catch (Exception e) {
			
		}
		
		System.out.println(instance.hashCode());
		System.out.println(instance2.hashCode());
		
	}
}

위의 코드를 실행해보면 아래 System.out.println();의 두 라인에서 찍히는 hachCode()값이 다른 것을 확인 할 수 있다. java의 reflection은 매우 강력하다. 설령 class 의 생성자가 private 일지라도 강제로 가져와서 새로운 인스턴스 생성이 가능하다. 결국 singleton pattern을 깨뜨리는 것이다. 이 외에도 reflection을 여러곳에서 사용할 수 있으니 알아두는 것이 좋다.

 

 

 

'개발/활용정보 > Java' 카테고리의 다른 글

event handling  (0) 2017.07.10
정규식  (1) 2017.07.05
BundleActivator와 BundleContext  (0) 2014.12.16
guava  (0) 2013.08.08
osgi 공부 ^^;;;  (0) 2013.07.10
And

스카이림 스크랩

|

http://cafe.naver.com/elderscrolls7/725529


이번에 윈도우를 10으로 올리면서 설치와 메모리 설정 기타 여러가지 경험했던 것들을 정리해볼까 합니다. 관련 경험이 있으신 분들은 도움이 되셨으면 하네요. 물론 개인의 경험담 위주이기 때문에 각자의 다양한 사양에 따라 차이점이 있을 수 있으며 이 점은 개별적으로 인용해주시면 감사하겠습니다.



1. 메모리 관련 설정

현재 스카이림의 메모리 관련 개선법은 크게 세 가지로 나눌 수 있습니다. 일단 개별 세 가지에서 중요한 점들을 살펴봅시다.


1) ENBoost (= ENB 메모리 관리)

ENB 메모리 설정은 1버전 이하의 구형 ENB를 사용하지 않는 이상 현재 대부분의 ENB 사용자들이 쓰고 있을 겁니다. 보리스와 포럼의 글들을 읽고 여러가지로 건드리다 보니 enblocal.ini 파일에 있는 메모리 설정에는 주의해 볼 몇 가지가 있습니다.


[MEMORY]
ExpandSystemMemoryX64=false

▷ SKSE 주메모리 세팅 1024(= SSME 주메모리 768) 이상이신 분들은 false 로 해두시는 걸 권장합니다. 이건 뭐 이제 너무 유명한 내용이죠. 크래쉬픽스 메모리 세팅을 쓰시는 분도 false 입니다. 


ReduceSystemMemoryUsage=true
DisableDriverMemoryManager=false
DisablePreloadToVRAM=false
EnableUnsafeMemoryHacks=false 


ReservedMemorySizeMb=64…

▷ ENB 메모리의 주요 포인트로 기본 64부터 64+ 단위로 증가시키면 좋은 수치(64 128 192 256…)입니다. 여기서 보리스도 강조하는 중요한 점은 64부터 시작하라는 겁니다. 이 수치는 생각보다 많은 vram 양을 요구하는 메모리 파트가 아니며, 뒤에 설정하는 ENB VideoMemorySize 용량 내에 여기서 설정한 용량만큼 공간을 차지한다는 것도 일본 친구들이 밝혀놨더군요. 따라서 너무 크게 설정하면 오히려 여분 용량은 용량대로 잡아먹고 잦은 스터터링 등의 게임 내 불안정을 불러옵니다. 맨 처음 64로 세팅을 시작하고 게임을 실행 > 잦은 스터터링 등 발생 > 64+ > 잦은 스터터링 발생 > 64+ … 식으로 적용해나가도록 합시다. 실제 저도 이전에는 이걸 256이나 512로 세팅하며 썼는데 지금은 64로 쓰며 게임이 안정된 게 눈에 보일 정도입니다. 


VideoMemorySizeMb=????

▷ 시스템 메모리 허용량을 늘려주는 파트입니다. 이 세팅은 중요한 게 자신의 vram 과 ram 사이즈도 중요하지만, 현재 OS 버전에 따라서 세팅을 달리 해야 한다는 겁니다. 이건 8.1 후기형부터 마이크로소프트가 다이렉트9, 10 의 적용에 미스를 내놓았기 때문이라는데, 하여튼 중요한 점은 전자는 굉장히 폭넓게 세팅할 수 있으나 후자는 무조건 4064 이하로 세팅해야 한다는 겁니다. 잘 모르겠다시는 분들은 그냥 어떤 OS를 사용하든 일단 아래의 보리스의 VRamSizeTest 툴을 받으셔서 돌려보시기 바랍니다.


→ Windows7 ~ 8.1초기형 = VRamSizeTest Tool 을 사용하여 나오는 수치에서 적당히 감하여 세팅. 예를 들어 10090 이 나온다면 한 200 정도의 수치를 감한 9890을 최대 상한선으로 잡고 적당한 수치를 세팅합니다.


→ Windows8.1후기형 ~ 10 = 무조건 4064 이하로 세팅. 최대 상한선이 4064 입니다. 툴로 돌려서 무조건 4064로 결과값이 나오면 이 수치로 설정해야 하는 OS입니다.


제 경험으로는 이 수치를 얼마나 적당히 설정하느냐에 따라 게임 내에서 화면 회전 시의 스터터링 정도(즉 로딩 속도)가 다릅니다. 너무 낮으면 뚝뚝 끊기고 너무 높으면 시스템 메모리에 부하를 줘 튕길 수도 있습니다. ram 최소 4기가 이상에 2기가 이상의 그래픽카드를 사용하신다면 개인적으로는 최소 수치를 2000 으로 잡고 최대값을 찾아나가시길 권장드립니다. 물론 자신의 사양이 그보다 낮으면 더 낮춰야 할 것입니다. 참고 삼아 제 경우는 ram 16기가에 970인데 3500으로 사용 중입니다.


EnableCompression=false → 자신의 사양이 좋지 않다 싶으면 true

AutodetectVideoMemorySize=false


2) SKSE (= SSME) : sheson 개선법

SKSE 와 SSME 는 둘 중 하나만 쓰셔야 합니다. sheson 은 Safety Load 를 사용하지 않아도 된다고 했지만 지역 이동 시 로딩이 되지 않으신다는 분들은 사용하셔도 문제 없습니다. 크래쉬픽스 저자 같은 경우는 오히려 권장하고 말이죠.


[Memory] (이는 SKSE 수치이며 SSME는 그에 맞게 대응해서 수치를 맞춰주시면 됩니다.)
DefaultHeapInitialAllocMB= 512 ~ 1280 → 일반적으로 256 단위이며 최대치에서 한 단계 전 수치(= 1024)를 최대 상한으로 잡으시길 추천드립니다. 최대치는 그래도 안 되겠다 싶은 분들만 세팅하도록 합시다.


ScrapHeapSizeMB= 256 → 크래쉬픽스 저자 포함 많은 이들이 지적하는 사항이고 저도 변경해보면서 느낀건데, 256 즉 기본 수치 이외의 수치로의 변경이 의미가 없습니다. 이건 스카이림 자체의 문제인 듯 한데 이 보조메모리는 늘려봐야 오히려 불안정성만 증대시킵니다. 따라서 그냥 256 그대로 두시고 위의 주메모리 수치를 최대한 늘리는 쪽으로 권장드립니다.


3) Crash Fixes

크래쉬픽스는 게임에서 CTD 를 일으키는 상황들을 수정하는 것을 목적으로 하는데 그 안에 메모리 관련 내역이 포함되어 있습니다. CrashFixPlugin.ini 에서 이와 관련해 상황에 맞춰 변경이 필요한 세팅은 일반적으로 다음의 세 가지라고 보시면 되며 나머지 세팅은 그냥 그대로 두셔도 됩니다.


UseOSAllocators=0 (활성화는 1)

▷ 크래쉬픽스의 가장 혁신적인 파트라고 볼 수 있는데, 스카이림 메모리 할당 시스템을 일반 메모리 시스템을 이용하는 것으로 바꾸는 겁니다. 즉 이걸 활성화 하면 스카이림 메모리 블록 자체가 사라지고 C malloc 을 쓰는 것으로 대체됩니다. 이론적으로는 스카이림 블록 한계도 사라지기 때문에 프레임이 더 빨라질 수 있습니다. 근데 개념 자체를 보면 오류가 발생할 가능성도 꽤 있고, 실제 관련 문제가 있다는 글들도 있기 때문에 기존 SKSE 메모리를 문제 없이 사용하시는 분들께는 권장하지 않습니다. 기존 메모리 패치가 효과를 보지 못한다는 분들은 한번 활성화 하고 테스트 해보시기 바랍니다. SKSE 메모리 패치(=SSME)를 사용하신다면 당연히 이 수치를 비활성화 하셔야 하고 이 세팅을 활성화 한다면 SKSE 패치를 비활성화 하셔야 합니다. SKSE 비활성화 방법은 위의 SKSE 메모리 문장들 앞에 ; 를 붙여주시면 됩니다. ;DefaultHeapInitialAllocMB=1024 이런 식으로 말이죠. 이론 상으로는 SKSE 패치보다 할당을 많이 받을텐데도 제 컴에서는 이상하게 SKSE 쪽보다 프레임이 소량 떨어지더군요. 흠.


AlignHeapAllocate=0 (활성화는 1)

▷ 크래쉬픽스 저자는 TESObjectLAND::unk_24 object 라는 알 수 없는 컨스트럭터를 할당에서 제대로 배당해주지 못하면서, 오래 사용하거나 ugrid 수치가 커질수록 CTD가 일어날 가능성이 높아지기 때문에 이를 수정하기 위한 세팅이라고 말하고 있습니다. 대신 몇몇 ENB 세팅에서 충돌이 있거나 오랜 로딩 시간을 불러오는 경우가 있기 때문에 자신의 상황에 맞춰 사용하라고 하는데, 사실 기존에 게임을 문제 없이 플레이 해오신 분들은 그냥 비활성 상태로 둬도 큰 문제는 없습니다. ugrid 수치를 크게 세팅하신 분들은 활성화를 고려합시다. 제 개인적으로는 잘 모르시겠거나 별 상관없다는 분들께는 비활성을 추천.


WarnSKSEMemoryPatch=0 (활성화는 1) 

▷ 단순히 SKSE의 메모리 패치가 적용되었는가 여부를 알려주는 세팅일 뿐이고 게임 진행에는 어떤 영향도 주지 않기 때문에, SKSE 패치를 쓰든 위의 크래쉬픽스 메모리 세팅을 쓰든 그냥 비활성화 하시는 게 편할 겁니다.



★ 결론적으로 읽어보시면 아시겠지만 Crash Fixes 와 SKSE 메모리 패치(= SSME) 는 동시에 사용하는 성질의 것이 아닙니다. 따라서 둘 중 하나를 쓰시면 되며 여기에 ENB 사용자들은 ENB 메모리 관리가 덧붙는 것이 현 스카이림 메모리 관리의 기본 골자라 할 수 있습니다. 즉 메모리 관리를 전부 다 세팅하실 분들은 세 가지를 다 설치하되 "SKSE(=SSME) + ENB" 또는 "CrashFixes + ENB" 두 방식 중 한 가지를 채택하는 거라고 이해하시면 되며 세팅은 각자의 경우에 맞춰 하도록 합시다.



2. Windows10 설치 시 스카이림 관련 필요사항

윈도우10을 설치하고 나서 처음에 신경써야 하는 건 모드질한 스카이림의 구동을 위한 사전 준비입니다. 10은 다이렉트12 가 기본이기 때문에 기존 다이렉트 버전을 사용하는 스카이림 모드들이나 기타 구 버전 게임들은 사전에 설치해줘야 할 것들이 있습니다. 게다가 앞서 언급했듯이 마소가 구 다이렉트에 뭔가 문제도 내놔서 ENB 메모리 용량도 제한적입니다.


하여튼 10에서 스팀을 설치하고 스카이림을 설치했다면 사실 대부분 구동은 될 겁니다. 그런데 이 상태 그대로는 현 ENB나 기타 구 다이렉트를 사용하는 모드들을 실행하면 게임 구동을 실패시키거나 게임 내에서 프레임 드랍 같은 오류를 불러옵니다. 저도 야외 프레임 드랍이 심하게 나더군요.


일단 다음의 순서로 구 다이렉트들을 설치합시다. 아래 둘 중 하나만 설치하도록 합시다.


→ DirectX End-User Runtimes 설치


위의 것을 설치하기 어려운 상황이라면


→ 스카이림 폴더 내 DirectX10 폴더에서 DXSETUP.exe 실행


그리고 혹시 sweetFX 를 사용하시는 분들은 dxgi.dll 과 dxgi.fx 파일이 스카이림 폴더에 있다면 삭제하시면 됩니다.



일단 근래 경험으로 느낀 것들은 이 정도입니다. 관련하여 문제가 있으신 분들께 참고가 되길 바랍니다.




20161012 : 다이렉트 관련 내용 일부 수정

[출처] 스카이림 메모리 관리 설정과 Windows10 관련 경험담 (엘더스크롤 시리즈 "네이버 대표카페" - 스카이림 , 오블리비언) |작성자 수의나무

---------------------------------

http://m.blog.naver.com/nkplane/220520237769


▶선행 프로그램 & 모드

SKSE (Skyrim Scripe Extender)

http://skse.silverlock.org/


메모래피치적용

C:\Program Files (x86)\Steam\steamapps\common\Skyrim\Data\skse\skse.ini

skse폴더와 skse.ini 폴더는 직접 만들어 줘야 합니다.


skse.ini에 입력하는 내용

[Memory]
DefaultHeapInitialAllocMB=768
ScrapHeapSizeMB=512


적용되었는지 확인

C:\Users\Kiwoong Nam\Documents\My Games\Skyrim\SKSE\skse_steam_loader.log

default heap = 768MB (effective 512MB if not preloading animations)
scrap heap = 256MB

ENB

http://enbdev.com/index_en.html

WIndows 10 에서 작동하게 하려면 DirectX End-User Runtimes (June 2010)을 설치해야 한다. 구글링 하고 Microsoft 홈페이지에서 다운받으면 된다.

 

메모리 설정

C:\Program Files (x86)\Steam\steamapps\common\Skyrim\enblocal.ini

enblocal.ini 를 수정한다.


[MEMORY]
ExpandSystemMemoryX64=true


HDT Physics Extensions

http://www.nexusmods.com/skyrim/mods/53996/?


SkyUI

http://www.nexusmods.com/skyrim/mods/3863/?


Grimly's plugin

http://www.nexusmods.com/skyrim/mods/69341/?

SKSE용 플러그인으로 Sky tweak 모드 쓸 때 필요하다


FISS

http://www.nexusmods.com/skyrim/mods/48265/?

SKY Tweak 모드 쓸 때 필요하다


No More Redshirts

http://www.nexusmods.com/skyrim/mods/23614/?t

skyrim.exe 와 같은 폴더에 *.txt 파일을 위치시키고, 게임상에서 bat esseitnal 콘솔입력.

NPC들을 무적으로 만들어서 NPC가 벰파이어, 드래곤등에게 살해당하는 것을 방지


ECE (Enhanced Character Edit)

http://www.nexusmods.com/skyrim/mods/12951/?

SKSE를 필요로 함

설치할 때, 고해상도 Vertex 맵을 옵션으로 선택했을 때,

Required SKSE. And you must add these lines to your SKSE.ini:[Display]iTintTextureResolution=2048



----------------------------

31

1324

1342


'기타 > 게임' 카테고리의 다른 글

삼탈워  (0) 2021.01.21
nba 2k22 fantasy roster  (0) 2020.01.02
직원을 춤추게 하는 열정적인 리더의 7가지 비밀  (0) 2011.07.13
중국 여행 정보  (0) 2011.07.07
<뽀로로> 에피소드 中 `하늘을 날고싶어요` 편  (0) 2011.04.25
And
prev | 1 | ··· | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ··· | 84 | next