postgame

사이토나카기의 [잘그리기 금지]를 읽었습니다.

솔직히 평하자면, 별다른 내용은 없어요. 자기개발서 내용이 대부분 비슷비슷하거든요.

자신의 분야를 즐겁게 그리자는 제목 자체는 마음에 듭니다.

그림 커뮤니티 내용을 좀 보면, 대부분 강박적으로 해야 실력이 좋아진다는 내용이 대부분인데요.

그말이 맞다고 해도, 기왕이면 긍정적인게 낫죠.

사이토나카기한테는 미안하지만, 유튜브 내용 그대로기 때문에 굳이 책이 필요한가 싶긴해요.  

Posted by totori_

국내에선 이책 절판된지 10년도 넘을겁니다. 무려 2006년에 발매된 책이에요.

책장에서 먼지만 쌓이고 있다가, 얼마전에 책 정리하다가 마저 읽었네요.

 

이책은 수학,물리학부터 전통적인 fsm, a*, 퍼지논리까지 

게임 ai에 관련된 거의 대부분을 다루고 있습니다.

 

요새 ai면 그냥 딥러닝만 이야기하는데, 게임쪽에선 딥러닝이 쓰이는 곳이 마땅치 않습니다.

바둑말고 쓰인데가 있을까요?

 

워낙 오래된 책이라 요새 vs로 빌드하려면 약간의 수정을 해줘야합니다.

세월에 따라 stl 규칙도 변했다는걸 알수 있죠.

스크립트에 대해선 루아를 다루고 있는데요.

요새는 루아를 쓰려고 하는 곳이 거의 없습니다만, 책에서 사용되는 기초기술은 여전히 유효하고

뼈와 살이 되는 기술들이죠.

 

한때는 필독서로 분류되곤 했는데, 요새는 그런 개념도 없어져서 좀 아쉽네요.

유튜브에 떠도는 정보들은 너무 파편화가 많이 되어 있어요.

 

 

 

 

 

 

 

 

 

 

Posted by totori_

신박한 c++20 2/2

review/major 2020. 12. 17. 12:07

5. Designated initializers

 

20에서는 생성과 동시에 값 대입이 더욱 쉬워졌습니다.

------------------------

#include <iostream>

using namespace std;

 

struct A {

    int x;

    int y;

    int z;

};

 

int main()

{

    A a1{ .x = 3, .y = 5, .z = 4 };

    getchar();

}

------------------------

 

일부 멤버변수 빼고 해도 됩니다.

------------------------

int main()

{

    A a1{ .x = 3, .z = 4 };

    getchar();

}

------------------------

 

다만 순서가 틀리면 빌드가 되지 않습니다.

------------------------

int main()

{

    A a1{ .z = 3, .x = 4 };  <-- 에러

    getchar();

}

------------------------

 

뭔가 대단한 기능은 아니지만, 

c++도 문법 슈가를 꾸준히 개선중인 것으로 보입니다.

 

6. Contracts

 

우리는 버그를 찾기 위해 assert를 사용합니다.

------------------------

void foo(int i)

{

    assert(i > 10);

}

------------------------

 

11에선 컴파일 타임에서 사용되는 static_assert도 추가됬는데,

20에서는 함수 사전조건과 사후조건을 체크할 수 있는 문법이 검토중입니다.

 

------------------------

auto push(queue<int>& qint val

  [[ expectsval > 0 ]]  //사전조건

  [[ ensures !q.empty() ]] //사후조건

  { 

      q.push()

  [[assertq.size() > 2]]    //assert 

    return q.size();

}

------------------------

요건 아직 vs에서 컴파일은 되지 않아요.

 

7. Ranges 라이브러리 추가

 

20부터는 ranges라이브러리가 도입되서 좀더 간결한 사용이 가능해졌어요.

 

------------------------

using namespace ranges;

vector<int> v = view::iota(0,10);   //v를 0으로 10개를 채워라

------------------------

 

자바의 stream처럼 함수형 기차길도 만들수 있습니다.

 

-----------------------

auto sq = [](int n) { return n*n;};

std::vector<int> v = view::iota(0,10) | view::transform(sq);

-----------------------

 

좀더 복잡한 예제

-----------------------

vector<int> v = 

    view::iota(0,15) |          //0으로 15개를 채워서

    view::group_by(quotient) |  //quotient 함수로 그룹을 나눈후

    view::transform(sum);       //sum함수로 변환해 v를 돌려줘라

 

auto quotient = [](int aint b){

    return a/5 == b/5;

}    

auto sum = [](auto rng){

    return ranges::accumulate(rang, 0);

}

-----------------------

 

여기저기 찾아보면 vs에서 nuget으로 clang을 설치하고 컴파일하면 된다는 이야기는 있는데, 

제가 해본 봐론 안됩니다. --;;

하지만 요런 모양이 된다는 점은 알수가 있죠.

 

8.코루틴

 

드디어 c++에서도 코루틴이 들어왔습니다.

유니티에서 코루틴이 쓰이지 시작하면서 

코루틴은 더이상 새삼스러운 기능은 아닙니다.

다만, c++20에서 정식 문법으로 편입되기 시작한거죠.

 

-----------------------

auto example(){

    puts("step 1");

    co_await std::experimental::suspend_never();

    puts("step 2");

}

 

int main()

{

    example();

    puts("step 3");

    getchar();

}

---------------------

 

두둥... 우리가 익히 알고있는 그 코루틴이 되겠습니다.

물론 리턴값이 있는 yield도 있습니다.

 

--------------------

generator<intiota(int n = 0) {

  while(true)

    co_yield n++;

}

--------------------

 

요것도 아직까진 vs에서 빌드되진 않습니다.

 

그외

 

8.reflection 

c++에서도 리플릭션이 표준스펙으로 들어온답니다.

9.Networking TS

Boost.ASIO기반으로 소켓 라이브러리가 추가된다고 합니다. 이제야?

10. parallelism ts v2

java는 8에서 이미 도입된 병렬처리가 표준 문법으로 편입. 여러모로 c++도 열심히 따라가고 있어요.

 

그외 왕창 더 있습니다만, 걍 마음대로 골라봤습니다.

물론 아직 20이 확정되서 사용되기 시작하려면 좀 걸리겠지만,

모양새만 봐도 정말 많이 바뀌고 있다는 생각이 드는군요.

 

Posted by totori_