<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>EMSTONE Bebop &#187; Clutter</title>
	<atom:link href="http://bebop.emstone.com/tags/clutter/feed/" rel="self" type="application/rss+xml" />
	<link>http://bebop.emstone.com</link>
	<description>엠스톤 개발팀 블로그</description>
	<lastBuildDate>Sun, 29 Jan 2012 05:25:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
		<item>
		<title>ClutterGst 메모리 누수 디버깅</title>
		<link>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clutter-gst-memory-leak-debugging&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cluttergst-%25eb%25a9%2594%25eb%25aa%25a8%25eb%25a6%25ac-%25eb%2588%2584%25ec%2588%2598-%25eb%2594%2594%25eb%25b2%2584%25ea%25b9%2585</link>
		<comments>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=clutter-gst-memory-leak-debugging#comments</comments>
		<pubDate>Wed, 28 Sep 2011 10:20:29 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1809</guid>
		<description><![CDATA[최근 클러터를 이용한 프로그램을 개발하면서 메모리 누수 현상을 발견했습니다. 코드를 하나 하나 막아가면서 테스트를 한 결과 ClutterGstVideoSink 객체를 사용하지 않으면 메모리 누수가 발생하지 않았습니다. 하지만, 아무리 소스를 분석해도 원인을 찾아낼 수 없었고, 잘못된 부분도 없는 것 같았습니다. 물론 구글링을 해도, &#8230; <a href="http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/">Continue reading <span>&#8594;</span></a> <a href="http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=clutter-gst-memory-leak-debugging">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>최근 <a href="http://lethean.pe.kr/2011/09/15/note-about-using-clutter/">클러터를 이용한 프로그램을 개발</a>하면서 메모리 누수 현상을 발견했습니다. 코드를 하나 하나 막아가면서 테스트를 한 결과 <a href="http://developer.gnome.org/clutter-gst/1.3/ClutterGstVideoSink.html"><code>ClutterGstVideoSink</code></a> 객체를 사용하지 않으면 메모리 누수가 발생하지 않았습니다. 하지만, 아무리 소스를 분석해도 원인을 찾아낼 수 없었고, 잘못된 부분도 없는 것 같았습니다. 물론 구글링을 해도, 검색 실력이 미천한지, 답을 찾을 수 없었습니다.</p>
<p>그래서 결국 예전에 소개한 적 있는 <a href="http://lethean.pe.kr/2009/06/18/debugging-memory-leaks-with-tcmalloc-google-perftools/">구글 성능 도구(google-perftools)를 이용해 디버깅</a>을 했습니다. 그런데 문제는, <a href="http://www.archlinux.org/">아치 리눅스(Arch Linux)</a> x86_64 환경으로 개발 환경을 바꾸면서 메모리 프로파일 기능이 제대로 동작하지 않는다는 사실인데, 특히 메모리 누수 발생 지점을 정확하게 알기 위해서 필요한 함수 호출 백트레이스(backtrace) 정보가 추출되지 않는 게 가장 큰 문제였습니다. 이 문제를 해결하기 위한 과정을 기록으로 남겨봅니다.</p>
<p><strong>구글 성능 도구 설치</strong></p>
<p>아치 리눅스(Arch Linux) x86_64 환경에서 구글 성능 도구(google-perftools)가 정확한 메모리 프로파일 결과를 얻으려면 <a href="http://www.nongnu.org/libunwind/">libunwind</a> 라이브러리를 설치해야 하는데, 아치리눅스 <a href="https://wiki.archlinux.org/index.php/AUR">AUR</a> 패키지를 <a href="https://wiki.archlinux.org/index.php/Yaourt">yaourt</a>를 이용해 다음과 같이 쉽게 설치했습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ yaourt <span style="color: #660033;">-S</span> libunwind</pre></div></div>

<p>그리고 다음과 같이 구글 성능 도구를 빌드하고 설치합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> google-perftools
$ .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr <span style="color: #660033;">--enable-frame-pointers</span>
$ <span style="color: #c20cb9; font-weight: bold;">make</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p><strong>라이브러리 패키지 재생성 및 재설치</strong></p>
<p>정확한 함수 호출 백트레이스(backtrace) 정보를 얻기 위해 프로그램에 사용되는 모든 라이브러리를 다시 컴파일해 패키지를 다시 설치해야 하는데, 그 과정은 다음과 같습니다. (<a href="https://wiki.archlinux.org/index.php/Debug_-_Getting_Traces">관련 위키 페이지</a> 참고)</p>
<p>먼저 아치 리눅스 빌드 시스템(ABS) 정보를 동기화합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> abs</pre></div></div>

<p>그러면 <code>/var/abs</code> 디렉토리 밑에 모든 공식 패키지의 빌드 정보가 다운로드됩니다.</p>
<p>라이브러리의 패키지 빌드 옵션을 수정하기 위해, <code>/etc/makepkg.conf</code> 파일에서 아래 부분을 찾아 디버그 심볼(<code>-g</code>)과 프레임 포인터 포함(<code>-fno-omit-frame-pointer</code>) 컴파일 옵션을 추가하고 빌드 옵션에서 <code>strip</code>을 제외합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-g -fno-omit-frame-pointer -march=x86-64 -mtune=generic -O2 -pipe&quot;</span>
<span style="color: #007800;">CXXFLAGS</span>=<span style="color: #ff0000;">&quot;-g -fno-omit-frame-pointer -march=x86-64 -mtune=generic -O2 -pipe&quot;</span>
<span style="color: #007800;">OPTIONS</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">!</span><span style="color: #c20cb9; font-weight: bold;">strip</span> docs libtool emptydirs zipman purge<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p><code>/var/abs/local</code> 디렉토리로 이동해서(없으면 새로 생성) 다음과 같이 사용되는 프로그램에 사용되는 모든 라이브러리 패키지를 다시 생성하고 설치합니다. 예를 들어 클러터 라이브러리는 다음과 같습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">src</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs <span style="color: #660033;">-name</span> clutter <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-r</span> <span style="color: #007800;">$src</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span>
$ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>abs<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>clutter
$ makepkg <span style="color: #660033;">-f</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pacman <span style="color: #660033;">-U</span> <span style="color: #000000; font-weight: bold;">*</span>.pkg.tar.xz</pre></div></div>

<p>위와 같은 방식으로 clutter, cogl, glib2, glibc 패키지를 다시 만들고 설치합니다.</p>
<p><strong>메모리 프로파일링</strong></p>
<p>이제 다음 명령으로 디버깅할 프로그램(<code>eview-demo</code>)을 실행합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">G_SLICE</span>=always-malloc \
  <span style="color: #007800;">HEAPPROFILE</span>=<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile \
  <span style="color: #007800;">HEAP_PROFILE_ALLOCATION_INTERVAL</span>=<span style="color: #000000;">10737418240</span> \
  <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libtcmalloc.so \
  .<span style="color: #000000; font-weight: bold;">/</span>eview-demo
Starting tracking the heap
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0001.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0002.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0003.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Dumping heap profile to <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0004.heap <span style="color: #7a0874; font-weight: bold;">&#40;</span>...<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>정상적으로 구글 성능 도구의 메모리 프로파일러가 동작하면 위와 같은 메시지가 출력됩니다. 이제 적당한 시점에서 프로그램을 멈추고, 다음과 같이 프로파일링 데이터를 분석합니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pprof \
    <span style="color: #660033;">--pdf</span> \
    <span style="color: #660033;">--lines</span> \
    <span style="color: #660033;">--base</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0001.heap \
    .<span style="color: #000000; font-weight: bold;">/</span>eview-demo \
    <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>profile.0004.heap \
    <span style="color: #000000; font-weight: bold;">&gt;</span> profile-<span style="color: #000000;">1</span>.pdf</pre></div></div>

<p>이렇게 생성된 그래프는 다음과 같습니다. (<a href="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile.pdf">PDF </a>형식도 있습니다)</p>
<p><a href="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile.jpg" rel="lightbox[1809]"><img class="aligncenter size-large wp-image-1810" title="clutter-1.6-memory-leak-profile" src="http://lethean.pe.kr/wp-content/uploads/2011/09/clutter-1.6-memory-leak-profile-1024x884.jpg" alt="" width="584" height="504" /></a></p>
<p>이 그래프를 분석해서 관련 코드를 분석해 보니, 결정적으로 두 군데에 문제가 있습니다. 첫번째는 <code>cogl_pipeline_fragend_arbfp_start()</code> 함수 내부에서 생성한 <code>arbfp_program_state</code> 객체를 해제하는 곳이 없다는 점이고, 두번째는 <code>cogl_pipeline_get_layers()</code> 함수에서 생성한 <code>deprecated_get_layers_list</code> 리스트를 해제하는 곳이 없다는 점입니다. 그런데 최근 클러터 1.8 버전 소스를 보면 두번째 문제는 해결이 된 것 같은데, 첫번째 문제가 있는 곳은 코드 수정이 많이 되어 해결 여부를 알 수가 없습니다.</p>
<p>그래서 결론은, 며칠 전에 릴리스된 클러터 1.8 안정 버전이 아치 리눅스 패키지로 올라오면 다시 메모리 누수 여부를 확인해볼 예정입니다. (GNOME 3 핵심 라이브러리를 직접 컴파일해서 사용하는게 귀찮기도 하고 두렵기도 해서입니다&#8230; :)</p>
<p><strong>[UPDATE 2011-10-04]</strong> 클러터 1.8 버전에서 확인해 보니 메모리 누수 문제가 해결된 것 같습니다. 역시, 미루기를 잘 했습니다. ;)</p>
<p><strong>[UPDATE 2011-10-05]</strong> 다시 확인해 보니, 이제는 다른 부분에서 메모리 누수가 발생합니다. 그래서 이번에는 당당히(?) 버그 리포팅(<a href="https://bugzilla.gnome.org/show_bug.cgi?id=660985">Bug 660985</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660986">Bug 660986</a>) 했습니다.</p>
<p><strong>[UPDATE 2011-10-10]</strong> CPU 사용량이 가장 많은 함수를 프로파일링하려면 다음과 같이 실행하면 됩니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #007800;">CPUPROFILE</span>=.<span style="color: #000000; font-weight: bold;">/</span>cpu.prof \
  <span style="color: #007800;">LD_PRELOAD</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>libtcmalloc_and_profiler.so \
  .<span style="color: #000000; font-weight: bold;">/</span>eview-demo</pre></div></div>

<p>정상적으로 종료한뒤 다음과 같이 CPU 사용량을 함수별로 프로파일한 그래프를 얻을 수 있습니다.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ pprof \
    <span style="color: #660033;">--pdf</span> \
    <span style="color: #660033;">--lines</span> \
    .<span style="color: #000000; font-weight: bold;">/</span>eview-demo \
    .<span style="color: #000000; font-weight: bold;">/</span>cpu.prof
    <span style="color: #000000; font-weight: bold;">&gt;</span> profile-<span style="color: #000000;">1</span>.pdf</pre></div></div>

<p><strong>[UPDATE 2012-02-04]</strong> 최신 아치 리눅스에 포함되어 있는 <a href="http://code.google.com/p/gperftools/issues/detail?id=396">glibc 2.15 버전의 버그</a> 때문에 프로파일링이 제대로 동작하지 않을 경우 <del datetime="2012-02-05T23:55:49+00:00"><a href="http://permalink.gmane.org/gmane.comp.lib.glibc.alpha/17093">sscanf 관련 패치</a>를 적용해 glibc 패키지를 다시 빌드하고 설치해야 합니다.</del> glibc 2.15-5 버전으로 업그레이드하면 됩니다. <a href="https://bugs.archlinux.org/task/28246">버그 리포팅</a>이 바로 반영되어 버렸습니다. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2011/09/28/clutter-gst-memory-leak-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>클러터(Clutter) 사용기</title>
		<link>http://lethean.pe.kr/2011/09/15/note-about-using-clutter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=note-about-using-clutter&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ed%2581%25b4%25eb%259f%25ac%25ed%2584%25b0clutter-%25ec%2582%25ac%25ec%259a%25a9%25ea%25b8%25b0</link>
		<comments>http://lethean.pe.kr/2011/09/15/note-about-using-clutter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=note-about-using-clutter#comments</comments>
		<pubDate>Thu, 15 Sep 2011 09:05:39 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1774</guid>
		<description><![CDATA[클러터(Clutter) 라이브러리를 이용하면서 부딪친 대부분의 문제는 성능과 관련된 것입니다. 클러터 라이브러리 자체가 느리다는 얘기가 아니라, 주로 개발하는 분야에서 요구되는 16채널 이상 다채널 라이브 / 녹화 동영상 재생을 구현할 때, 고사양 장비는 문제가 되지 않지만 저사양 임베디드 보드에서는 성능 저하가 발생하기 &#8230; <a href="http://lethean.pe.kr/2011/09/15/note-about-using-clutter/">Continue reading <span>&#8594;</span></a> <a href="http://lethean.pe.kr/2011/09/15/note-about-using-clutter/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=note-about-using-clutter">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.clutter-project.org/">클러터(Clutter)</a> 라이브러리를 이용하면서 부딪친 대부분의 문제는 성능과 관련된 것입니다. 클러터 라이브러리 자체가 느리다는 얘기가 아니라, 주로 개발하는 분야에서 요구되는 16채널 이상 다채널 라이브 / 녹화 동영상 재생을 구현할 때, 고사양 장비는 문제가 되지 않지만 저사양 임베디드 보드에서는 성능 저하가 발생하기 때문입니다. 하지만, 효율적인 2D 그래픽을 위한 3D 그래픽 라이브러리로서 클러터는 아직까지 만족스럽습니다. OpenGL 기반 라이브러리는 기존 2D 그래픽 라이브러리와 여러가지 기본 개념이 달라서, 저처럼 이쪽 세상에 입문한지 얼마 안되는 개발자는 많은 시행 착오를 겪을 수 밖에 없는데,  이미 사용해 본  <a href="http://www.gtk.org/">GTK+</a> / <a href="http://developer.gnome.org/gobject/stable/">GObject</a> 방식에 익숙한 점도 유리하게 작용했지만, 2D 그래픽 + 효과를 위한 약간의 3차원 API 조합은 복잡하고 어려운(&#8230;) 3D 라이브러리를 직접 사용하는 것보다 훨씬 수월했습니다.</p>
<p>아무튼 그래서, 지금까지 겪은 경험 중 몇 가지를 정리해 보았습니다. 당연하지만, 아직 OpenGL에 대한 이해가 부족해 틀린 내용이 있을 수도 있으니, 감안해 주시기 바랍니다.</p>
<p><span class="Apple-style-span" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">1.<br />
</span>클러터 라이브러리는 계속 버전업 되는데 예전에 작성된 튜토리얼이나 예제는 갱신되지 않아 잘못되거나 사용을 권장하지 않는(deprecated) API를 사용하는 경우가 많이 있습니다. 가능한 클러터 개발자들이 라이브러리와 함께 직접 업데이트하는 <a href="http://docs.clutter-project.org/docs/clutter-cookbook/1.0/">클러터 해설서(The Clutter Cookbook)</a>를 참고하는게 가장 정확했습니다.</p>
<p>2.<br />
OpenGL 기반 클러터 라이브러리 동작 방식은 일반적인 2D GUI 프로그래밍과 달리 화면, 즉 스테이지(stage)에 조그만 변화라도 있으면 그때마다 스테이지를 다시 그립니다. 즉, 클러터의 기본 단위인 액터(actor) 하나가 다시 그려져야 하면 액터가 속한 스테이지의 모든 액터를 다시 그립니다. 그리고 이로 인해 스테이지에 보이는 모든 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>paint()</code></a> 함수가 매번 호출되기 때문에 이 함수를 최적화하는 게 매우 중요합니다.</p>
<p>3.<br />
내부적으로 캐싱(caching)이 이용되긴 하지만, 한 액터의 좌표(크기 + 위치)가 변경되면 스테이지의 모든 액터의 크기를 다시 계산하기 위해 모든 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>allocate()</code></a> 함수가 호출됩니다. 예를 들어 텍스트(text) 액터 구현을 보면, 문자열이나 폰트, 크기 등이 변경되었을때 텍스트 액터를 포함하는 부모 컨테이너 액터가 변경된 크기를 감지하고 자신의 크기를 조정할 수 있도록 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-queue-relayout"><code>clutter_actor_queue_relayout()</code></a> 함수가 호출됩니다. 그리고, 이 함수가 호출되면 결국 스테이지 단계까지 호출이 계속된 다음, 다시 스테이지에 속한 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>allocate()</code></a> 함수가 재귀적으로 호출됩니다. 따라서 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>allocate()</code></a> 함수 역시 내부적으로 최적화되는 것이 좋습니다. 참고로 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-queue-relayout"><code>clutter_actor_queue_relayout()</code></a> 함수가 호출되면 자동으로 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-queue-redraw"><code>clutter_actor_queue_redraw()</code></a> 함수가 호출되어 스테이지의 모든 객체를 다시 그립니다.</p>
<p>4.<br />
클러터에서 기본으로 제공하는 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterBox.html">박스(ClutterBox)</a>, <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterGroup.html">그룹(CutterGroup)</a> 등과 같은 컨테이너 액터를 사용하지 않고 직접 컨테이너 액터를 구현해 자식 액터를 배치하고 싶거나 혹은 기존 컨테이너 액터를 상속받아 새 컨테이너 액터를 구현할 때가 있습니다. 그런데, 컨테이너 액터 좌표(크기 + 위치) 변경에 따라 자식 액터의 좌표를 자동으로 변경할 필요가 있으면 대개 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActor-allocation-changed"><code>"allocation-changed"</code></a> 시그널을 이용해 감지한 뒤 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-set-size"><code>clutter_actor_set_size()</code></a>, <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-set-position"><code>clutter_actor_set_position()</code></a> 함수 등을 이용해 자식 액터의 좌표를 조정하거나, <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterConstraint.html">제약(ClutterConstraints)</a> 기능을 이용하는데, 위에서 설명한 것처럼 좌표가 변환되면 자동으로 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-queue-relayout"><code>clutter_actor_queue_relayout()</code></a> 함수가 호출되면서 <em>&#8220;The actor &#8216;xxx&#8217; is currenty inside an allocation cycle; calling clutter_actor_queue_relayout() is not recommended&#8221;</em> 디버그 경고 메시지가 계속 출력됩니다. 메시지니를 무시할 수도 있지만, 문제는 한 액터의 좌표 변경으로 인해 매번 화면 전체가 다시 좌표를 다시 계산하기 때문에 결국 모든 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>allocate()</code></a> 함수가 계속 호출되면서 CPU 점유율이 매우 높아진다는 점입니다. 여기에 좌표를 이용한 애니메이션까지 사용하면 CPU 점유율은 상상을 초월할 정도로 올라갑니다. 이 문제를 해결하려면 반드시 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>allocate()</code></a> 함수에서 자식 액터의 좌표를 지정할때 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#clutter-actor-allocate"><code>clutter_actor_allocate*()</code></a> 종류의 함수만 이용해야 하고, 어쩔 수 없을 경우 <a href="http://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-idle-add-full"><code>g_idle_add_full()</code></a> 함수를 이용해 자식 액터 좌표 지정 루틴의 실행을 뒤로 조금 미룬 뒤에 좌표 중복 검사 등을 통해 가능한 화면 재구성(relayout) 작업이 덜 일어나게 해야 합니다. 메인루프 우선 순위는 <a href="http://docs.clutter-project.org/docs/clutter/stable/clutter-Events.html#CLUTTER-PRIORITY-EVENTS:CAPS"><code>CLUTTER_PRIORITY_EVENTS</code></a> 값을 사용하는 게 좋습니다.</p>
<p>5.<br />
<a href="http://docs.clutter-project.org/docs/clutter/stable/running-clutter.html">클러터 실행에 영향을 주는 환경 변수</a>를 이용하면 성능 조율 및 디버깅에 상당한 도움을 받을 수 있습니다. 예를 들어 <a href="http://wiki.clutter-project.org/wiki/ClutterProfiling#Are_you_drawing_actors_unnecessarily.3F"><code>COGL_DEBUG=rectangles</code></a> 이나 <a href="http://docs.clutter-project.org/docs/clutter/stable/running-clutter.html"><code>CLUTTER_DEBUG="paint layout"</code></a> 등은 도움이 많이 됩니다.</p>
<p>6.<br />
<a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterText.html">텍스트(ClutterText)</a> 액터의 위치가 정수가 아니라면, 즉 소수점 이하 값이 존재하는 실수일 경우  글꼴 선이 흐려지거나 뭉개지는 현상이 발생합니다. 텍스트 액터 뿐 아니라 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterRectangle.html">사각형(ClutterRectangle)</a> 액터처럼 그림이 아니라 직접 그려지는 액터들도 비슷한 현상이 발생합니다. 비단 액터의 위치가 정수일 지라도 이를 포함하는 상위 컨테이너 액터의 위치가 소수점 이하를 포함하는 실수일 경우, 즉 화면(stage)상 절대 좌표가 정수가 아닐 경우 이 현상이 발생합니다. 따라서 액터의 좌표를 계산해서 지정할 경우 반드시 <a href="http://www.manpagez.com/man/3/floor/"><code>floor()</code></a> / <a href="http://www.manpagez.com/man/3/ceil/"><code>ceil()</code></a> 등의 함수를 이용해 소수점 아래 값을 없애주는 것이 좋습니다.</p>
<p>7.<br />
액터에 배경 또는 테두리를 장식하고 싶을때 보통 떠오르는 구현 방법은 두 가지가 있습니다. 첫번째는 컨테이너 액터를 이용해 사각형 액터를 맨 아래 두고 대상 액터를 위에 두는 방법을 이용한 것이고, 두 번째는 이런 작업을 하는 커스텀 액터를 직접 구현하는 것입니다. 그런데 이보다 더 좋은 방법은, <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterEffect.html">효과(ClutterEffect)</a> 객체를 구현해서 사용하는 것입니다. 효과 객체가 액터 객체에 추가되면 효과의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterEffect.html#ClutterEffectClass"><code>pre_paint()</code> / <code>post_paint()</code></a> 함수가 액터의 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterActor.html#ClutterActorClass"><code>paint()</code></a> 함수 호출 전후에 자동으로 호출되므로, 동일한 디스플레이 루틴을 여러 객체에 쉽게 적용할 수 있습니다. 클러터에서 이미 기본으로 제공하는 <a href="http://docs.clutter-project.org/docs/clutter/stable/ch07.html">고급 효과</a>를 사용해도 되지만, 예를 들어 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterEffect.html">텍스트에 그림자를 넣어주는 예제</a>를 그대로 이용해 <a href="http://docs.clutter-project.org/docs/clutter-cookbook/1.0/effects-basic.html">테두리 효과</a>처럼 구현할 수도 있는 셈입니다.</p>
<p>8.<br />
클러터에서 직접 그리기 위해 사용하는 OpenGL 랩퍼 API <a href="http://docs.clutter-project.org/docs/cogl/stable/">Cogl</a> 함수를 사용할때 <a href="http://docs.clutter-project.org/docs/cogl/stable/cogl-Path-Primitives.html">경로(Path)</a> 등을 사용하지 않고 가능하다면 <a href="http://docs.clutter-project.org/docs/cogl/stable/cogl-Primitives.html">기본(Primitives) 함수</a>만 사용해서 구현하는게 성능이 좋습니다.</p>
<p>9.<br />
<a href="http://docs.clutter-project.org/docs/cogl/stable/">Cogl</a> 함수를 이용해 직접 그리는 방식과 모든 것을 그림 이미지로 처리하는 <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterTexture.html">텍스쳐(ClutterTexture)</a>를 이용하는 방식의 장단점을 아직 잘 모르겠습니다. 다만, 텍스쳐는 내부적으로 사용하는 메모리량이 더 많은 것이 분명하고, 현재 개발 중인 시스템에서는 수많은 채널의 비디오 동시 재생을 위해 어차피 많은 텍스쳐가 사용되기 때문에 가능한 텍스쳐 사용을 자제했습니다. 하지만 영역 크기에 따라 크기가 달라지는 GUI 부분을 구현할때는 이미지 기반 텍스쳐보다 일종의 벡터 그래픽이라고 할 수 있는 Cogl 함수를 이용해 직접 그리면 훨씬 깔끔한 GUI를 얻을 수 있는 것도 사실인 것 같습니다.</p>
<p>10.<br />
비디오 재생을 위해 <a href="http://developer.gnome.org/clutter-gst/1.3/ClutterGstVideoSink.html">비디오싱크(ClutterGstVideoSink)</a> 객체를 사용할 때 <a href="http://developer.gnome.org/clutter-gst/1.3/ClutterGstVideoSink.html#ClutterGstVideoSink--update-priority">갱신 우선순위 (<code>update-priority</code>)</a> 속성을 <a href="http://docs.clutter-project.org/docs/clutter/stable/clutter-Events.html#CLUTTER-PRIORITY-REDRAW:CAPS"><code>CLUTTER_PRIORITY_REDRAW</code></a> 값으로 낮추면 마우스 이벤트 반응 속도를 개선할 수 있습니다.</p>
<p>11.<br />
정말로 빈번한 애니메이션을 구현할때는, 사용하기 쉽지만, 내부적으로 수많은 객체가 생성되고 소멸되는 <a href="http://docs.clutter-project.org/docs/clutter/stable/clutter-Implicit-Animations.html#clutter-actor-animate"><code>clutter_actor_animate()</code></a> 대신, 번거롭지만, <a href="http://docs.clutter-project.org/docs/clutter/stable/ClutterTimeline.html">타임라인(ClutterTimeline)</a> 등을 이용해 구현하는게 CPU / 메모리 사용량을 줄이는데 도움이 됩니다.</p>
<p>12.<br />
AMD(ATI) 그래픽 카드를 장착한 리눅스 상에서 클러터를 실행할때 Catalyst 상용 X 드라이버와 최신 오픈소스 X 드라이버와 성능 차이가 거의 없어진 것 같습니다. 물론 NVidia는 상용 드라이버 성능이 월등이 더 좋고, 인텔 칩셋은 오픈 소스 드라이버만 있고 성능도 좋습니다.</p>
<p>이해에 도움이 될까 싶어, 아직 프로토타입이고 많은 기능이 빠져있지만, 현재 개발 중인 시스템의 동작 화면을 녹화한 영상을 보여드립니다. 녹화에 사용한 프로그램은 <a href="http://recordmydesktop.sourceforge.net/about.php">gtk-recordMyDesktop</a>입니다.</p>
<p><iframe src="http://www.youtube.com/embed/1w0fjm0MYo8?hl=en&amp;fs=1" frameborder="0" width="425" height="349"></iframe></p>
<p>GUI 프로그래밍을 할 때마다 느끼는 점은 구현하기 위한 기술도 중요하지만, 결국 사용자를 배려하면서도 아름다움을 잃지 않는 참신한 아이디어 기반의 디자인이 더 중요하다는 점입니다. 물론 그렇기 때문에 디자이너라는 직업이 따로 있는 것이겠지만, 좋은 프로그램과 삶의 다양한 모습을 많이 보고, 많이 경험하고, 많이 참고해야 하는 지적 즐거움을 언제부터인가 프로그래머들은 남의 영역이라 멀리한 채 무미건조한 기술에만 전념하고 있는 건 아닌지 모르겠습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2011/09/15/note-about-using-clutter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GNOME 개발 설명서 / 동영상</title>
		<link>http://lethean.pe.kr/2011/07/15/gnome-development-screencasts-and-tutorials/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gnome-development-screencasts-and-tutorials&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gnome-%25ea%25b0%259c%25eb%25b0%259c-%25ec%2584%25a4%25eb%25aa%2585%25ec%2584%259c-%25eb%258f%2599%25ec%2598%2581%25ec%2583%2581</link>
		<comments>http://lethean.pe.kr/2011/07/15/gnome-development-screencasts-and-tutorials/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gnome-development-screencasts-and-tutorials#comments</comments>
		<pubDate>Fri, 15 Jul 2011 10:39:08 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[GStreamer]]></category>
		<category><![CDATA[GTK+]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1741</guid>
		<description><![CDATA[오랜만에 GNOME 개발자 센터를 들어갔더니, 모양 뿐 아니라 내용도 확 바뀌어 있습니다. 예전에도 있었는데 제가 몰랐던 건지도 모르지만, 10분짜리 설명서(10-minute tutorials)가 가장 먼저 눈에 띄었습니다. (접속한 페이지의 실제 이름은 GNOME 개발자 플랫폼 데모입니다) 이미지 보기, 기타 튜너, 메시지 보드 등과 같은 &#8230; <a href="http://lethean.pe.kr/2011/07/15/gnome-development-screencasts-and-tutorials/">Continue reading <span>&#8594;</span></a> <a href="http://lethean.pe.kr/2011/07/15/gnome-development-screencasts-and-tutorials/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=gnome-development-screencasts-and-tutorials">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>오랜만에 <a href="http://developer.gnome.org/">GNOME 개발자 센터</a>를 들어갔더니, 모양 뿐 아니라 내용도 확 바뀌어 있습니다. 예전에도 있었는데 제가 몰랐던 건지도 모르지만, <a href="http://developer.gnome.org/gnome-devel-demos/unstable/">10분짜리 설명서(10-minute tutorials)</a>가 가장 먼저 눈에 띄었습니다. (접속한 페이지의 실제 이름은 GNOME 개발자 플랫폼 데모입니다) 이미지 보기, 기타 튜너, 메시지 보드 등과 같은 여러 예제를 통해 단순한 GTK+ 위젯 라이브러리 사용법만 보여주는것 뿐 아니라, 말 그대로 GNOME 플랫폼의 중심이 되는 <a href="http://www.gtk.org/">GTK+</a> / <a href="http://www.clutter-project.org/">Clutter</a> / <a href="http://gstreamer.freedesktop.org/">GStreamer</a> / <a href="https://live.gnome.org/WebKitGtk">WebKitGtk</a> 라이브러리 등을 이용하여 유용하게 참고할 수 있는 간단한 응용 프로그램을 <a href="http://www.anjuta.org/">Anjuta</a> 통합 개발 도구, <a href="http://glade.gnome.org/">Glade</a> UI 편집기를 이용하여 개발하는 방법을 설명합니다. 또한 C / C++ / JavaScript / Python / <a href="https://live.gnome.org/Vala">Vala</a> 등과 같은 언어별 예제도 각각 제공하고 있습니다.</p>
<p>최근 계속 연재되는 <a href="http://www.python.org/">파이썬(Python)</a> 언어와 <a href="http://www.gtk.org/">GTK+</a> / <a href="http://www.clutter-project.org/">Clutter</a> / <a href="http://gstreamer.freedesktop.org/">GStreamer</a> 라이브러리를 이용한 GNOME 개발 동영상(screencast)도 볼만합니다. 몇몇 예제는 그놈 개발자 사이트 데모 프로그램과 겹치는 것도 있습니다.</p>
<ol>
<li><a href="http://vimeo.com/25185245">GNOME 스크린캐스트 &#8211; 01. 첫번째 GTK+ 어플리케이션</a> <em>(2011-06-16)</em>: 파이썬을 이용해 기본 기능을 가진 GTK+ 프로그램 만들기</li>
<li><a href="http://vimeo.com/25483019">GNOME 스크린캐스트 &#8211; 02. 화려한 사진 어플리케이션 만들기</a> <em>(2011-06-22)</em>: 파이썬과 GTK+를 이용해 간단한 사진 프로그램 만들기</li>
<li><a href="http://vimeo.com/25796446">GNOME 스크린캐스트 &#8211; 03. 멋진 계산기 만들기</a> <em>(2011-06-29)</em>: 파이썬과 GTK+를 이용해 간단한 계산기 프로그램 만들기</li>
<li><a href="http://vimeo.com/26100971">GNOME 스크린캐스트 &#8211; 04. 우아한 기타 튜너 만들기</a> <em>(2011-07-07)</em>: 파이썬과 GTK+, GStreamer를 이용해 기타 튜너 프로그램 만들기</li>
<li><a href="http://vimeo.com/26452876">GNOME 스크린캐스트 &#8211; 05. 매력적인 동영상 재생기 만들기</a> <em>(2011-07-15)</em>: 파이썬과 GTK+, GStreamer, Clutter를 이용해 동영상 재생기 만들기</li>
</ol>
<p><a href="http://projects.gnome.org/gedit/">gedit</a> 텍스트 편집기와 <a href="http://glade.gnome.org/">Glade</a> UI 편집기만을 이용해 파이썬 언어의 간결함과 GNOME 플랫폼 라이브러리의 강력함을 잘 보여주고 있습니다. 여담이지만, 영어가 짧아 단어만 알아듣는 본인도 코드만 보고 이해할 수 있었습니다. :)</p>
<p>물론 이 글에서 소개한 설명서는 대부분 아마도 많은 개발자에게 GNOME 플랫폼의 우수성을 전파하고 사용을 독려하기 위해 매우 기본적인 내용만 맛보기로 소개하기 때문에 더 심각하고(?) 자세한 내용을 알고 싶다면 각 기술에 대한 심층적인 공부가 필요합니다.</p>
<p>또한 GNOME 플랫폼 라이브러리라는 제목을 달고 있지만 대부분의 기술이 반드시 GNOME 환경에서만 동작하는 게 아니므로 리눅스 관련 개발자라면 한 번 들여다보는 것도 좋을 것 같습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2011/07/15/gnome-development-screencasts-and-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>The Board 소개</title>
		<link>http://lethean.pe.kr/2010/12/23/the-board-project-introduction/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-board-project-introduction&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-board-%25ec%2586%258c%25ea%25b0%259c</link>
		<comments>http://lethean.pe.kr/2010/12/23/the-board-project-introduction/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=the-board-project-introduction#comments</comments>
		<pubDate>Thu, 23 Dec 2010 06:40:07 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1558</guid>
		<description><![CDATA[힘겹게 겨우 다시 한 학기를 마무리했지만, 할 일은 여전히 밀려 있습니다. 그래서 잠시 머리도 식힐겸 요즘 관심있게 지켜보고 있는 GNOME 프로젝트 중 하나인 The Board 프로젝트에 대해 간략하... <a href="http://lethean.pe.kr/2010/12/23/the-board-project-introduction/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=the-board-project-introduction">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[힘겹게 겨우 다시 한 학기를 마무리했지만, 할 일은 여전히 밀려 있습니다. 그래서 잠시 머리도 식힐겸 요즘 관심있게 지켜보고 있는 GNOME 프로젝트 중 하나인 The Board 프로젝트에 대해 간략하게 소개해볼까 합니다. 일단, 백마디 말보다 스크린샷 하나가 더 좋을 것 같군요. 이 &#8230; <a href="http://lethean.pe.kr/2010/12/23/the-board-project-introduction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/12/23/the-board-project-introduction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GLib 테스트 프레임워크 사용하기</title>
		<link>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-glib-test-framework&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=glib-%25ed%2585%258c%25ec%258a%25a4%25ed%258a%25b8-%25ed%2594%2584%25eb%25a0%2588%25ec%259e%2584%25ec%259b%258c%25ed%2581%25ac-%25ec%2582%25ac%25ec%259a%25a9%25ed%2595%2598%25ea%25b8%25b0</link>
		<comments>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=using-glib-test-framework#comments</comments>
		<pubDate>Thu, 11 Feb 2010 18:33:45 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[GLib]]></category>
		<category><![CDATA[GTK+]]></category>
		<category><![CDATA[카스탈리엔]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1236</guid>
		<description><![CDATA[GLib 라이브러리 2.16 버전부터 지원하는 테스트 프레임워크는 C 언어용 유닛테스트 도구입니다. 물론 많은 유닛 테스트 도구가 이미 존재하지만, GLib 라이브러리 기반 C 언어 프로그램이라면  <a href="http://lethean.pe.kr/2010/02/12/using-glib-test-framework/?utm_source=rss&#38;utm_medium=rss&#38;utm_campaign=using-glib-test-framework">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[GLib 라이브러리 2.16 버전부터 지원하는 테스트 프레임워크는 C 언어용 유닛테스트 도구입니다. 물론 많은 유닛 테스트 도구가 이미 존재하지만, GLib 라이브러리 기반 C 언어 프로그램이라면 굳이 다른 라이브러리를 사용하는 것보다는 이미 지원하는 훌륭한 도구를 사용하는게 더 좋겠지요. 참고로, GTK+, Clutter 등 &#8230; <a href="http://lethean.pe.kr/2010/02/12/using-glib-test-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2010/02/12/using-glib-test-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>클러터와 GTK</title>
		<link>http://lethean.pe.kr/2009/09/08/clutter-and-gtk/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ed%2581%25b4%25eb%259f%25ac%25ed%2584%25b0%25ec%2599%2580-gtk</link>
		<comments>http://lethean.pe.kr/2009/09/08/clutter-and-gtk/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 00:56:55 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=1040</guid>
		<description><![CDATA[`Design experience and demos in GTK and Clutter&#8216; 라는 포스트가 얼마 전에 올라왔는데 이제야 리뷰를 해봅니다. 이 포스트를 클릭해서 들어가 보시면 데모 동영상이 여러개 있는데, 클러터 안에 GTK 노트북 위젯을 넣어 여러가지 효과를 보여주고 있습니다. 이 포스트는 `animating GTK+, Clutter-Gtk, client-side-windows and demos&#8216; 포스트에서 설명한 방식을 더 확장하고 실용적인 예제를 보여주고 있는 셈인데, GTK Client Side [...] <a href="http://lethean.pe.kr/2009/09/08/clutter-and-gtk/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[`Design experience and demos in GTK and Clutter&#8216; 라는 포스트가 얼마 전에 올라왔는데 이제야 리뷰를 해봅니다. 이 포스트를 클릭해서 들어가 보시면 데모 동영상이 여러개 있는데, 클러터 안에 GTK 노트북 위젯을 넣어 여러가지 효과를 보여주고 있습니다. 이 포스트는 `animating GTK+, Clutter-Gtk, client-side-windows and demos&#8216; 포스트에서 설명한 방식을 더 확장하고 실용적인 예제를 보여주고 있는 셈인데, GTK Client Side [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/2009/09/08/clutter-and-gtk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>클러터(Clutter) 사용하기 (2)</title>
		<link>http://lethean.pe.kr/?p=397&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ed%2581%25b4%25eb%259f%25ac%25ed%2584%25b0clutter-%25ec%2582%25ac%25ec%259a%25a9%25ed%2595%2598%25ea%25b8%25b0-2</link>
		<comments>http://lethean.pe.kr/?p=397#comments</comments>
		<pubDate>Thu, 15 Jan 2009 03:12:40 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=397</guid>
		<description><![CDATA[클러터 튜토리얼 내용을 계속 정리해 봅니다.
액터 (Actors) - 배우
클러터는 3차원 공간 속에서 2차원 표면(surfaces)을 다루는 캔버스 API입니다. 그래서, 기본 클러터 액터는 2차원 도형이지만 좌표는 3차원입니다. 하지만, 깊이(depth) 개념은 없습니다. 따라서 액터 테두리만 정면 화면에 걸치도록 정확하게 회전되었다면 이론적으로 안보이게 됩니다. 복잡한 3차원 객체가 필요하다면 OpenGL ES API를 이용해 새로운 액터를 구현해도 되지만, 이 방법은 나중에 [...] <a href="http://lethean.pe.kr/?p=397">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[클러터 튜토리얼 내용을 계속 정리해 봅니다.
액터 (Actors) - 배우
클러터는 3차원 공간 속에서 2차원 표면(surfaces)을 다루는 캔버스 API입니다. 그래서, 기본 클러터 액터는 2차원 도형이지만 좌표는 3차원입니다. 하지만, 깊이(depth) 개념은 없습니다. 따라서 액터 테두리만 정면 화면에 걸치도록 정확하게 회전되었다면 이론적으로 안보이게 됩니다. 복잡한 3차원 객체가 필요하다면 OpenGL ES API를 이용해 새로운 액터를 구현해도 되지만, 이 방법은 나중에 [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/?feed=rss2&#038;p=397</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>클러터(Clutter) 사용하기 (1)</title>
		<link>http://lethean.pe.kr/?p=383&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ed%2581%25b4%25eb%259f%25ac%25ed%2584%25b0clutter-%25ec%2582%25ac%25ec%259a%25a9%25ed%2595%2598%25ea%25b8%25b0-1</link>
		<comments>http://lethean.pe.kr/?p=383#comments</comments>
		<pubDate>Wed, 14 Jan 2009 12:26:28 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=383</guid>
		<description><![CDATA[클러터(Clutter)는 C 언어로 구현한 2D 그래픽 사용자 인터페이스 라이브러리입니다. 2D임에도 불구하고 OpenGL 또는 OpenGL ES를 렌더링에 사용하며, GLib의 GObject 기반으로 API가 구성되어 있습니다. 뭐, 소개하자면 끝이 없고, 더 궁금한 분은 공식 홈페이지를 참고하기 바랍니다. 이 글은 클러터 튜토리얼을 중심으로 실제 사용하는 방법을 몇 차례에 나누어 정리하려 합니다. (현재 1.0 버전이 활발하게 개발 중이지만, 일단 0.8 [...] <a href="http://lethean.pe.kr/?p=383">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[클러터(Clutter)는 C 언어로 구현한 2D 그래픽 사용자 인터페이스 라이브러리입니다. 2D임에도 불구하고 OpenGL 또는 OpenGL ES를 렌더링에 사용하며, GLib의 GObject 기반으로 API가 구성되어 있습니다. 뭐, 소개하자면 끝이 없고, 더 궁금한 분은 공식 홈페이지를 참고하기 바랍니다. 이 글은 클러터 튜토리얼을 중심으로 실제 사용하는 방법을 몇 차례에 나누어 정리하려 합니다. (현재 1.0 버전이 활발하게 개발 중이지만, 일단 0.8 [...]]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/?feed=rss2&#038;p=383</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
		<item>
		<title>GTK+ Animation Effects</title>
		<link>http://lethean.pe.kr/?p=134&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gtk-animation-effects</link>
		<comments>http://lethean.pe.kr/?p=134#comments</comments>
		<pubDate>Tue, 24 Jul 2007 17:26:00 +0000</pubDate>
		<dc:creator>lethean</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Clutter]]></category>
		<category><![CDATA[GTK+]]></category>

		<guid isPermaLink="false">http://lethean.pe.kr/?p=134</guid>
		<description><![CDATA[점점 화려해지는 GUI 추세를 이제서야 인식했는지, GTK+ / GNOME 에서도 애니메이션 효과에 대한 논의와 구현이 점점 활발해지고 있는 것 같다. 아직 GTK+ 메인 소스에 반영되려면 시간이 더 걸릴 것 같지만 GtkTimeline 이라는 기본적인 시간 관리 객체가 이미 논의 중이고, 이를 기반으로 여러 개발자들이 여기저기에 적용해보기도 하고 있다. (GtkPathBar 스크롤 효과, iPhone 방식 슬라이드 효과, iPhone [...] <a href="http://lethean.pe.kr/?p=134">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[점점 화려해지는 GUI 추세를 이제서야 인식했는지, GTK+ / GNOME 에서도 애니메이션 효과에 대한 논의와 구현이 점점 활발해지고 있는 것 같다. 아직 GTK+ 메인 소스에 반영되려면 시간이 더 걸릴 것 같지만 <a href="http://bugzilla.gnome.org/show_bug.cgi?id=444659">GtkTimeline</a> 이라는 기본적인 시간 관리 객체가 이미 논의 중이고, 이를 기반으로 여러 개발자들이 여기저기에 적용해보기도 하고 있다. (<a href="http://blogs.gnome.org/carlosg/2007/06/06/animateinanimate/">GtkPathBar 스크롤 효과</a>, <a href="http://micke.hallendal.net/archives/2007/07/bling_in_gtk.html">iPhone 방식 슬라이드 효과</a>, <a href="http://codeposts.blogspot.com/2007/07/iphone-like-virtual-keyboard.html">iPhone 방식 가상키보드</a>)

GtkTimeline API가 참고한 소스 중 하나라고 하는 <a href="http://clutter-project.org/">Clutter</a> 라이브러리는 OpenGL을 렌더링 엔진으로 사용하는데, GObject 기반으로 GTK+와 친근한 방식의 API를 제공하여 이미 여러 프로젝트에서 사용하고 있는 것 같다. <a href="http://butterfeet.org/?p=38">Clutter를 이용한 간단한 프리젠테이션 도구</a>, <a href="http://butterfeet.org/?p=39">휴대폰 인터페이스</a> 등과 같은 예제도 점점 늘어나고 있다. 하지만 OpenGL 기반이라 임베디드 시스템이나 그래픽칩셋이 3D 가속을 지원하지 않는 환경에서는 활용하기 어렵다는 점이 아쉽다. 아직<a href="http://blogs.gnome.org/timj/2007/07/17/17072007-opengl-for-gdkgtk/"> OpenGL API로 모든 2D 그래픽을 대체하는 건 시기상조일 수도 있다는 얘기</a>도 심심챦게 나오고 있고…

참고로 더 나열해보자면, QT 계열에서는 이미 <a href="http://zrusin.blogspot.com/2007/07/scripter.html">코딩하면서 바로 캔버스 API를 테스트할 수 있는 스크립트 엔진</a>도 지원한다. <a href="http://www.enlightenment.org/">E17</a>의 <a href="http://www.enlightenment.org/p.php?p=about/libs&amp;l=en">EFL 라이브러리</a>는 이미 오래전부터 Evas, Edje 등으로 조금 앞선 플랫폼을 제공하더니 이제는 <a href="http://www.fluffyspider.com/demos/live_videos/live_videos.html">EFL 기반 솔루션을 제공하는 업체</a>도 생겨났다. 최근의 <a href="http://www.mizi.com/content/view/4/5/">미지리서치 Prizm 플랫폼</a>도 휴대폰에서 화려한 UI 효과를 쉽게 구현하도록 도와주고 있다.(glib 기반이라 반가웠다)

물론 좋은 오픈소스 라이브러리와 플랫폼이 참 많지만, 이미 오랜 시간을 GTK+와 함께 해왔더니 쉽게 다른 플랫폼으로 바꾸기가 어려운 것 같다. 하지만, 언제나 그렇듯이 잘 설계되고 잘 구현된 오픈 소스 프로젝트를 들여다보는 일은 즐겁다. 가능하면 참여중인 프로젝트에 적용해보고도 싶고, 더 나아가 프로젝트에 직접 참여해보기도 싶지만, 언제나 그렇듯이…]]></content:encoded>
			<wfw:commentRss>http://lethean.pe.kr/?feed=rss2&#038;p=134</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/kr/</creativeCommons:license>
	</item>
	</channel>
</rss>

