0. 요약

유니티 엔진의 dll을 수정해서 미리보기가 안 나오는 버그를 우회함. 

 

1. 버그 현상

Unity 2020 LTS 최신버전에서 Sprite 선택창의 검색 결과에서 이미지 미리보기가 나오지 않는 버그가 있음

Unity 2020 LTS bug

 

(ba1 이나 00을 입력하는 순간, 미리보기가 사라지고 리스트만 남게 됨)

 

처음에는 미리보기가 잘 나오고, 검색어를 입력하다보면 발생함 

 

2. 유니티 코드를 뜯어보자 

 

ObjectSelect.cs SearchArea()

미리보기가 표기되는 부분의 코드를 추적하니, 

Unity Editor에서 최종적으로 표기가 달라지는 위치는 이 코드임을 확인할 수 있었음 

 

ObjectListArea.cs CanShowThumbnails()

CanShowThumbnail() 는 변수 m_AllowThumbnails 의 wrapper에 불과하고,

해당 변수는 Usage가 4군데 있어서 하나씩 추적을 해봄

ObjectListArea.cs m_AllowThumbnails

 

checkThumbnails 라는 flag는 매우 여러 부분에서 중첩으로 변경이 되어, 추적이 어렵고 

ObjectsHaveThumbnails() 이라는 이름이 찾으려고 하던 부분이 맞는 것 같음 

ObjectListArea.cs ObjectsHaveThumbnails()

HasBuiltinResources 가 있는 경우 return true가 된다? 

 

checkmark(builtin resource) preview

checkmark 라는 에셋은  유니티 내장 sprite로, unity_builtin_extra 라는 속성을 갖고 있고, 

검색결과에 해당 에셋이 포함된 경우에는 항상 미리보기가 정상적으로 나옴을 확인할 수 있었음

검색 결과에 따라 미리보기가 동작하기도하고, 나오지 않기도 하던 원인을 알아냄. 

 

 

그렇다면 ObjectsHaveThumbnails()가 어떻게 달라져서,

2019에서는 되고 2020에서는 버그가 발생한 것일까?

https://github.com/Unity-Technologies/UnityCsReference/blob/23b613cc7ab4e7837ca7db09aa8db2ed8ee13a72/Editor/Mono/ObjectListArea.cs

github에서 해당 부분의 2019 버전 코드를 찾아보았는데, 

decompiler 에 의해서 코드가 조금 달라지긴 했지만, 해당부분의 코드가 바뀌진 않았음. 

 

ObjectListArea.cs ObjectsHaveThumbnails() in Unity 2019

 

그럼 sprite만 있는 경우, IHierarchyProperty  부분에서 문제가 생겨서 return true를 못해주고 있다는 것인데, 

에디터 내부 코드에 브레이크 포인트를 찍어볼 수 없어서 해당 코드들이 쉽게 파악이 되질 않음. 

 

 

2. 문제 해결 

대략적인 상황 파악을 했는데, 설정이나 옵션의 문제가 아니므로 

엔진 코드를 고치지 않고서는 문제 해결이 어렵겠다는 판단이 들었음 

 

엔진 코드를 어떻게 고치지 ...  지구인들아 도와줘 ! 

 

그런 걸 왜 하죠.jpg

 

남은 것은 구글 뿐인가...

구글링을 통해서 dnSpy 라는 툴로 dll을 unpack/pack 할 수 있다는 것을 알게 됨 

 

dnSpy context menu

