I just need a http downloader to use on android NDK, also ssl is not required on my app. so. I Search prebuilt curl library in google. but, most compiled version are not matched on my app. something conflict OpenSSL, something not works, and so on. After all, I decide to compile curl source code to use on my app. How to compile the curl source code. Below link explains How to compile, android co..
Android는 Java를 이용하기 때문에(*1), Java의 우선순위설정을 사용하여 Thread의 우선순위(*3)를 정할 수 있다. Java에서 현재 Thread의 우선순위설정하려면 다음과 같이 한다. Thread.currentThread().setPriority( int priority ); 이 코드에서 priority 값은 10~1값을 넣어주면된다. 보통 쓰레드가 생성되는 중간정도의 (중간값,기본값) 값은 5로 되어 있다. Java 프로그래밍에 익숙한 독자라면, 이 코드는 그리 어렵지 않다. 하지만, 위의 코드로 아무리 최고값인 Thread.MAX_PRIORITY값을 넣어도 끊기는 경우가 있다. 특히 음악과 같이 소리를 실시간으로 처리하는 앱에서 주로 발생하게 된다(*2). Thread의 최고치를 ..
디버그를 시작하면 상태 표시줄에서 "Load Module"에서 무한히 멈춰버리는 경우가 있다. 특히 Android Studio를 업그레이드나 업데이트한 후에 주로 발생하게 된다. 알고 보니 이 건 이미 알려진 문제였다. 다음의 링크에 Native debugger hangs while loading libraries 부분을 보면 해결책이 있다. https://developer.android.com/studio/known-issues Android 스튜디오 및 Android Gradle 플러그인의 알려진 문제 | Android 개발자 Android 스튜디오 및 Android Gradle 플러그인의 현재 알려진 문제에 관해 알아보세요. developer.android.com 해결책 $USER/.lldb/mod..
ComputeShader에는 2가지의 Barrier가 있다. 아하... 이 이야기를 하기전에 Barrier가 뭔지를 설명해야 겠구나.. Barrier란..? 일단 ComputeShader와는 상관없이 Barrier는 2가지 종류가 있다. 하나는 execution barrier, 나머지는 memory barrier다. CPU든 GPU든 이런 것들이 계산과 처리를 할 때, (여기서 CPU와 GPU같은 것이 만들어진 구조를 아키텍처[그냥단어다]라고 부른다.) 특히 멀티쓰레드로 작업을 할 때, 이 멀티쓰레드 작업의 결과가 올바르게 나오기 위해, 때로는 쓰레드의 실행을 멈추었다가 다시 실행해야 되고, 때로는 메모리 쓰여진 데이터가 다른 쓰레드에서 이 쓰여진 데이터를 읽어야 하는 경우가 있다. 실행을 멈추고 다시 ..
3.0까지 texture에 직접 쓸 수 있는 방법이 없었다. FBO로 감싸서 그려야 했고, 그 과정은 코드로는 간단하지만, 실제 GPU에서는 상당한 작업이 들어가는 작업이었다. 이제 ComputeShader는 바로 읽기/쓰기를 지원한다. 하지만 여기에는 제약이 있는 데, 기존에 사용하던 방식이 아닌 다른 함수를 통해 텍스쳐를 만들어야 한다. Immutable-storage에 텍스쳐만들기 말이 좀 해깔리지만(Immutable:바꿀 수 없는) 그냥 ComputeShader는 Immutable-storage의 텍스쳐만 쓸(write) 수 있다고 생각하면 된다. 이렇게 만들 수 있는 함수는 glTexStorage*()함수들이다. 텍스쳐 만드는 코드 GLuint texId = 0; glGenTextures( 1,..
ComputeShader는 한개의 쉐이더만 있으면 된다. 다음은 ComputeShader를 컴파일하는 함수다. GLuint CompileComputeShader( const char* szShaderCode ) { GLuint rc = 0; int rvalue; GLchar log[1024]; GLsizei length; GLuint program = glCreateProgram(); GLuint shader = glCreateShader(GL_COMPUTE_SHADER); glShaderSource( shader, 1, &szShaderCode, nullptr ); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &rvalue ); ..
안드로이드의 최소버전(minSdkVersion)을 기준으로 네이티브 코드는 링크가 된다.[*1], 그러다 보니 이 minSdkVersion을 강제로 올려야 되는 상황이 발생한다. 만들고 있는 앱을 지원하지 않는 기능을 제외하고는 낮은 버전에서도 돌리고 싶은 데, 이 minSdkVersion값을 올려버리면 아예 지원하는 기기가 달라지기에 문제가 아닐 수 없다. 어쩔 수 없이 다른 방법을 사용해야 하는 데, 기기에 깔린 libGLESv3.so 파일을 읽어드려서 필요한 함수포인터를 알아 낼 수가 있다. dlOpen을 이용하기 dlOpen함수를 사용하여 dlsym을 통하여 함수의 포인터를 구할 수도 있지만, 이 또한 문제가 발생할 수 있는 데, 기기의 제조사가 OpenGL ES 3.x용 libGLESv3.so파..
GPU도 연산회로를 포함하고 있다. 게다가 이 연산은 3차원 공간과 색공간을 처리할 수 있는 특화된 연산함수를 포함한다. 주로 삼각함수와 고등학교에서 배운 벡터연산 등을 빠르게 계산할 수 있게 설계가 되어있다. 이 것을 잘 활용한다면 CPU의 부하를 줄이고 코어수가 훨씬 많은 GPU를 이용하기 때문에 더 많은 계산을 할 수 있다. OpenGL ES 는 3.1부터 이 연산을 바로 지원하도록 하고 있다. 이 전까지는 뭔가 그리는 것으로 작업 끝내는 용도였지만, 이 제 연산만 하고 다시 CPU에서 끌어다 쓸 수 있게 지원을 해준다. 그 것이 ComputeShader라는 녀석이다. 3.0이하 버전에서도 약간의 트릭을 써서 만들 수는 있다. Fragment shader로 그려서 FBO에 결과를 다시 읽어오면 같은..
Texture(또는 FBO)를 다른 Texture(또는 FBO)에 복사하려면 보통 대상을 FBO(Framebuffer Object)로 만들고 Shader를 작성하여 복사를 한다. 이 방식에는 FBO와 Texture를 엮는 과정이 발생하게 되는 데, 이 게 좀 부하가 걸리는 작업이다. 이 부하를 줄이고, Framebuffer를 사용하는 복잡한 과정없이 바로 복사할 수 있는 함수들이 있다. 모든 상황을 지원하는 것이 아니기에 정리를 좀 해 본다. 1 : FBO -> FBO glBlitFrameBuffer(3.0), glCopyPixels(2.0) 2 : FBO -> Texture glCopyTexSubImage2D(2.0) 3 : Texture -> FBO 바로 지원하는 함수는 없다. Shader를 만들어서..
ComputeShader를 작성하여 열심히 코딩을 하던 중에 어떤 기기는 잘 동작하지만 어떤 기기는 계속되는 깜빡임(flickering)으로 인해 심한 스트레스를 받고 있는 상황이었다. ComputeShader의 정확히 정해지지 않은 스펙과 Mali 드라이버의 버그 등 해결책이 보이지 않던 상황에서 한가지 "내가 간과하고 있는 것이 있는 가?" 하는 질문을 스스로에게 던지게 되었다. 웹을 뒤지고 뒤져서 글을 하나 발견하게 되었는 데, "FrameBuffer를 올바르게 사용하는 법"이라는 글이었다. https://community.arm.com/developer/tools-software/graphics/b/blog/posts/mali-performance-2-how-to-correctly-handle-f..
우선 Choreographer의 기본 방식을 모르는 독자는 다음의 링크를 보고 오기를 바란다. 기본적인 내용과 Java코드가 있다. jamssoft.tistory.com/231 안드로이드 Choreographer 사용하기 인스턴스 생성하기 Choreographer는 new를 통해 생성할 수도 없고, 다른 방법으로 만들어야 한다. Choreographer choreographer = Choreographer.getInstance(); 위와 같이 static함수를 호출하는 것으로 끝난다... jamssoft.tistory.com Native에서 Choreographer를 사용하려면 Api Level이 24(Nougat/누가)이상이 되어야 한다. 따라서 아직 누가 미만의 기기들이 많은 관계로 되도록이면 Jav..
인스턴스 생성하기 Choreographer는 new를 통해 생성할 수도 없고, 다른 방법으로 만들어야 한다. Choreographer choreographer = Choreographer.getInstance(); 위와 같이 static함수를 호출하는 것으로 끝난다. 어짜피 화면에 그려지는 시간이라는 것은 정해진 거라 한 개만 있으면 충분하기 때문에 singleton방식으로 동작하게 만들어 두었고, 따라서 공유되는 자원이라 필요가 없어져도 일부러 삭제할 필요도 없다. 물론 최소한의 메모리는 차지하기 때문에 다음과 같이 하는 것으로 삭제작업을 하면 된다. choregrapher = null; Choreographer는 Looper를 이용하기 때문에 "Choreographer.getInstance()"를 호..
Java : Build.VERSION.SDK_INT NDK : int android_get_device_api_level() Android Version Table Version API Build.VERSION_CODES Name 커널 Exposed 1.0 1 BASE 2008/10 1.1 2 BASE_1_1 2009/2 1.5 3 CUPCAKE CupCake 2.6.27 2009/5 1.6 4 DONUT Donut 2.6.27 2009/9 2 5 ECLAIR Eclair 2.6.29 2009/10 2.0.1 6 ECLAIR_0_1 2.6.29 2009/12 2.1 7 ECLAIR_MR1 2.6.29 2010/1 2.2 8 FROYO Froyo 2.6.32 2020/6 2.3~2.3.2 9 GINGERB..
Single Thread에서 작업을 할 경우, 이 FenceSync라는 녀석은 필요가 없다. 하지만 이전에 포스트했던 shared Context를 사용할 경우 문제가 발생할 수 있다. 다음의 시나리오를 통해 발생할 수 있는 상황을 연출해보자. 이 전에 OpenGLES를 멀티 쓰레드로 사용하는 방법은 다음의 링크를 이용하기 바란다. jamssoft.tistory.com/227 안드로이드 NDK OpenGLES 초기화 및 Shared Context OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문 jamssoft.tistory.com Thread B에서 t..
OpenGLES 초기화는 자주하는 작업은 아니지만, 다시 하려고 하면 어떻게 하는지 까먹는 작업이라 이렇게 정리를 해둔다. NDK로 코드가 작성되었으며, 이게 우끼게도 Java는 다른 식으로 작성해야 문제가 없다. 초기화 순서 1. eglInitialize 2. eglBindAPI 3. eglChooseConfig 4. eglCreate(Window 또는 Pbuffer)Surface 5. eglCreateContext 6. eglMakeCurrent 초기화는 다음의 순서로 진행한다. 순서가 바뀔 수도 있지만, 필자가 가진 모든 기기에서 위 순서를 사용할 경우 문제 없이 잘 초기화가 되었다. 그리고, 아래의 설명은 필자가 그냥 경험으로 터득?한 것이라 틀린 부분이 많을 수 있다. 어짜피 초기화만 끝나면 신..
Java의 stream은 워낙 쓸일이 많기에 이런 저런 stream들이 많다. 그 중 byte[]와 가장 관련이 많은 ByteBuffer를 stream으로 변환을 하려면 InputStream, OutputStream의 몇가지 함수만 Override하면 사용할 수가 있다. 그리 어렵지도 않은 작업일 줄이라..(Java의 Stream을 필자는 너무 싫어해서..) OutputStream import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; public class ByteBufferOutputStream extends OutputStream { private ByteBuffer mBuffer; public Byte..
쓰레드를 생성 후 만들어진 쓰레드를 CPU의 특정 코어로 이동할 수 있다. 필자가 알기로는 쓰레드를 생성하면서 코어를 지정하는 방법은 없는 것으로 알고 있다. 따라서, 쓰레드를 만들고 만들어진 쓰레드를 특정 코어로 이동시키는 방식으로 사용해야 한다. 일단 이 작업을 하기 위해서는 NDK를 이용해야 한다. Java파트에서 지원하는 지는 모르겠지만, 지원하지 않는다는 가정하고 이 글을 작성한다. 안드로이드도 리눅스 커널을 사용하기 때문에 리눅스와 대부분 사용법이 동일하다. 이 작업을 하기위해서는 사전작업이 좀 필요한 데, 일단 시스템내에 core가 몇 개나 있는 지 알아야 하고, 어떤 녀석이 Big코어인지, Little코어인지도 구분을 해야 한다. 또한 현재 쓰레드가 어느 core에 할당되어 있는 지도 알아..
byte[]를 String으로 byte[] => String String s = new String(b, "UTF_8"); // b => byte[] String => byte[] String str = "한글"; byte[] bin = str.getBytes( "UTF-8" ); 넘길/넘어온 데이터에 따라 'UTF-8' or 'EUC-KR'을 넣어주면 된다. 이건 검색하면 쉽게 찾을 수 있다. 근데... 만약에 byte[]를 String으로 변환하는 과정에서 byte[]의 크기가 무지막지하게 크다면, 위의 방법은 그래 좋은 방법이 아니다. 사실상 텍스트 데이터는 그리 크지 않기에 그냥 처리해 위와 같이 처리하면 웬만하면 다 처리할 수 있다. 다시 하지만, 큰 데이터를 안 다룰 경우가 없지 않다는 것이 ..
소스코드 ByteBuffer, IntBuffer, FloatBuffer, DoubleBuffer, ShortBuffer, LongBuffer, CharBuffer.. 등에는 flip, compact, clear등에 함수가 있다. 근데, 이 flip, compact, clear는 도대체가 뭐 하는 녀석인지.. 알기가 어렵다. 답은 개발자 식으로 말하면 Producer-Consumer방식을 사용하기 위해 있는 것이다. 이 Buffer들은 읽기모드와 쓰기모드가 있다. 현재상태에 따라 해야하는 작업이 정해진다. 읽기모드일 경우는 말 그대로 읽기명령(get함수등)등을 써야 하며, 쓰기모드에서는 쓰기명령(put함수 등)으로 Buffer에 작업을 하면 된다. 예로 이해하기 아주 간단한 예를 들어보겠다. Buffer에..
1. 안드로이드 http 다운로드하기( HttpURLConnection + SSL ) 2. 안드로이드 HttpUrlConnection 서버로 전송 #1 (기본편, x-www-form-urlencoded ) 3. 안드로이드 HttpUrlConnection 서버로 전송 #2 ( multipart/form-data ) multipart/form-data 1편에서 application/x-www-form-urlencoded방식을 설명했다. 이 방식의 가장 큰 문제 파일을 전송할 수 없다는 것이다. 파일을 전송하기위해서는multipart/form-data방식을 써야 한다. 이 방식의 전송데이터는 다음과 같이 생겼다. POST /test HTTP/1.1 Host: foo.example Content-Type: mu..
- Total
- Today
- Yesterday
- texture
- 텍스처
- 전기요금
- 아끼는 법
- 전기세
- 애드핏
- ComputeShader
- 경제보복
- 사용료
- Android
- 티스토리
- OpenGLes
- gpgpu
- 예금
- 컴퓨트셰이더
- 전기료
- 재태크
- 컴퓨트쉐이더
- TTS
- choreographer
- 금리
- 안드로이드
- 에어컨
- 적금
- 공유 컨텍스트
- 블로그
- 에어콘
- 애드센스
- OpenGL ES
- 재테크
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |