번역서 "DirectX 12를 이용한 게임 프로그래밍 입문" 나왔습니다.

류광, 2017/06/08 17:59
번역서 "DirectX 12를 이용한 3D 게임 프로그래밍 입문" 출간 소식입니다.

저번 주에 나왔는데 소식이 조금 늦었습니다. 바로 GPG 카탈로그 갱신하고 글을 올리려고 했는데, 이런 저런 일로 좀 지연되었습니다.

DirectX 12를 이용한 3D 게임 프로그래밍 입문

DX11 입문서와 마찬가지로, 이 책에 대한 독자 지원은 GPG 카탈로그에서 진행하겠습니다. 카탈로그 페이지는 http://www.gpgstudy.com/catalog/introdx12입니다.

독자 증정 이벤트도 있는데요. 역시 저번 DX11 입문서처럼 GpgStudy.com에서 진행할 계획입니다. 구체적인 일정과 방식이 결정되면 그 곳에 공지하고, 이 글에 댓글을 달겠습니다(이 블로그에 따로 글을 올리지는 않고요).

이 책을 계기로 DirectX 12에 대한, 더 나아가서는 기성 엔진에 구속되지 않는 좀 더 광범위하고 유연한 게임 그래픽 프로그래밍에 대한 논의와 공유가 활발해지길 기대합니다.

top
TAG 번역서
트랙백 0 : 의견 # + 0

근황 - 2017-05-19

류광, 2017/05/19 13:09
DirectX12 입문서, C++ 표준 라이브러리 요약서, 그리고 공구리 수학.

저번 달 말에 Introduction to 3D Game Programming with Direct3D 12의 교정을 마무리했습니다. 아마 이번 달 안에 책이 나올 것입니다.

그리고 저번 주에는 C++ Standard Library라는 약 200페이지짜리 책의 2차 교정을 마쳤습니다(번역서는 260여 페이지). 저자는 Rainer Grimm이라는 독일인인데 아마 많이들 생소하실 겁니다. 오히려 저자의 블로그 Modernes C++가 더 유명할 수도 있겠네요(특히 r/cpp 보시는 분들). 분량에서 짐작하듯이, “C++ 표준 라이브러리의 주요 구성요소를 간결하게 훑어보고 참조할 수 있게 하는” 것이 목표인 간결할 책입니다. 원서는 C++11과 C++14의 변화를 충실히 반영했고, 번역서에는 C++17의 표준 라이브러리를 다루는 부록도 추가되었습니다.

지금은 그레이엄, 커누스, 파타슈닉(GKP)의 Concrete Mathematics 2nd를 번역하고 있습니다. 8월 말 탈고 예정입니다. 어쩌면 저번 TAOCP 때처럼 질문을 올리게 될지도 모르겠습니다. 미리 공부한 분들의 관심을 부탁 합니다(꾸벅).

top
트랙백 0 : 의견 # + 0

C++17 표준 라이브러리의 std::optional 소개

류광, 2017/04/18 13:02
이번 글에서는 C++17 표준 라이브러리의 std::optional을 소개합니다.

프로그래밍에서 다음과 같은 시나리오가 흔히 발생합니다.

  1. 실패할 수 있는 어떤 연산을 수행하는 함수를 호출한다.
  2. 연산이 성공했으면 함수가 돌려준 결과를 사용하고, 실패했으면 다시 시도하거나 오류로 처리한다.

이러한 시나리오를 구현하려면, 함수가 두 가지 결과를 돌려주어야 합니다. 하나는 연산의 성공 여부이고, 또 하나는 연산의 결과(성공의 경우)입니다. 그런데 C++에서 함수는 많아야 하나의 값만 돌려줄 수 있습니다. 여러 개의 값을 돌려주려면 소위 ‘출력 매개변수’를 이용하거나, 아니면 여러 개의 값을 하나의 객체(이를테면 std::pair)에 담아서 돌려주어야 합니다. 예를 들어 어떤 정수 옵션 값을 조회하는 함수라면,

// 반환값은 성공 여부이고, 실제 결과는 val에 설정됨.
bool get_option(const std::string& name, int& val);

이나

// pair.first는 성공 여부, pair.second는 실제 값.
std::pair<bool, int> get_option(const std::string& name);

같은 형태가 될 것입니다. 그런데 전자는 구문이 다소 번잡하고, 후자는 연산 실패 시에도 pair의 둘째 요소를 생성해야 하므로 비효율적입니다(int 대신 덩치 큰 객체라면 그 차이가 의미가 있습니다).

또 다른 옵션은 실패 시 함수가 예외를 던지는 것인데, 지금 예처럼 사용자의 실수가 얼마든지 예상되는, 즉 실패가 일상적인 상황에 예외를 사용하는 것은 뭔가 좀 과하지 않나 싶습니다.

이상의 옵션들보다 좀 더 깔끔하고 편리한 수단이 바로 C ++17에서 표준 라이브러리에 추가된 std::optional입니다. 이것을 사용하면 이런 코드가 가능합니다.

std::optional<int> get_option(const char* name)
{
    // options는 이름-값 쌍들을 담은 전역 std::map 객체라고 가정.
    auto match = options.find(name);
    if(match != options.end()) {
         return match->second;
    } else {
         return {};
    }
}

void f()
{
    auto val = get_option("WIDTH");
    if (val) {
        std::cout << "창 너비:" << *val << std::endl;
    } else {
        std::cout << "설정 파일 오류" << std::endl;
    }
}

get_option()은 옵션 값을 찾았으면 그 값(int)을 돌려주는데(return match->second;), std::optional<T>에는 const T&&를 받는 생성자가 있으므로 결과적으로 std::optional<int> 객체가 반환됩니다. 찾지 못한 경우에는 else 절의 return {}이 실행되며, 그러면 빈(자료가 없는) std::optional 객체가 반환됩니다. 이때 자료(지금 예에서는 int 값)는 생성되지 않습니다. 만일 pair<bool, T>를 사용했다면, 쓸데없이 T 객체를 생성해야 했겠죠.

f()if (val) ... 에서 보듯이, 부울 값을 요구하는 문맥에서 std::optional 객체 자체는 하나의 부울 값(실제로 자료가 있는지의 여부를 나타내는 )으로 평가됩니다. 객체에 담긴 자료는 앞의 예제의 *val처럼 역참조를 통해서 얻을 수도 있고, val.value()처럼 멤버 변수 value()로 얻을 수도 있습니다.

부울 값을 요구하는 문맥이 아닌 상황에서 명시적으로 부울 값을 얻고 싶다면(이를테면 형식 연역을 위해) 멤버 함수 has_value()를 사용하면 됩니다. 다음이 그러한 예입니다.

auto val = get_option("WIDTH");
auto r1 = val; // r1은 val의 복사본(std::optional<int> 객체).
auto r2 = val.has_value(); // r2는 bool.

*val 같은 역참조 외에, operator->를 통해서 자료의 멤버들에 접근할 수도 있습니다. opt_strstd::optional<std::string> 객체라고 할 때, opt_str->size()opt_str에 담긴 문자열의 길이를 돌려줍니다. 그렇다고 포인터의 모든 의미론을 지원하는 것은 아닙니다. 예를 들어 opt_str++는 불가능합니다.

앞에서 말한 시나리오는 약간 다른, 다음과 같은 시나리오도 흔히 발생합니다(옵션 값 조회라면 이 시나리오가 더 현실적입니다).

  1. 실패할 수 있는 어떤 연산을 수행하는 함수를 호출한다.
  2. 연산이 성공했으면 함수가 돌려준 결과를 사용하고, 실패했으면 미리 설정된 기본값을 사용한다.

std::optional은 이런 시나리오를 위한 수단도 제공하는데, 바로 멤버 함수 value_or()입니다. 이를테면 다음과 같은 코드가 가능합니다.

// 설정 파일에서 창의 너비 값을 가져와서 설정하되,
// 만일 설정된 값이 없으면 기본값인 800으로 설정한다.
window.set_width(
    get_option("WIDTH").value_or(800)
);
top
트랙백 0 : 의견 # + 0

C++17 표준 라이브러리의 std::string_view 소개

류광, 2017/04/07 18:20
조만간 공식화될 C++17에 추가된 std::string_view를 소개합니다.

본문 열기

top
트랙백 0 : 의견 # + 0

웹 항해일지, 2017-03-16

류광, 2017/03/16 14:58
오랜만에 웹 항해일지 하나 올립니다.

본문 열기

top
트랙백 0 : 의견 # + 0

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [59] : NEXT ▶