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..
화별 화 내용 142화 미국에 도착한 성진우 미국은 성진우를 끌어들이기 위해 카미쉬의 마정석으로 유인함, 하지만 오히려 카미쉬의 사체에 관심을 보이게 된다. 미국헌터관리국의 카미쉬를 그림자 병사로 추출하는 성진우 143화 카미쉬 그림자를 추출한 성진우, 카미쉬는 하나인 용제( 아홉군주 중 한 명)를 모셨던 용임, 하지만 그림자추출이 너무 늦게 되는 바람에 무로 돌아감. 카미쉬의 말에 따르면 지배자들의 힘을 빌린 인간은 모두 넷. 유진호는 황동수에가 납치가 되고 만다. 144화 성진우를 건드릴 생각이 없었던 황동수, 어짜피 사실을 아는 유진호가 있기 때문에... 그림자 병사를 풀어 유진호를 찾던 중, 그림자 오크가 발견, 그리고 그림자교환. 황동수와 성진우의 싸움이 막 시작된다. 145화 2021-03-2..
쓰레드를 생성 후 만들어진 쓰레드를 CPU의 특정 코어로 이동할 수 있다. 필자가 알기로는 쓰레드를 생성하면서 코어를 지정하는 방법은 없는 것으로 알고 있다. 따라서, 쓰레드를 만들고 만들어진 쓰레드를 특정 코어로 이동시키는 방식으로 사용해야 한다. 일단 이 작업을 하기 위해서는 NDK를 이용해야 한다. Java파트에서 지원하는 지는 모르겠지만, 지원하지 않는다는 가정하고 이 글을 작성한다. 안드로이드도 리눅스 커널을 사용하기 때문에 리눅스와 대부분 사용법이 동일하다. 이 작업을 하기위해서는 사전작업이 좀 필요한 데, 일단 시스템내에 core가 몇 개나 있는 지 알아야 하고, 어떤 녀석이 Big코어인지, Little코어인지도 구분을 해야 한다. 또한 현재 쓰레드가 어느 core에 할당되어 있는 지도 알아..
탁상달력도 비싼 세상이라 어쩔 수 없이 만들어 버렸습니다. 아주 심플해서 집중도가 좋습니다(?). 근데 이 걸 "다른 분들도 쓰면 좋겠다."라는 생각이 들어 pdf로 만들어 올리기로 했습니다.스프레드시트 프로그램에서 인쇄 장치를 [Microsoft Print to PDF] 선택하여 출력을 해 pdf를 생성했습니다. 뭐.. 잘 만들어 지더군요. 혹시나 달력 없으시면 jamssoft.tistory.com/223 2021년 탁상용 달력 입니다. 프린트해서 쓰세요. 특징 24절기 표기 15일 단위 음력표기 초중말복 표기 2022년 1월 포함 자르는 선 표기 이미지 없음(크기기 작음) 좋은 문구 포함 만드느라 꽤 힘들었음 달력 다운로드 오류가 있으면 댓글 부탁드립 jamssoft.tistory.com 생각해보니,..
블로그에 위와 같은 다이아그램을 쉽게 만들 수 있는 사이트주소가 다음과 같이 바뀐 듯 합니다. app.diagrams.net Flowchart Maker & Online Diagram Software Flowchart Maker and Online Diagram Software diagrams.net (formerly draw.io) is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPM app.diagrams.net 웹상에서 바로 그려서 ..
해외에서 극찬을 했다는 무선 블루투스이어폰은 공동구매를 통하여 싸게 구입하였다. 이미 블루투스 리시버가 7개이상있는 필자에게 또 구매를 한다는 것은 상당히 망설여지는 부분이었다. 아무리 인플루언서들이 좋다고 해도 실제 사서 들어보면 이미 가지고 있는 것보다 좋지 못한 경우가 자주 발생했을 뿐만아니라, 떄로는 극찬에 극찬한 제품도 정작 들어보면 실망을 금치 못할 때도 많았다. 심지어는 비싸기까지 한 녀석들도 있었다. 한번 더 속는 셈치고 살까 말까 고민을 상당히 했지만, 역시 지름신의 손이 스쳐지나가고 말았다. 음질 - 잘 잡은 톤-밸런스 완전한 Flat한 소리는 아니지만, Flat한 소리라고 봐도 될 정도다. - 상당히 높은 해상도 코러스가 잘 들린다. 보통 보급기에서는 코러스가 있었는지 모를 경우가 더..
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
- 안드로이드
- 전기료
- OpenGLes
- 컴퓨트쉐이더
- 사용료
- 공유 컨텍스트
- 경제보복
- 블로그
- Android
- 적금
- 예금
- 재테크
- 텍스처
- 재태크
- ComputeShader
- 아끼는 법
- 애드핏
- 에어콘
- texture
- 에어컨
- 금리
- OpenGL ES
- 컴퓨트셰이더
- 전기세
- 티스토리
- TTS
- gpgpu
- 애드센스
- 전기요금
- choreographer
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |