Metal의 쉐이더를 작성하기 위해 필요한 MSL에 대해 정리했습니다. 이 글을 보기 전에 이전 포스팅을 먼저 보면 좀 더 이해가 잘 될 수 있습니다. [Swift] Metal에 대해 알아보기 Metal을 공부하면서 정리한 내용입니다. Metal은 GPU에 접근할 수 있는 기능을 제공하여 빠른 그래픽 처리를 가능하게 하는 API입니다. OpenGL ES와 유사하지만 크로스 플랫폼이 아니라는 차이가 있고, jintaewoo.tistory.com 개요 Metal에서 쉐이더를 작성하려면 MSL(Metal Shading Language)을 사용해야 합니다. 쉐이더에서는 그래픽(vertex, fragment) 및 컴퓨팅(kernel) 처리를 할 수 있습니다. 렌더 파이프라인 렌더 파이프라인은 드로잉 명령을 처리하..
Metal을 공부하면서 정리한 내용입니다. Metal은 GPU에 접근할 수 있는 기능을 제공하여 빠른 그래픽 처리를 가능하게 하는 API입니다. OpenGL ES와 유사하지만 크로스 플랫폼이 아니라는 차이가 있고, 속도나 오버헤드 측면에서 Metal이 더 좋은 성능을 가지고 있습니다. SpriteKit, SceneKit, Unity and Metal Metal은 OpenGL ES와 비슷한 저수준 3D 그래픽 API로 GPU 위에 있는 레이어입니다. 2D, 3D 모델을 렌더링 하려면 모든 작업에 대한 코드를 작성해야 합니다. 반대로 SpriteKit, SceneKit, Unity는 상위 레벨 프레임워크로 Metal, OpenGL ES와 같은 하위 레벨 그래픽 API 위에 구축이 되어 있습니다. Metal ..
Firabase Analytics 를 적용하면서 정리한 내용의 포스팅입니다. Analytics는 사용자가 앱에서 수행 중인 작업을 추적하고 분석할 수 있도록 도와주는 서비스입니다. 이벤트 설정을 자세하게 할수록 정확하게 사용자의 행동을 이해할 수 있습니다. 이러한 정보의 정확성이 중요하기 때문에 개발 및 테스트 할 때의 데이터가 실제 사용자의 데이터에 포함되어 있으면 정확한 정보가 오염되게 됩니다. 이를 위해서 개발과 프로덕션 환경을 나눠서 Firebase를 적용하려고 합니다. 제 경우에는 Firebase Crashlytics를 추가로 적용하는데 아래와 같은 에러가 발생했습니다!! Error: Could not get GOOGLE_APP_ID in Google Services file from build..
reaml의 결과 데이터는 항상 최신 데이터를 반환합니다. 즉, 결과를 다시 로드할 필요가 없습니다. 하지만 데이터와 다르게 UI는 자동으로 없데이트 되지 않기 때문에 수동으로 업데이트해줄 필요가 있습니다. 수동으로 업데이트하기 위해서는 데이터가 변견된 시점을 알아야 되는데, 이 문제를 Notification 으로 해결할 수 있습니다. Result 객체에 Notification을 설정하면, 해당 객체를 관찰하면서 데이터의 변경이 발생할 때 호출되어 변경 시점을 알 수 있습니다. 그럼 바로 코드로 알아 보겠습니다! 아래는 user 데이터를 반환받은 결과 객체에 관찰자(observer)를 설정하는 코드입니다. let tableView = UITableView() var users: Result? var no..
Realm을 적용하면서 공부한 내용을 잊기 전에 정리해 봅니다... - 정의 Realm은 모바일에 최적화된 크로스 플랫폼 모바일 데이터베이스로, SQLite 및 Core Data의 대안입니다. zero-copy design으로 설계되어 있어 ORM보다 훨씬 빠르며, 종종 raw SQLite보다 빠릅니다. - zero-copy design 접근자 메서드를 호출하면 데이터베이스에서 read/write 할 수 있는 프록시 객체(쿼리 결과)를 반환받게 됩니다. 각 프록시 객체(쿼리 결과)는 데이터를 바라보고 있기 때문에 데이터베이스의 모든 변경 내용은 동일한 데이터를 가리키는 모든 객체에 반영됩니다. 때문에 새롭게 프록시 객체(쿼리 결과)를 가져올 필요가 없습니다. Realm은 일반적으로 이런 동작을 zero-..
여러개의 git 계정을 사용하다보면 push/pull을 할 때 충돌하는 경우가 생깁니다. 그럴때마다 아래와 같이 접근권한에 대한 에러 메시지가 나옵니다.... Permission to (repositoryName) denied to (userName) 새 프로젝트를 생성할 때마다 발생되서 잊지 않게 정리하려고 합니다. 해당 내용은 Mac을 기준으로 작성했습니다. 그럼 ssh 프로토콜을 사용해서 인증을 해보겠습니다. 1. 키 생성 우선 ssh-key가 없는 경우, 키를 생성해야합니다. 터미널을 열고 아래와 같이 명령어를 작성합니다. 이메일은 자신의 github 주소로 대체해 줍니다!! $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 명령을 입력하면 아래와..
이 글은 레코딩 기능을 하는 화면을 구현하면서 정리한 내용입니다. 1. captureSession 생성 세션은 입력에서 출력 장치로의 데이터 흐름을 제어하는데 사용됩니다. 간단히 아래와 같이 초기화 할 수 있습니다. let captureSession = AVCaptureSession() captureSession.sessionPreset = .high sessionPreset은 비디오 및 오디오의 녹화 품질을 설정하는 속성입니다. 저품질로 할 경우 배터리 소비량이 낮아집니다. 2. captureDevice 생성 세션을 생성되면 이제 사용하려는 장치(카메라 or 마이크)를 정의합니다. 영상을 녹화할 것이기 때문에 AVMediaType은 video로 설정하고, DeviceType은 원하는 타입을 선택하여 설..
단위 테스트를 처음 작성해 본 경험을 정리해보려고 한다. 단위 테스팅은 개발 초기에 문제를 파악하고 구현할 수 있도록 도와준다. 또한 작성된 테스트 코드로 인해 예상되는 동작이 중단되지 않을 것이라는 확신을 줌으로써 추후 코드 변경에 용이하다. 일단 테스트 코드를 작성하기 위한 설정부터 시작해 보자. 첫 번째는 프로젝트를 생성할 때 추가하는 방법과 두 번째로는 진행중인 프로젝트에 추가하는 방법이 있다. 첫 번째 방법은 간단하다! 아래와 같이 Include Unit Tests를 체크하고 프로젝트를 생성하면 알아서 만들어준다. 두 번째 방법도 간단하다!! Navigator View에서 6번째 탭을 선택하면 아래와 같은 화면이 나오는데, 좌측 하단에 +버튼을 누르고 New Unit Test Target을 눌러..
여러 method를 보면 클로저의 타입에 @escaping이란 단어가 붙어 있는게 종종 보입니다. 이게 뭔지 궁금했는데 이제야(?) 알아보려고 합니다!! 그 전에 먼저 @noescape 키워드 부터 알아 보겠습니다. 아래는 공식 문서의 예제 코드입니다. func someFunctionWithNonescapingClosure(closure: @noescape () -> Void) { // 2. do something... // 3. 클로저가 실행된다. closure() } class SomeClass { var x = 10 func doSomething() { // 1. 클로저를 함수의 인자로 전달한다. someFunctionWithNonescapingClosure { x = 200 // 4. 클로저가 종..
Optional은 아래와 같이 enum으로 구현되어 있습니다. enum Optional { case none case some() } optional의 타입은 generic이라 Int, String 등 어떤 타입도 들어갈 수 있습니다. optional에는 두가지 경우가 있는데, none은 아직 설정되지 않은 경우이고 some은 그 타입의 값을 가지고 있다는 의미입니다. optional은 enum이지만 enum으로 사용하지 않는 이유는 optional을 사용할 때마다 switch문을 사용하여 값을 얻어야 합니다. 그러면 코드도 길어지고 복잡해 질 것입니다. 그래서 ?, !, ??, if 등으로 쉽게 표기하게 만들고 내부적으로는 enum으로 작성된 optional 코드가 실행되는 것입니다. var hello..
- Total
- Today
- Yesterday
- NIB
- Coordinator
- AVKit
- Swift
- UIBarButtonItem
- m3u8
- AssociatedObject
- pagingView
- HLS
- customAlertView
- CollectionView
- UIButton
- permission error
- Cleancode
- AVFoundation
- Video
- Realm
- ssh
- RECORDING
- carousel
- BaseViewController
- database
- IOS
- testing
- Design Pattern
- Closure
- http live streaming
- TDD
- UIControl
- xib
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |