블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2737)
Unity3D (817)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
04-25 09:56

Unity 2021.3.35f1

GoogleMobileAds 8.7.0

----

 

 

GDPR 동의 로직 추가하고 iOS 검수 넣었더니 리젝 됐다.

사유는 대충 정리하면,

GDPR 팝업에서 '거부'를 했는데, 같은 이슈인 'IDFA(AppTrackingTransparency)' 동의 여부를 다시 묻는 건 문제다.

라는 말이었습니다.

 

이전엔 GoogleMobileAds에서 제대로 처리안해줘서 같은 이슈 (아래 링크 참고) 가 있었던 것 같은데, 현재 최신 버전에서는 수정된걸로 보인다.

[참고] https://groups.google.com/g/google-admob-ads-sdk/c/huUa7eyMTEE

 

URGENT: Apple App Rejected - UMP SDK Using both GDPR & IDFA/ATT Causing Rejection

Hi Justin, thank you for the update and for your work to get this resolved! Unfortunately, the "short term recommendation" provided would be a significant ad revenue impact, and so it is not viable. We do need to call requestConsentInfoUpdate to get the I

groups.google.com

 

아무튼,

나의 경우는 GDPR은 GoogleMobileAds를 사용하고, IDFA 관련은 다른 SDK에서 처리하고 있어서 유기적으로 제어되지 않고 있었다.

 

GoogleMobileAds-UMP를 확인해보니,

IDFA(App Tracking Transparency) 관련 처리도 GoogleMobileAds에서 같이해주면 GDPR과 IDFA(ATT) 동의를 알아서 유기적으로 처리해준다.

 

GDPR 로직을 추가하고, IDFA 관련 Admob 설정을 추가(소스 로직 추가는 없음)하고, 테스트 해보니 아래와 같은 형태로 진행된다.

(로직상으로는 GDPR 관련 체크 로직만 있다. GDPR 체크 후에 필요하면 IDFA 로직을 알아서 타는 것 같다.)

 

GDPR 관련 설정은 아래 링크를 참고하자.

[링크] [GoogleMobileAds] Unity-Google-UMP-Check(GDPR)

 

[GoogleMobileAds] Unity-Google-UMP-Check(GDPR)

2024년 1월 16일까지(참조:https://support.google.com/admob/answer/14189727?hl=ko) Admob을 사용하려면 유저에게 GDPR 동의를 받으라고 하는 것 같다. 그래서 Google에서 관련 SDK를 내놓은게 UMP(User Messaging Platform) SDK

blueasa.tistory.com

 

[GDPR/IDFA 활성화 시, 진행 Flow]

1) EEA(European Economic Area, 유럽 경제 지역)

    1-1) GDPR 팝업 Open

            1-1-1) GDPR 동의 시 -> ATT 동의 팝업 Open

            1-1-2) GDPR 비동의 시 -> ATT 동의 팝업 Skip(뜨지 않음)

 

2) Non-EEA(Non-European Economic Area, '유럽 경제 지역' 외 지역)

    2-1) IDFA 메시지 (안내) 팝업 Open

    2-2) ATT(App Tracking Transparency) 동의 팝업 Open

 

애플 검수 과정에서 요구하는 사항인 GDPR을 거부했을 때, IDFA 동의 팝업이 뜨지 않아야 된다는 조건에 만족하고 있다.

 

[결론]

GoogleMobileAds-UMP로 GDPR과 IDFA를 처리하면 심플하게 유기적으로 처리 가능하다.

적극 활용하자.

 

 

[참조] https://docs.adxcorp.kr/appendix/ump-user-messaging-platform#2.-idfa

 

UMP (User Messaging Platform) - ADX Library

IDFA 메시지 작성은 선택사항이지만, GDPR 메시지 사용 설정을 할 경우, IDFA 메시지 작성도 같이 작성하십시오. 애드몹 UMP의 GDPR 동의 화면이 보이는 상태에서, 프로그래밍 방식으로 수동으로 ATT (AP

docs.adxcorp.kr

[참조] https://docs.adxcorp.kr/ios/supporting-ios-14/app-tracking-transparency

 

App Tracking Transparency - ADX Library

애드몹 UMP (User Messaging Platform)의 IDFA 메시지 기능 활성화 시, 특별한 프로그래밍 코딩을 하지 않아도, UMP 내부에서 자동으로 ATT 동의 알림 요청 기능을 수행하므로, 이 단계(Step4)와 다음 단계 (Step

docs.adxcorp.kr

반응형
Posted by blueasa
, |

신호 유형


 

  • SIGABRT--프로그램 중단 명령 중단 신호
  • SIGALRM--프로그램 시간 초과 신호
  • SIGFPE--프로그램 부동 소수점 예외 신호
  • SIGILL--잘못된 프로그램 명령 신호
  • SIGHUP--프로그램 터미널 중단 신호
  • SIGINT--프로그램 키보드 인터럽트 신호
  • SIGKILL--프로그램이 종료되고 중단 신호를 받습니다.
  • SIGTERM--프로그램 종료 중단 신호
  • SIGSTOP--프로그램 키보드 중단 신호 
  • SIGSEGV--프로그램 잘못된 메모리 중단 신호
  • SIGBUS--프로그램 메모리 바이트 정렬 오류 중단 신호
  • SIGPIPE--프로그램 소켓이 중단 신호를 보내지 못했습니다.

 

[출처] https://www.cnblogs.com/daxiaxiaohao/p/4466097.html

 

[iOS]使用signal让app能够在从容崩溃 - Lewis.Xiaoa - 博客园

前言虽然大家都不愿意看到程序崩溃,但可能崩溃是每个应用必须面对的现实,既然崩溃已经发生,无法阻挡了,那我们就让它崩也崩得淡定点吧。iOS SDK中提供了一个现成的函数NSSetUncaughtExceptio

www.cnblogs.com

 

반응형
Posted by blueasa
, |

[Google Play Store 경고 내용]

com.google.android.recaptcha:recaptcha:18.1.2
이 SDK 버전에는 SDK 개발자의 메모가 포함되어 있습니다. SDK 개발자가 신고한 내용은 다음과 같습니다.
A critical security vulnerability was discovered in reCAPTCHA Enterprise for Mobile. The vulnerability has been patched in the latest SDK release. Customers will need to update their Android application with the reCAPTCHA Enterprise for Mobile SDK, version 18.4.0 or above. We strongly recommend you update to the latest version as soon as possible.

 

[수정]

Firebase 11.7.0(Firebase Android BoM version 32.7.1)에 수정됐다고 한다.

Firebase 11.7.0으로 버전업 하자.

 

 

[참조] https://velog.io/@hodu_angel/Firebase-com.google.android.recaptcharecaptcha18.1.2

 

velog

 

velog.io

 

[참조] https://github.com/firebase/firebase-android-sdk/issues/5638

 

reCAPTCHA Enterprise update · Issue #5638 · firebase/firebase-android-sdk

A critical security vulnerability was discovered in reCAPTCHA Enterprise for Mobile. The vulnerability has been patched in the latest SDK release. Customers will need to update their Android applic...

github.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.34f1

----

 

Unity 2021.3.34f1에서 Android 빌드 테스트를 하다보니 아래와 같이 2가지 이슈가 있었다.

 

1) Android Target API Level 31 이후가 뜨지 않음.

2) Android 빌드 시, 빌드는 잘되지만 켜자마자 Runtime Crash가 발생함.

----

 

[1) 이슈]

1)의 경우는 Unity 설치 Path에 빈 칸( )이 있어서 발생하는 문제라고 한다.

 

[결론]

Unity Hub의 설치 폴더를 빈 칸( )이 없는 Path로 변경하고(Unity Hub 완전 종료 후 재실행 필요) 유니티를 다시 설치하자.

 

 

[2) 이슈]

유니티 업데이트 하고 1)의 이슈 해결하고 Android 빌드했더니, 아래와 같은 Crash 로그가 뜬다.

(iOS는 정상적으로 빌드 됨)

 

[Crash Log] signal 6 (SIGABRT), code -1 (SI_QUEUE)

 

검색해보니 아래 [참조]와 같은 내용과 해결책이 적혀 있는데,

따라해봐도 계속 Crash가 나는걸 봐선 이번 이슈와는 관련이 없는 것 같다.

(결국 Crash Log로 검색해서는 현재 상황에 맞는 답을 찾지 못했다)

 

[참조] https://stackoverflow.com/questions/76222872/unity-android-receiving-signal-crashes

 

Unity Android receiving signal crashes

Backstory I built my unity app to android x64 using IL2CPP which has worked fine in the past but after a lot of changes I'm now getting crashes somewhat spontaneously. Signals received: signal 6 (

stackoverflow.com

 

그래서 좀 더 고민하다보니 현재 프로젝트 2개를 관리중인데 Unity 2021.3.34f1에서 하나는 Runtime Crash가 나고, 하나는 Crash가 나지 않아서 비교해 보다보니 다른점이 있었다.

Crash가 나는 쪽은 대용량(150MB 이상) aab 파일 생성을 위해 Play Asset Delivery 1.7.0이 들어있었고,

Crash 가 나지 않는 쪽은 없었다.

 

혹시나하고 Play Asset Delivery를 지우고 빌드해보니 정상적으로 빌드되고 잘 실행된다.

그래서 다시 한 번 Play Asset Delivery를 현재 기준 최신 버전인 1.8.2(2024-02-16 현재 기준 최신)를 넣고 빌드해보니 역시나 잘 실행된다.

Unity 2021.3.34f1부터 Google 라이브러리 중 뭔가 바꼈다고 하는 것 같은데,

정황상 바뀐 Google 관련 라이브러리가 Play Asset Delivery 1.7.0 버전과 호환이 안되는 것 같다.

 

이전에는 Unity 2021의 gradle 버전이 기본 4.0.1이어서 Play Asset Delivery 1.7.0을 써야 됐는데,

GoogleMobileAds(Admob) 8.6.0 버전부터 gradle 4.2.0을 강제해서 올리다보니

Play Asset Delivery 1.8.x 버전대를 쓸 수 있는 상황이 왔다.

 

[결론]

Unity 2021.3.34f1 이상에서 제목과 같은 Runtime Crash가 나는데 Play Asset Delivery 1.7.0을 사용하고 있다면,

gradle 4.2.0으로 올리고, Play Asset Delivery 1.8.2(2024-02-16 현재 기준 최신)로 교체한 후 빌드해 보자.

 

[정리]

Unity 2021.3.33f1 이하 : Play Asset Delivery 1.7.0 사용

Unity 2021.3.34f1 이상 : Play Asset Delivery 1.8.2 사용

 

 

[참조] https://developers.google.com/unity/archive?hl=ko#play_asset_delivery

 

Unity용 Google 패키지 다운로드  |  Google for Developers

 

developers.google.com

반응형
Posted by blueasa
, |

Unity 2021.3.34f1

----

 

Unity 2021.3.33f1에선 잘되던게 Unity 2021.3.34f1을 설치하고 아래와 같은 에러가 뜨면서 Android Target API Level 31 이상이 뜨지 않는다.

해당 증상은 Unity 2021.3.35f1에서도 해결되지 않았다.(고칠 생각이 없는건가?)

 

[Error Log]

CommandInvokationFailure: Failed to update Android SDK package list.
C:\Program Files\Unity\Hub\Editor\2021.3.34f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\cmdline-tools\2.1\bin\sdkmanager.bat --list

 

관련 이슈 및 해결방법은 아래 참조 링크에서 볼 수 있다.

 

관련 문제는 결국 기본 설정 폴더인 'C:\Program Files' Path의 사이에 있는 빈 칸( ) 때문이란다.

유니티 관계자는 구글 탓을 하고 있는데,

Unity Hub에서 에디터 기본 설치 폴더를 'C:\Program Files\Unity\Hub\Editor'로 잡고 있으면서 남 탓 하는것도 웃기고..

Unity 2021.3.34f1을 기본 설치폴더에 설치하고 실행만 해봤어도 아는 버그를.. 결국 테스트도 안한다고 자백하는 꼴 아닌가..

 

아무튼 해결 방법 2가지를 제시 하는데,

나중을 생각해서라도 심플하게 아래와 같이

Unity Editor 기본 설치 폴더를 'C:\Program Files\Unity\Hub\Editor'에서 'C:\Unity\Hub\Editor'로 옮기자.

 

 

[참조]

https://forum.unity.com/threads/commandinvokationfailure-failed-to-update-android-sdk-package-list.1535458/

 

Bug - CommandInvokationFailure: Failed to update Android SDK package list.

Just updated to 2021.3.34f1. Using all default Unity supplied SDKs. Unable to list target platforms. Please make sure the android sdk path is correct....

forum.unity.com

 

반응형
Posted by blueasa
, |

For a while I was struggling with high crash rates on Android due to a "signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)" error in /lib/arm64/libunity.so

Unity 2021.3.26f1 (but also in all earlier Unity 2021, 2020 and 2019 versions I tried). URP 12.1.11.

SOLUTION:
The solution was to disable both Multithreaded Rendering and Graphics Jobs (I had both enabled).



Detailed Error log (with symbols):

 
2023.06.16 16:11:05.189 8877 8946 Error CRASH *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2023.06.16 16:11:05.189 8877 8946 Error CRASH Version '2021.3.26f1 (a16dc32e0ff2)', Build type 'Release', Scripting Backend 'il2cpp', CPU 'arm64-v8a'
2023.06.16 16:11:05.189 8877 8946 Error CRASH Build fingerprint: 'Nokia/Onyx_00WW/B2N_sprout:10/QKQ1.190828.002/00WW_4_15N:user/release-keys'
2023.06.16 16:11:05.189 8877 8946 Error CRASH Revision: '0'
2023.06.16 16:11:05.189 8877 8946 Error CRASH ABI: 'arm64'
2023.06.16 16:11:05.189 8877 8946 Error CRASH Timestamp: 2023-06-16 16:11:05+0200
2023.06.16 16:11:05.189 8877 8946 Error CRASH pid: 8877, tid: 8946, name: Thread-5  >>> com.kamgam.sbr2 <<<
2023.06.16 16:11:05.189 8877 8946 Error CRASH uid: 10398
2023.06.16 16:11:05.189 8877 8946 Error CRASH signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x17
2023.06.16 16:11:05.189 8877 8946 Error CRASH Cause: null pointer dereference
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x0  00000072101ca8c0  x1  0000000000000000  x2  0000000000000858  x3  000000000000e56e
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x4  000000000000005b  x5  00000072530c4ddc  x6  0000000000000000  x7  00000000840088d2
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x8  00000072535d7530  x9  00000000fffffff1  x10 0000000000000000  x11 0000000000000000
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x12 0000000000000000  x13 0000000000000000  x14 0000000000029873  x15 0000000000000001
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x16 000000725351b618  x17 000000733e8c7070  x18 0000007167606000  x19 0000000000000858
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x20 0000000000000000  x21 ffffffffffffffff  x22 00000071d0132308  x23 00000072101e1c70
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x24 00000072101e1cf0  x25 0000000000000000  x26 00000072104b3780  x27 000000715000018c
2023.06.16 16:11:05.189 8877 8946 Error CRASH     x28 000000000000273d  x29 000000716841fc20
2023.06.16 16:11:05.189 8877 8946 Error CRASH     sp  000000716841f8c0  lr  0000007252840538  pc  0000007252840548
2023.06.16 16:11:05.189 8877 8946 Error CRASH
2023.06.16 16:11:05.189 8877 8946 Error CRASH backtrace:
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #00 pc 0000000000b7c548  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #01 pc 0000000000b8cd8c  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #02 pc 0000000000b8ccfc  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #03 pc 0000000000b44abc  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #04 pc 0000000000b449a0  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #05 pc 0000000000d39570  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #06 pc 0000000000d3b9a8  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #07 pc 0000000000d32ff0  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #08 pc 0000000000513ff0  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #09 pc 00000000000e6890  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: cf739dbc84bcc78f7a1500721bfb3758)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #10 pc 0000000000084b6c  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: cf739dbc84bcc78f7a1500721bfb3758)
2023.06.16 16:11:05.328 8877 8946 Error CRASH Forwarding signal 11
0001.01.01 00:00:00.000 -1 -1 Info  --------- beginning of crash
2023.06.16 16:11:05.328 8877 8946 Fatal libc Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x17 in tid 8946 (Thread-5), pid 8877 (com.kamgam.sbr2)
 
SYMBOLICATED STACK
 
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #00 pc 0000000000b7c548 (DataBufferGLES::FlushMappedRange(unsigned long, unsigned long) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #01 pc 0000000000b8cd8c (BufferGLES::EndWrite(unsigned long) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #02 pc 0000000000b8ccfc (GfxDeviceGLES::EndBufferWrite(GfxBuffer*, unsigned long) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #03 pc 0000000000b44abc (GeometryJobTasks::PutGeometryJobTask(GfxDevice&, GeometryJobTasks::GeometryJobTask*) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #04 pc 0000000000b449a0 (GeometryJobTasks::EndFrame(GfxDevice&) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #05 pc 0000000000d39570 (GfxDeviceWorker::RunCommand(ThreadedStreamBuffer&) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #06 pc 0000000000d3b9a8 (GfxDeviceWorker::RunExt(ThreadedStreamBuffer&) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #07 pc 0000000000d32ff0 (GfxDeviceWorker::RunGfxDeviceWorker(void*) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #08 pc 0000000000513ff0 (Thread::RunThreadWrapper(void*) at ??:?)  /data/app/com.kamgam.sbr2-MA6dTM-G3o_UvCLJ-IzJ0g==/lib/arm64/libunity.so (BuildId: 0a19a0525ef8627736f4cb908c7e7b6083772483)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #09 pc 00000000000e6890 (libc.so not found)  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+36) (BuildId: cf739dbc84bcc78f7a1500721bfb3758)
2023.06.16 16:11:05.189 8877 8946 Error CRASH       #10 pc 0000000000084b6c (libc.so not found)  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: cf739dbc84bcc78f7a1500721bfb3758)
2023.06.16 16:11:05.328 8877 8946 Error CRASH Forwarding signal 11



This give a bit of context: This is not for a few users. The effect was tested on about 200k installs and I am pretty confident by now that it worked.




Not sure if this is a known problem. May this info help others with similar problems.

 

 

[출처] https://forum.unity.com/threads/reducing-android-crash-rate-due-to-graphics-jobs-and-multithreaded-rendering.1454152/

 

Showcase - Reducing Android Crash rate due to Graphics Jobs and Multithreaded Rendering

For a while I was struggling with high crash rates on Android due to a "signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)" error in /lib/arm64/libunity.so...

forum.unity.com

 

[참조] https://ssscool.tistory.com/387

 

[Unity] 유니티 다른폰은 괜찮은데 LG G6에서 테스트 했을때만 Crash 나는 현상 해결 (V/InputMethodManager:

[Unity] 유니티 다른폰은 괜찮은데 LG G6에서 테스트 했을때만 Crash 나는 현상 해결 (V/InputMethodManager: checkFocus: view=android.view.SurfaceView{291d66e VFE...... .F....I. 0,0-1440,2880} next=android.view.SurfaceView{291d66e VFE..

ssscool.tistory.com

[참조] https://devgod.tistory.com/58

 

Unity Crash by 'UnityGfxDeviceW'

유니티 버전을 2021.3x로 업데이트 이후 그래픽 라이브러리에서 'UnityGfxDeviceW'와 같은 메세지가 포함된 크래시가 반복적으로 발생되었다. 해결 : Multithreaded Rendering 옵션 비활성 Compute Skining 옵션 비

devgod.tistory.com

 

 

 

반응형
Posted by blueasa
, |

[링크] https://rito15.github.io/posts/unity-mobile-optimization/

 

유니티 - 모바일 성능 최적화

프로젝트 설정

rito15.github.io

 

반응형
Posted by blueasa
, |

게임 출시를 앞두고, Android플랫폼의 심각한 발열과 낮은 프레임에 대한 최적화를 수행했다.

여러개의 프로젝트를 런칭하면서 쌓인 노하우 및 새로 공부한 지식으로 유의미한 최적화 성과를 거두었기에 최적화 방법을 공유한다.

 

먼저, 최적화 방법 공유에 앞서 최적화 대상 프로젝트의 스펙은 다음과 같다

-Unity 2021.3.8f로 개발

-URP 프로젝트

-NGUI사용

 

최적화 성과 (갤럭시 s8기준)

FPS :  20~30 -> 50~60

용량 : 400mb -> 300mb

발열 : S22에서 심각한 발열로 인해 30~40fps가 나옴 -> S22와 같은 심각한 발열 기기에서 거의 발열 없이 수십분 이상 구동 가능. 안정적인 60fps유지.

 

이와같은 성능을 유지하기 위해선 여러가지 복합적인 이유들이 있겠지만,

untiy editor의 stats기준으로 batch는 많아도 100~200수준을 잡아주는 것이 좋다

(스크립트 병목과 높은 vertex로 인한 성능 하락은 고려하지 않는다)

 

먼저 최적화에 앞서 본인 프로젝트에 대한 프로파일링을 우선 진행하길 바란다.

필자는 최적화에 Unity Profiler와 Memory Profiler(실험적) 을 사용했다

 

profiler를 통해 스크립트 병목의 원인을 추적하고, 메모리 스냅샷을 사용해 메모리 사용량을 최적화하라

 

그리고 최적화의 대상이 CPU처리인지 GPU처리인지도 파악해야 한다.

 

 

 

NGUI관련 최적화

1. UI Atlas의 depth최적화, panel을 최적화한다. 

ngui에서 가장 기본적인 것으로 동일한 panel을 사용하는 widget들의 depth를 정리하여 최적화 해주어야 한다.

무분별한 panel의 사용으로 동일한 atlas를 사용하는 widget이 쪼개져 중복적인 draw call을 야기하지 않도록 해야한다.

 

ngui에서 A와 B아틀라스 2개를 통해 UI를 구성한다면 흔이 2의 draw call을 예상할 것 이다.

하지만 만약 depth가 A A B A BB이런 식으로 ui를 배치한다면 draw call은 4가 된다

2의 draw call을 얻기 위해선 A A A B B B B와 같이 atlas에 따른 ui depth를 정리해주어야 한다.

 

하나의 atlas로 draw되다가 다른 atals를 만나면 중간에 batching이 끊기게 된다.

 

2. 동일한 atlas를 사용하는 widget은 단일 panel에서 최대한 순서를 정렬하여 처리해준다.

필자의 경우 ui atlas를 back / icon / overay / font 이렇게 4가지로 나누어, 정리했으며 

ui가 아무리 많아도 batch는 최대 4만 유지하도록 해주었다.

draw call의 병합 규칙은 두가지가 있는데, 하나는 material, texture, shader가 모두 같다는 것이고 다른 하나는 widget의 레이어가 같거나 인접해야 한다는 것이다.

 

3. NGUI에서 Transform의 변화, 생성, 삭제가 일어나는 객체를 조심해라

NGUI에서는 Panel에 속한 widget의 Transform이 변화(생성/삭제 포함) 하면 해당 panel에 있는 모든 widget을 다시 rendering한다. 

즉, Panel에 연출을 위한 widget이 tween position, scale등을 한다면 매 lateUpdate에 Panel은 drawcallfill을 다시 호출하는 것이다.

NGUI Widget의 Transform이 정적이지 않거나, 생성/삭제가 자주 일어나는 객체라면 완전히 다른 panel의 하위 객체로 두어 격리해두어야 한다.

즉, NGUI에서는 한 panel에 속한 widget의 상태에 변화가 생기면 해당 panel의 모든 atlas를 다시 렌더링해주게끔 되어있다.

 

3-1. 특히 NGUI의 UI Label을 조심해라

UI Label로 데미지 등을 처리할 경우 데미지 연출을 위해 UI Label이 매프레임 tweening하거나 animation을 재생할 수 있다. 이 경우 UI Label은 엄청난 성능 병목을 일으킨다.

매 프레임 움직이는 UILabel이 속한 panel의 draw fill/fill shadow/draw call fill을 야기시킨다.

특히 UI Label에 쉐도우나, 아웃라인 등이 들어가있다면 매프레임 Transform의 변화에 따라 Label을 다시 렌더링 해주게 된다.

이를 방지하기 위해 데미지 폰트 등은 이미지 폰트를 사용하는 것을 추천한다.

 

4. panel의 static상태 활성화

panel로 구성한 ui에 있는 모든 객체가 정적인 것이 보장된다면, panel의 static옵션을 활성화해주면 좋다.

ngui객체도 기본적으로 mono객체이며, static객체가 아니면 모든 ui객체에서 update/lateUpdate가 호출되기에 성능 병목이 발생한다.

정적인 객체의 경우 3번 방법을 참고하여 동적인 객체만 관리하는 panel등으로 격리해주자

 

 

그 외 Unity공통 최적화

1. GC를 줄이자

BinaryFormatter의 Serialize는 엄청난 양의 GC를 야기하며, 디바이스를 freeze시킨다. 이러한 동작은 매프레임 해주지 말고, 스케쥴러를 만들어 처리해주자

 

BigInteger.Parse(string)과 같은 value copy를 야기하는 처리를 피해주자

 

특정 타이밍에 GC.Collect를 수동으로 호출해주자

 

2. URP Setting의 Post Processing의 fast sRGB/Linear Conversions로 gamma공간을 사용하고 있다면 gpu의 부담을 덜어주자

 

3.  SustainedPerformanceMode를 활성화해 지속가능한 성능 옵션을 켜주어, 발열을 방지하자 (이로 인해 기본적인 fps의 하락이 있을 수 있음)

 

4. GPU의 병목/부하가 생기는 Project Setting의 옵션은 비활성화 하자 (Compute Skinning, Graphics Jobs...등)

 

5. Static Batching과 Dynamic batcing을 적극 활용하자

 

6. Texture compression format : ASTC, normal map encoding : DXT5nm-style

 

7. Screen.SetResoultion을 통해 화면 해상도를 지정해주자 (HD~FHD). 이를 해주지 않을 경우 기기의 해상도에 따라 렌더링되기 때문에 발열과 배터리소모의 원인이된다.

 

8. Target Framerate를 설정해주자 (60fps). 만약 프레임상한이 없다면 상위 기기에선 비정상적으로 높은 fps가 발생할 수 있으며 이는 발열/배터리소모의 원인이 될 수 있다.

 

9. realtime shadow는 최대한 피하고, 눈속임을 통해 그림자를 표시할 수 있는 방법을 찾자

quad를 통해 그림자를 표현하고, 이 quad를 dynamic batcing하는 등이 방법이다.

 

10. 가능한 많은 object pooling을 해주자. 

또한 NGUI객체의 경우 객체를 pool에서 회수/반환할 때 gameObject.SetActive보단 화면에 rendering되지 않는 먼 영역으로 좌표를 이동시켜 주는것이 좋은 선택지일 수 있다.

NGUI객체는 오브젝트가 enable/disable될 때 많은 병목을 일으키는 처리를 수행한다

 

11. 거리에 따른 최적화 방법을 숙지하라

Generate mipmap은 기본적을 texture의 용량을 1.3배 정도 부풀린다.

단 한 화면에 render되는 객체가 많을 경우 이는 한 화면의 메모리 부하를 줄여주므로 적극 활용해야한다.

 

또한 오브젝트에 LOD level을 세팅하면 거리에 따라 3D오브젝트의 렌더링 부하를 줄일 수 있지만 용량이 추가적으로 들어가는 것을 유의해야 한다.

 

Aniso Level을 주의해라. Aniso Level은 오브젝트를 그릴 때 단일 텍스쳐라도 멀어지면 흐리게 해주는 효과이다.

Aniso Level이 높을수록 선명해지겠지만 ,처리비용이 많이 든다.

프로젝트 세팅에서 확인하라 (기본값은 Forced On이다)

 

12. Asset의 Read/Write옵션을 주의하라

이 옵션은 기본적으로 비활성화지만 활성화 시 GPU메모리 뿐만 아니라 메인 메모리에도 복사되므로 소비량이 2배로 증가한다.

꼭 필요한 오브젝트의 경우만 식별하여 사용할 것

 

13. 파티클의 shader/material에 따라 render order를 조정해주어라.

NGUI와 같은 개념으로, 파티클에서 사용되는 shader/material도 render order를 조정해주어 batching되도록 해주자

 

14. Resources.Load를 매니징하자

디바이스로 부터 불러온 자원의 경우 사용 빈도에 따라 GC가 발생하지 않도록 상시 메모리에서 들고있는 등의 방법으로 최적화 해줄 수 있다.

 

15. Debug.Log를 주의해라

런타임 빌드 시 프로젝트 세팅에서 로깅 옵션을 완전히 비활성화 하거나, 스크립트에서 define으로 처리를 격리해주어라.

 

Unity Crash관련 팁

이 항목은 필자가 서비스중인 게임의 크래시 문제를 해결한 경험으로 작성되었기에, 지극히 주관적입니다.

 

1. Android환경에서 Vulkan API는 아직 불안정하다. Vulkan내부에서 native crash를 야기할 수 있다. (필자는 opengles 3을 권장)

 

2. Multithread rendering과 compute skinning도 native crash를 야기할 수 있다. 

 

3. 빈번한 Scene Load는 잦은 크래시를 야기할 수 있다.

맵의 전환 등으로 Scene이 load될 때 전 scene의 unload와 새로운 scene의 load중 스크립트가 unload된 scene의 객체 혹은 아직 preload상태의 scene에 접근할 경우 크래시가 발생한다.

 

추가적으로, unity의 scene 로드 구조는 순간적으로 폭발적인 메모리 사용량을 불러올 수 있다.

A장면에서 B장면으로 넘어갈 때 A장면과 B장면이 동시에 메모리에 올라가있는 순간이 존재하며 이 때 메모리 부족으로 크래시가 발생할 수 있다.

 

A장면에서 B장면으로 넘길 때 빈 장면(C)을 넣어 A장면의 메모리가 모두 해제되고, GC가 Collect되게 한 후 B장면을 로드해주는 방식은 아주 유용하다

 

4. Strip Engine Code옵션은 무조건 끄자

압축된 스크립트 dll을 참조하는 순간 native crash가 발생한다

 

 

[출처] https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=124306

 

최적화 노하우 공유 - 인디 게임 개발 마이너 갤러리

개인적으로 개발관련해서 메모용으로 사용하는 티스토리 블로그에 작성했다가,꽤 많은 분들에게 도움이 될 것 같아 내용만 똑같이 복붙하여 왔습니다.다들 고생하세요.-----게임 출시를 앞두고,

gall.dcinside.com

 

반응형
Posted by blueasa
, |

Unity 2021.3.33f1

NGUI 2023.08.01

----

 

NGUI-UILabel의 Effect에서 Shadow와 Outline을 같이 적용하고 싶어서 찾아보고 올려둠.

UILabel에 세 곳에 소스 추가

public class UILabel : UIWidget
{
    ....
    
    [DoNotObfuscateNGUI] public enum Effect
    {
        None,
        Shadow,
        Outline,
        Outline8,
        ShadowAndOutline,	// Add
    }   
    
    ....
    
    /// <summary>
    /// How many quads there are per printed character.
    /// </summary>

    public int quadsPerCharacter
    {
        get
        {
            if (mEffectStyle == Effect.Shadow) return 2;
            else if (mEffectStyle == Effect.Outline) return 5;
            else if (mEffectStyle == Effect.Outline8) return 9;
            else if (mEffectStyle == Effect.ShadowAndOutline) return 9;	// Add
            return 1;
        }
    }

	....
    
    public void Fill (List<Vector3> verts, List<Vector2> uvs, List<Color> cols, List<Vector3> symbolVerts, List<Vector2> symbolUVs, List<Color> symbolCols)
	{
        ...
        // Apply an effect if one was requested
		if (effectStyle != Effect.None)
		{
			int end = verts.Count;
			var symEnd = (symbolVerts != null) ? symbolVerts.Count : 0;

			pos.x = mEffectDistance.x;
			pos.y = mEffectDistance.y;

			ApplyShadow(verts, uvs, cols, offset, end, pos.x, -pos.y);
			if (symbolVerts != null) ApplyShadow(symbolVerts, symbolUVs, symbolCols, symOffset, symEnd, pos.x, -pos.y);

            #region Add ShadowAndOutline
            if (effectStyle == Effect.ShadowAndOutline)
            {
                pos.y /= 2;
                pos.x = pos.y;

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, -pos.x, pos.y);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, pos.x, pos.y);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, -pos.x, -pos.y);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, -pos.x, 0);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, pos.x, 0);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, 0, pos.y);

                offset = end;
                end = verts.Count;

                ApplyShadow(verts, uvs, cols, offset, end, 0, -pos.y);
            }
			#endregion

            if ((effectStyle == Effect.Outline) || (effectStyle == Effect.Outline8))
			{        
        ...
    }
	
}

 

 

[출처] https://gamedev.stackexchange.com/questions/151329/all-sides-shadow-outline-in-unity-ngui

 

All sides shadow outline in Unity NGUI

How can I make such exactly the same shadow using NGUI?

gamedev.stackexchange.com

 

반응형
Posted by blueasa
, |

[요약1] Chrome-설정(⋮)-도구 더보기-개발자 도구(F12)-톱니바퀴(Settings)-Prefrences-Debugger-Disable JavaScript 체크

[요약2] https://chromewebstore.google.com/detail/simple-allow-copy/aefehdhdciieocakfobpaaolhipkcpgc

 

Simple Allow Copy

Allow Copy on every websites

chrome.google.com

 

[링크] https://bbomee.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%84%B7-%EC%9B%B9%ED%8E%98%EC%9D%B4%EC%A7%80-%EB%B3%B5%EC%82%AC%EB%B0%A9%EC%A7%80-%ED%95%B4%EC%A0%9C-%ED%81%AC%EB%A1%AC-%ED%99%95%EC%9E%A5%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%A4%EC%B9%98%EB%A1%9C-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0

 

인터넷 웹페이지 복사방지 해제, 크롬 확장프로그램 설치로 해결하기

간혹 중요 내용의 뉴스를 보고 다음에 활용을 위해서 또는 인용을 위해 꼭 복사하기가 필요한 경우 복사하기 차단이 되었을 시 오른쪽 마우스 복사하기 안됩니다. 이런 경우 복사할 수 있는 방

bbomee.tistory.com

 

 

 

반응형
Posted by blueasa
, |