edit Method (C#), edit class (C#)이라니 너무 멋지다.  

 

누구나 그럴싸한 계획을 가지고 있지.jpg

edit method C# 기능이 있어서 코드로 바로 수정을 할 수는 있는데,

의존성이 난리가 나서 컴파일이 안 됨 

옵션에서 dll 같은걸 넣어주면 될 것 같은데 어디서 어떻게 하는지 몰라서 

그냥 여기까지 온거 IL Instructions 을 고치면 되지. 정면 승부다!

 

 

라이더의 ILView 를 사용하여 return false가 ldc.i4.0 같은 IL로 이루어져있음을 확인함. 

Rider 만세 !!!

 

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.reflection.emit.opcodes.ldc_i4_1?view=net-5.0

ldc_i4_1 에 대한 IL 설명을 보면 '정수 값 1을 int32로 계산 스택에 푸시합니다.' 가 한글이라는게 믿기 힘들 정도로 독해가 잘 안되지만 

ldc_i4_0은 return 0 이고 ldc_i4_1 은 return 1인것 같음 

 

dll을 이렇게 고치고 파일을 덮어쓰고 저장이 잘 되었다.

 

참고로 

2020.3.8f1\Editor\Data\Managed\UnityEditor.dll 은 페이크고 

2020.3.8f1\Editor\Data\Managed\UnityEngine\UnityEditor.core.dll 이 진짜임 

(UnityEditor.dll 을 수정했더니 문제 해결이 안되서, 

여기까지 왔는데 왜 안 고쳐지는지 모르겠어서 멘탈이 나가서 울고 싶었다.)

 

 

3. 엔딩

미리보기가 잘 동작하게 된다 

 

 

'01_Note' 카테고리의 다른 글

Windows 에서 PHP 실행하기  (0) 2017.10.02
Redis  (0) 2013.12.31
APMSETUP PHP version upgrade  (1) 2013.05.05

(APMSETUP이 더 이상 유지보수가 안 된다는 질문이 있어서 작성)



윈도우에서 PHP를 돌리고 싶어요


선택지 정리 

1. PHP 내장 서버 

2. XAMPP를 사용

3. Linux 가상머신

4. IIS 서비스로 PHP 운영 



1. PHP 내장 서버 


최신 PHP에는 웹 서버 기능이 포함되어 있다. 

Apache 없어도 PHP 웹 서버 돌릴 수 있으므로, 

따라서, 최신 PHP 프로그램만 받아서 실행하는 게 가장 간단하고 깔끔한 방법이다. 


http://windows.php.net/download 여기서 X64 Thread Safe 받아 쓰면 된다. 


내장 웹서버 사용 방법은 다음 링크 참조

http://php.net/manual/en/features.commandline.webserver.php 



다만, MySQL 직접 설치가 필요한 경우, MySQL 은 따로 설치해줘야 한다. 




2. XAMPP 사용 


MySQL 설치가 많이 복잡하진 않지만 

PHP, MySQL 따로 설치하면 윈도우 서비스를 관리하는 등 관리 포인트가 늘어난다. 

그래서 APMSETUP의 대안을 찾는다면 XAMPP를 사용하는 것도 좋은 방법이다. 

뭐가 뭔지 모르겠을 때 가장 좋은 방법이다. 


아래 링크에서 받을 수 있다. 

https://www.apachefriends.org/




3. Linux 가상머신


VirtualBox 등으로 윈도우즈 안에서 리눅스를 운영하도록 한다. 

리눅스가 익숙하다면 리눅스 시스템 내에서 PHP MySQL Redis 등등을 설치하고 쓰면 된다. 

Docker등을 활용하기도 좋아서 요즘 가장 많이 선택하는 방법이다 




4. IIS 서비스로 PHP 운영


애초에 Apache 없이 IIS에서 PHP를 운영 할 수도 있다. 

개인적으로 IIS가 익숙치 않아서 잘 선택하지 않는 편이다. 




'01_Note' 카테고리의 다른 글

Unity 2020 LTS 버그 수정  (1) 2021.06.06
Redis  (0) 2013.12.31
APMSETUP PHP version upgrade  (1) 2013.05.05

지난 금요일에 charsyam님 세미나가 있어 듣고 왔습니다. 


제 부실한 기억을 더듬고 그 세미나에서 메모했던 내용과

이후에 자료를 찾아보면서 내용을 조금 더하고 뺀 내용을 합쳐서

아래와 같이 정리해보았습니다. 


세미나 진행 내용 이외에 제 주관적인 생각이 일부 포함되어 있습니다. 

잘못 이해한 내용이 있으면 댓글 부탁 드립니다. 



Redis Management & Cell Architecture 

charsyam님 세미나 발표 자료. 

http://www.slideshare.net/charsyam2/redis-acc



#0 TIP 정리 

 - keys 쓰지 말것, Collection에 1만개 이상 넣지 말것

 - Key data는 미리 분산 및 탐색을 고려하여 설계 할 것 

 - Replication은 초기에 걸고 시작할 것

 - 일시적으로 MaxMemory 설정의 2배까지 늘어날 수 있음. 초기 구성시에 고려. 

 - 메모리 가격 절감을 위해 한 서버에 여러 redis 서버를 운영하는 것을 권장.

 - Master 에서는 File 저장 없이 Memory만 쓰고 Slave가 File 저장할 것 



#1 Single Thread

 - 오래 걸리는 명령어 쓰지 마세요. 대표적으로 keys

 - flushall 에서도 O(N) 합니다. 

 - 2.8 에서 key를 대체할 scan이 생기긴 했는데.. 이것도 좀.


#2 Collection (List, set 등) 

 - 하나의 Collection에 1만개 이상의 element는 넣지 않도록. 

 - Collection을 통째로 처리 할 때 부하가 생김. 



#3 Redis Memory 


#3-1 Memory Limit

 - 32bit: Max Memory 3G

 - 64bit: No max Memory => 실제 메모리 이상 쓰면 swap 하면서 뒤짐 

 - Max memory 이상 사용하는 경우 config 정책에 따라 다름 


#3-2 Memory 해제되는 경우 3가지 

 => 저장된 데이터가 사라지는 경우 

 - Expire Check when Key Access (값 읽을 때 만료된 데이터면 해제)

 - activeExpireCycle (아무나 몇 놈 뽑아서 만료된 데이터 해제)

 - Max Memory Strategies. (메모리 모자라면 기존 데이터 해제)


#3-3 Max Memory Strategies 종류 

 - volatile or allkeys (expire 만 볼 것인가, 전체 키를 대상으로 할 것인가)

 - LRU, TTL, Random (오래된 키, expire가 적게 남은 키, 아무 키)

 - 기본 값은 volatile-lru


#3-3 Max Memory Strategies 주의 사항 

 - Max memory 설정에 따라 날아가는 데이터가 다르다. 

 - Strategies 가 allkeys인 경우 expire 값과 관계 없이 기존 데이터 중 삭제.

 - Strategies 가 volatile인 경우 expire 값이 있는 키에 한해서 삭제.

 - 남은 key 중 expire가 없을 경우 기존 데이터 보존 위해 새로 들어온 데이터 무시. 

 


#4. Persistance 

 - RDB (Snapshot) 정확한 약자는 모르겠는데 Redis Data Binary 정도 되는듯.

 - AOF. Append-Only File. Reids 변경 사항을 모두 기록함. 


#4-1. RDB snapshot with fork 

 - RDB 는 Snapshot을 만드는 시점에서 

 - read lock을 걸지 않고 

 - copy 하는 시점의 메모리를 그대로 복사하기 위해 fork를 함. 


#4-2. fork risk

 - 요즘 OS에는 COW(Copy-On-Write) 라는 걸 지원해서 항상 2배를 할당하지는 않음. 

 - Write가 빈번하면 메모리 복사를 하게 되고. 최대 2배가 복사되는 건 동일함.

 - 실제 메모리보다 더 많은 메모리가 필요하므로.. 이 또한 swap 하면서 뒤짐 


#4-3. Fork가 일어나는 또 다른 시점 

 - AOF에서도 AOF 자체가 너무 커지면 주기적으로 파일 덤프로 찍음

 - Replication 에서 새로운 Slave와 최초 sycn할 때, Master RDS(Snapshot)을 찍음

 => 이미 Master가 write 부하가 큰 상태에서는 Replication 을 거는 것도 위험. 

 => Replication 구성 없이 Master 부하가 커지면 Redis는 망한다?!


#5. 추천 구성


#5-1. Replication 

 - Master - Slave Replication을 미리 구성한다.

 - Master 는 빠른 응답을 위해 RDB도 AOF 도 하지 않는다. 

 - Slave 는 필요에 따라 RDB 혹은 AOF 를 구성한다. 

 - Master 장애시 데이터가 날아간 상태가 sync 되지 않도록 주의한다. 


#5-2. Max memory 설정

 - 하나의  Redis-Server 인스턴스 당 Max-memory x2 의 메모리가 필요하다. 

 - Snapshot 시점을 잘 분산하여 N개의 서버를 동시에 운영 

 - ex1. 15GB메모리에서 Max-memory를 7.5GB 1대 운영시, 할당은 7.5GB 여유는 7.5GB 

 - ex2. 15GB메모리에서 Max-memory가 5GB 2개를 운영시, 할당은 10GB 여유는 5GB 

 - 두 redis가 동시에 snapshot을 찍지 않으면 메모리가 터질 위험은 적다. 

 - 결국 Redis 서버를 여러대로 나누면, 분산 처리가 포인트


#5-3. ZooKeeper 를 쓰는 것도 대안 

 - Zookeeper가 뭘까요. 


#5-4. Twemproxy 를 쓰는 것도 대안 

 - 어떤 redis로 갈지 알아서 hashing을 해줘서 내부 분산

 - SET/GET 정도 핵심 기능만으로 구성시 사용 가능

 - pub/sub 등 지원하지 않는 명령어가 발생하니 주의


#6. SEE ALSO

 - Redis Management & Cell Architecture http://www.slideshare.net/charsyam2/redis-acc

 - charsyam's blog redis http://charsyam.wordpress.com/category/cloud/redis/

 - Maxmemory policy http://dol9.tistory.com/200

 - ZooKeeper를 활용한 Redis Cluster 관리 http://helloworld.naver.com/helloworld/294797



'01_Note' 카테고리의 다른 글

Windows 에서 PHP 실행하기  (0) 2017.10.02
APMSETUP PHP version upgrade  (1) 2013.05.05
eula.1028.txt 의 정체  (9) 2011.09.26

#0  APMSETUP PHP 버전 업그레이드 PHP5.4.14 


apmsetup.com 에서 제공하는 php 버전은 5.2 이다. 


PHP 5.2에서 지원되지 않는 혹은 고쳐진 버그가 종종 있어서

답답해서 버전업을 해 보았다. 



#1. php 버전을 받는다 


#1-0 php.net 에서 windows binary를 받자 





#1-1 

APMSETUP 으로 설치한 경우라면 Thread Safe 버전을 받으면 된다. 







#1-2 불안하다면 phpinfo() 에서 기존버전이 thread safe 버전임을 확인 





#2. 받은파일을 압축을 풀자.  

PHP 5.4.14 기 때문에 PHP54 로 디렉토리명을 변경하였다. 





#3. php.ini 파일 저장 


APM_SETUP 최상위 폴더에 php.ini 파일을 교체해주자. 

기존 php.ini를 혹시 모르니 다른 이름으로(_php.ini) 보존하고, 



압축 푼 PHP54 내부에 있는 php.ini 를 복사해서 가져오자. 

나는 php.ini 샘플 중 

php.ini.development 를 복사해서 사용하였다. 








#4. Apache에서 php 설정 변경 


APMSETUP\Server\Apache\conf\extra 에 보면 

httpd-php5.conf 파일이 있다. 


해당 파일에서 

PHP5/php5apache2_2.dll 을 load하게 되어있는 부분을 새 버전 경로로 변경해주자 

PHP54/php5apache2_2.dll 로 변경하면 된다. 






#5. 그러고 나서 APMSETUP Mornitor에서 재시작을 하면 된다. 

PHP 5.4.14 라고 나온다. 





#6. php.ini 설정 


제대로 되는 줄 알았는데 timezone 관련 에러가 난다.

해당 설정이 주석처리가 되어있다. 

; date.timezone = 

단계 #3에서 복사한 php.ini 를 열어서 관련 설정을 추가하자 

date.timezone = Asia/seoul 




extension path도 설정해주자 

extension_dir = "D:/APM_Setup/Server/PHP54/ext"






#7. 덧 

MySQL 모듈 등이 정상 동작하지 않으면 

php.ini에서  extension 부분을 보자. 



사용하는 모듈은 주석을 제거하고 Apache를 재시작해주자. 







'01_Note' 카테고리의 다른 글

Windows 에서 PHP 실행하기  (0) 2017.10.02
Redis  (0) 2013.12.31
eula.1028.txt 의 정체  (9) 2011.09.26
eula.1028.txt
eula.1031.txt
eula.1033.txt
eula.1036.txt
eula.1040.txt
eula.1041.txt
eula.1042.txt
eula.2052.txt
eula.3082.txt
globdata.ini
install.exe
install.ini
install.res.1028.dll
install.res.1031.dll
install.res.1033.dll
install.res.1036.dll
install.res.1040.dll
install.res.1041.dll
install.res.1042.dll
install.res.2052.dll
install.res.3082.dll
VC_RED.cab
VC_RED.MSI
vcredist.bmp


Visual C++ redistributable package 가 배포되면서 생기는 임시 파일이란다
압축을 그냥 무식하게 C:\ 혹은 D:\ 에다가 풀어버리고 
설치한다음에 지우지 않은 것.

이미 설치된 상황일테니까 그냥 지워주면 된다.  


http://answers.microsoft.com/en-us/windows/forum/windows_7-system/what-is-eula1028text-on-c/042cf4d8-0425-430f-88ca-b35da9439cfd

'01_Note' 카테고리의 다른 글

Windows 에서 PHP 실행하기  (0) 2017.10.02
Redis  (0) 2013.12.31
APMSETUP PHP version upgrade  (1) 2013.05.05

+ Recent posts