<?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:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>Solitaire &#187; C/C++</title>
	<atom:link href="http://blog.redhawk.jp/archives/tag/cc/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.redhawk.jp</link>
	<description>Sato Tatsuma&#039;s weblog about programming and systems.</description>
	<lastBuildDate>Sun, 05 Sep 2010 02:31:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/tag/cc/feed" />
		<item>
		<title>FBX: FBX SDK 2011.3 メモリリークがきつい</title>
		<link>http://blog.redhawk.jp/archives/3031?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=fbx-fbx-sdk-2011-3-%25e3%2583%25a1%25e3%2583%25a2%25e3%2583%25aa%25e3%2583%25aa%25e3%2583%25bc%25e3%2582%25af%25e3%2581%258c%25e3%2581%258d%25e3%2581%25a4%25e3%2581%2584</link>
		<comments>http://blog.redhawk.jp/archives/3031#comments</comments>
		<pubDate>Wed, 04 Aug 2010 03:00:04 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[FBX]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[FBX SDK]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=3031</guid>
		<description><![CDATA[FBX SDK 2011.3 を使ってみたら、ライブラリを読み込んだだけで、メモリリークが発生している。 色々調べて、2010.2 でのメモリリークは解決できるっぽいけれど。2011.3のメモリリークは無理くさい。 ってか、APIいっさい呼んでないのに、メモリリークって・・・w 結局、メモリリークがない、2011.2 を使う事に。 APIが若干変わってるみたいだから、あとで新しいバージョンでたら、結構大変だわw 2010.2 のメモリリークはこちらを参照に。 FBX SDK 2010.2 のメモリリークがなくならない [FBX]]]></description>
			<content:encoded><![CDATA[<p>FBX SDK 2011.3 を使ってみたら、ライブラリを読み込んだだけで、メモリリークが発生している。</p>
<p>色々調べて、2010.2 でのメモリリークは解決できるっぽいけれど。2011.3のメモリリークは無理くさい。<br />
ってか、APIいっさい呼んでないのに、メモリリークって・・・w</p>
<p>結局、メモリリークがない、2011.2 を使う事に。<br />
APIが若干変わってるみたいだから、あとで新しいバージョンでたら、結構大変だわw</p>
<p>2010.2 のメモリリークはこちらを参照に。<br />
<a href="http://x-kerberos.vsxn.0sites.net/arc/tips/programing/3d/fbx/959/">FBX SDK 2010.2 のメモリリークがなくならない [FBX]</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/3031/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/3031" />
	</item>
		<item>
		<title>DirectX: debug情報</title>
		<link>http://blog.redhawk.jp/archives/3020?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=directx-debug%25e6%2583%2585%25e5%25a0%25b1</link>
		<comments>http://blog.redhawk.jp/archives/3020#comments</comments>
		<pubDate>Mon, 02 Aug 2010 21:32:55 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[DirectX]]></category>
		<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=3020</guid>
		<description><![CDATA[DirectXでのDebug情報取得のメモ。 とりあえず、Debugビルドの時は、 d3dx9d.lib d3dx10d.lib をリンクする。 次に、DirectX関数のエラー時のデバッグ情報取得。 dxerr.lib をリンクして dxerr.h をincludeする。 // // Helper macros // #if defined(DEBUG) &#124; defined(_DEBUG) #define DXTRACE_MSG(str) DXTrace( __FILE__, (DWORD)__LINE__, 0, str, FALSE ) #define DXTRACE_ERR(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, FALSE ) #define DXTRACE_ERR_MSGBOX(str,hr) DXTrace( __FILE__, (DWORD)__LINE__, hr, str, TRUE ) #else #define DXTRACE_MSG(str) (0L) #define DXTRACE_ERR(str,hr) (hr) #define DXTRACE_ERR_MSGBOX(str,hr) [...]]]></description>
			<content:encoded><![CDATA[<p>DirectXでのDebug情報取得のメモ。</p>
<p>とりあえず、Debugビルドの時は、<br />
d3dx9d.lib<br />
d3dx10d.lib<br />
をリンクする。</p>
<p>次に、DirectX関数のエラー時のデバッグ情報取得。<br />
dxerr.lib<br />
をリンクして<br />
dxerr.h<br />
をincludeする。</p>
<pre class="brush:c++">
//
// Helper macros
//
#if defined(DEBUG) | defined(_DEBUG)
#define DXTRACE_MSG(str)              DXTrace( __FILE__, (DWORD)__LINE__, 0, str, FALSE )
#define DXTRACE_ERR(str,hr)           DXTrace( __FILE__, (DWORD)__LINE__, hr, str, FALSE )
#define DXTRACE_ERR_MSGBOX(str,hr)    DXTrace( __FILE__, (DWORD)__LINE__, hr, str, TRUE )
#else
#define DXTRACE_MSG(str)              (0L)
#define DXTRACE_ERR(str,hr)           (hr)
#define DXTRACE_ERR_MSGBOX(str,hr)    (hr)
#endif
</pre>
<p>内部で上のマクロが定義されているので、これを使って取得する。</p>
<pre class="brush:c++">
HRESULT hr = D3D10CreateDeviceAndSwapChain(); // 引数は省略
if (FAILED(hr)) {
  DXTRACE_ERR_MSGBOX(L"Failed.", hr);
}
</pre>
<p>お好みに合わせてどのマクロを使うかを選択すればいいかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/3020/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/3020" />
	</item>
		<item>
		<title>OpenGL: Windows で OpenGL のセットアップ</title>
		<link>http://blog.redhawk.jp/archives/2977?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=opengl-opengl-%25e3%2581%25ae%25e3%2582%25bb%25e3%2583%2583%25e3%2583%2588%25e3%2582%25a2%25e3%2583%2583%25e3%2583%2597</link>
		<comments>http://blog.redhawk.jp/archives/2977#comments</comments>
		<pubDate>Sun, 01 Aug 2010 05:11:50 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=2977</guid>
		<description><![CDATA[glutを使ったサンプルが多いけれど、自分が作っている DirectX のほうも、dxutは使っていないので、こちらも生で使おうかなと。 まあ、DirectX と OpenGL を同じアプリの中に入れたかったので、glutとdxut使うときついかなと・・・ #ifdef _WIN32 #include #endif // _WIN32 #include #include class LFGLContext { public: LFGLContext(); ~LFGLContext(); #ifdef _WIN32 /** Create object resource. */ bool Create(HWND hWnd); #endif // _WIN32 /** Release object resource. */ void Release(); /** Resize backbuffers */ bool Resize(GLsizei width, GLsizei height); /** Swap back buffer */ [...]]]></description>
			<content:encoded><![CDATA[<p>glutを使ったサンプルが多いけれど、自分が作っている DirectX のほうも、dxutは使っていないので、こちらも生で使おうかなと。<br />
まあ、DirectX と OpenGL を同じアプリの中に入れたかったので、glutとdxut使うときついかなと・・・</p>
<pre class="brush:c++">
#ifdef _WIN32
#include <windows.h>
#endif // _WIN32

#include <GL/gl.h>
#include <GL/glu.h>

class LFGLContext
{
 public:
  LFGLContext();
  ~LFGLContext();

#ifdef _WIN32
  /** Create object resource. */
  bool Create(HWND hWnd);
#endif // _WIN32

  /** Release object resource. */
  void Release();

  /** Resize backbuffers */
  bool Resize(GLsizei width, GLsizei height);

  /** Swap back buffer */
  bool SwapBuffers();

 private:
#ifdef _WIN32
  /** OpenGL Rendering context. */
  HGLRC hGLRC_;

  HWND hWnd_;

  /** Windows device context. */
  HDC hDC_;
#endif

  GLfloat ratio_;
};

LFGLContext::LFGLContext()
{
  this->hWnd_ = NULL;
  this->hDC_ = NULL;
  this->hGLRC_ = NULL;
}

LFGLContext::~LFGLContext()
{
  this->Release();
}

#ifdef _WIN32
bool LFGLContext::Create(HWND hWnd)
{
  if (!hWnd) {
    return false;
  }

  this->hWnd_ = hWnd;
  // Get device context from window handle.
  this->hDC_ = GetDC(this->hWnd_);

  // Set the pixel format for the device context.
  PIXELFORMATDESCRIPTOR pfd;

  memset(&#038;pfd, NULL, sizeof(pfd));

  pfd.nSize = sizeof(pfd);
  pfd.nVersion = 1;
  pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  pfd.dwLayerMask = PFD_MAIN_PLANE;
  pfd.iPixelType = PFD_TYPE_RGBA;
  pfd.cColorBits = 24;
  pfd.cDepthBits = 16;
  pfd.cAccumBits = 0;
  pfd.cStencilBits = 0;

  int pixel_format = ChoosePixelFormat(this->hDC_, &#038;pfd);
  if (0 == pixel_format) {
    return false;
  }
  if (FALSE == SetPixelFormat(this->hDC_, pixel_format, &#038;pfd)) {
    return false;
  }

  this->hGLRC_ = wglCreateContext(this->hDC_);
  if (!this->hGLRC_) {
    return false;
  }

  // Create render device context.
  if (FALSE == wglMakeCurrent(this->hDC_, this->hGLRC_)) {
    return false;
  }

  glClearIndex((GLfloat)1.0f);
  glClearDepth(1.0f);

  // Enable depth test.
  glEnable(GL_DEPTH_TEST);

  return true;
}
#endif // _WIN32

void LFGLContext::Release()
{
  if (this->hGLRC_) {
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(this->hGLRC_);
    this->hGLRC_ = NULL;
  }

  if (this->hWnd_ &#038;&#038; this->hDC_) {
    ReleaseDC(this->hWnd_, this->hDC_);
    this->hWnd_ = NULL;
    this->hDC_ = NULL;
  }
}

bool LFGLContext::Resize(GLsizei width, GLsizei height)
{
  glViewport(0, 0, width, height);

  this->ratio_ = (GLfloat)width / height;

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0f, this->ratio_, 3.0f, 7.0f);
  glMatrixMode(GL_MODELVIEW);

  return true;
}

bool LFGLContext::SwapBuffers()
{
  if (FALSE == ::SwapBuffers(this->hDC_)) {
    return false;
  }

  return true;
}
</pre>
<p>Windows API叩いた事ある人ならなんとなく分かるかも？<br />
2D描画の時に使っていた、DC（デバイスコンテキスト）から、OpenGLに対応した、GLRC（GLレンダリングコンテキスト）を作成する流れになる。</p>
<p><a href="http://msdn.microsoft.com/en-us/library/dd374379(VS.85).aspx">wglCreateContext</a></p>
<p>後はもう普通に OpenGL の描画処理などをやって、最後に、 SwapBuffers を呼び出すのを忘れなければ大丈夫。</p>
<p>Mac環境もあれば、Macにも対応させておきたんだけれど、Mac持ってないんだよねーw<br />
システムエンジニアやっていた人間としてはかなり珍しいかもね・・・Mac持ってないの。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/2977/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/2977" />
	</item>
		<item>
		<title>C/C++: VC++: _CrtSetDbgFlag でメモリチェック</title>
		<link>http://blog.redhawk.jp/archives/2920?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cc-_crtsetdbgflag-%25e3%2581%25a7%25e3%2583%25a1%25e3%2583%25a2%25e3%2583%25aa%25e3%2583%2581%25e3%2582%25a7%25e3%2583%2583%25e3%2582%25af</link>
		<comments>http://blog.redhawk.jp/archives/2920#comments</comments>
		<pubDate>Sat, 31 Jul 2010 22:36:56 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=2920</guid>
		<description><![CDATA[VisualC++だと _CrtSetDbgFlag を使って、メモリリークをチェックできるらしい。 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF &#124; _CRTDBG_LEAK_CHECK_DF); 大抵は、起動時にこんな感じで呼び出す。 指定するフラグの詳細はこちらなどを参考にどうぞ。 http://msdn.microsoft.com/ja-jp/library/5at7yxcs(VS.90).aspx _DEBUG が define されている時だけ有効になるらしいので、呼び出し側で明示的に、_DEBUGを意識する必要性はないみたい。まあ、こんなのが動いていたら、遅くなるだろうしねー]]></description>
			<content:encoded><![CDATA[<p>VisualC++だと</p>
<pre class="brush:c++">
_CrtSetDbgFlag
</pre>
<p>を使って、メモリリークをチェックできるらしい。</p>
<pre class="brush:c++">
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
</pre>
<p>大抵は、起動時にこんな感じで呼び出す。</p>
<p>指定するフラグの詳細はこちらなどを参考にどうぞ。<br />
<a href="http://msdn.microsoft.com/ja-jp/library/5at7yxcs(VS.90).aspx">http://msdn.microsoft.com/ja-jp/library/5at7yxcs(VS.90).aspx</a></p>
<p>_DEBUG が define されている時だけ有効になるらしいので、呼び出し側で明示的に、_DEBUGを意識する必要性はないみたい。まあ、こんなのが動いていたら、遅くなるだろうしねー</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/2920/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/2920" />
	</item>
		<item>
		<title>C/C++: VC++: Visual Studio 2008 SP1</title>
		<link>http://blog.redhawk.jp/archives/2774?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=vc-visual-studio-2008-sp1</link>
		<comments>http://blog.redhawk.jp/archives/2774#comments</comments>
		<pubDate>Fri, 16 Jul 2010 08:37:35 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=2774</guid>
		<description><![CDATA[暫く使ってないとやっぱりだめだなぁ　って、SP1は1年以上前じゃないか！！ Visual Studio 2008 Service Pack 1 および .NET Framework 3.5 SP1 とりあえず、SP1を使うと、C++的に何が違うかというと、単純なC++のバージョンアップか。 boostのライブラリの一部が、標準ライブラリに採用されている。 将来的には、C++0x から、std:: で使えるようになるらしいけれど、今は、 std::tr1:: で使える。 shared_ptr なら、std::tr1::shared_ptr なわけだ。 長いな・・・ｗ typedef で、短くするというのは、自分のコーディング規約的にはやらない方向性なので、とりあえずは、長いまま書いておくか。 ちなみに、tr1 は Technical Report 1 の略らしい。 Linuxだと、gcc44が既に使えるから、試してみるのもいいかもね。]]></description>
			<content:encoded><![CDATA[<p>暫く使ってないとやっぱりだめだなぁ　って、SP1は1年以上前じゃないか！！</p>
<p><a href="http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2008/sp1/default.aspx">Visual Studio 2008 Service Pack 1 および .NET Framework 3.5 SP1</a></p>
<p>とりあえず、SP1を使うと、C++的に何が違うかというと、単純なC++のバージョンアップか。<br />
boostのライブラリの一部が、標準ライブラリに採用されている。</p>
<p>将来的には、C++0x から、std:: で使えるようになるらしいけれど、今は、 std::tr1:: で使える。<br />
shared_ptr なら、std::tr1::shared_ptr なわけだ。<br />
長いな・・・ｗ</p>
<p>typedef で、短くするというのは、自分のコーディング規約的にはやらない方向性なので、とりあえずは、長いまま書いておくか。</p>
<p>ちなみに、tr1 は Technical Report 1 の略らしい。</p>
<p>Linuxだと、gcc44が既に使えるから、試してみるのもいいかもね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/2774/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/2774" />
	</item>
		<item>
		<title>VC++: ミリ秒取得</title>
		<link>http://blog.redhawk.jp/archives/1556?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=vc-%25e3%2583%259f%25e3%2583%25aa%25e7%25a7%2592%25e5%258f%2596%25e5%25be%2597</link>
		<comments>http://blog.redhawk.jp/archives/1556#comments</comments>
		<pubDate>Tue, 06 Oct 2009 16:49:20 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1556</guid>
		<description><![CDATA[Java でいう、System.currentTimeMillis() みたいなのがないかな。と探したらあった。 #include &#60;mmsystem.h&#62; timeBeginPeriod(1); DWORD currentTime = timeGetTime(); timeEndPeriod(1); この時 winmm.lib にリンクを張る必要性がある。 UNIX系なら #include &#60;sys/time.h&#62; gettimeofday() で取れるらしい。 こっちはまだ試してない。]]></description>
			<content:encoded><![CDATA[<p>Java でいう、System.currentTimeMillis() みたいなのがないかな。と探したらあった。</p>
<pre class="brush:c++">
#include &lt;mmsystem.h&gt;

timeBeginPeriod(1);
DWORD currentTime = timeGetTime();
timeEndPeriod(1);
</pre>
<p>この時 winmm.lib にリンクを張る必要性がある。</p>
<p>UNIX系なら</p>
<pre class="brush:c++">
#include &lt;sys/time.h&gt;

gettimeofday()
</pre>
<p>で取れるらしい。<br />
こっちはまだ試してない。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1556/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1556" />
	</item>
		<item>
		<title>依存の強弱</title>
		<link>http://blog.redhawk.jp/archives/1503?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=%25e4%25be%259d%25e5%25ad%2598%25e3%2581%25ae%25e5%25bc%25b7%25e5%25bc%25b1</link>
		<comments>http://blog.redhawk.jp/archives/1503#comments</comments>
		<pubDate>Thu, 24 Sep 2009 18:16:14 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Game]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1503</guid>
		<description><![CDATA[ゲームエンジンを組んでいて、デバイスへの依存度が高いと、キャストや抽象化の数が減るから パフォーマンスは上がるかもしれないけれど、後で違うデバイスへ同じロジックで乗せ替えをしたい時に難しくなる。 デバイスではなくて、ドライバ（API) だけれど、DirectX と openGL のそれぞれに依存している部分を どの程度依存を強くするか。というのが、両方に対応させるポイントかなと。 たとえば、C++ で InterfaceClass を定義して、それを継承したクラスが DirectX用の Vector, openGL用の Vector クラスを内包していて Interfaceは統一されている状態であっても、そのポインタを更に DirectX 用の API に渡すには更にキャストが必要。 しかも、そこに必ず DirectX 用の Vector オブジェクトがこないといけない。 ポインタとしては、抽象クラスに一度キャストされているし、受け口もそうすれば受け取れるけれど 中身が違ったら結局実行時エラーが出る。 それじゃ、抽象化に成功しているとはいえない。 組む時の苦労は何も減らない。むしろ、キャストしてただ単にパフォーマンスが落ちるだけじゃないのか？ どんなに Vector や Matrix, Light を抽象化しようが、最終的にはそれぞれの API が指定しているオブジェクトを渡さないといけないんだもん。 って言うことで、余り依存関係を弱くしても、それがシステム的にいい設計とは限らないと思うわけです。 じゃあ、どこまでを依存にして、どこからを非依存にすれば ゲームエンジンとして、性能がいいのだろうか？ おそらく、デバイス依存する部分はがっつり依存する。つまり描画周り。 そこを、きちんと切り出しておいて、DIコンテナみたいに、動的に入れ替えが出来れば問題がないはず。 アスペクト指向ってやつかな。 で、ゲーム側ロジック側では抽象クラスとしてしか扱わない。 つまり、InterfaceClass のポインタを受け取って、その関数を扱うけれど、オブジェクトには直にアクセスしない。 描画部分だけは、InterfaceClassのポインタではなく、完全にデバイス依存のオブジェクトポインタを受け取る。 これで、ある程度は分離できるはず。 Javaのフレームワークで、散々アスペクト指向というものに触れてきたけれど それが役に立っている感じ？ まあ、オブジェクト指向、アスペクト指向、エージェント指向って色々あるけれど プログラムを本格的に組んでいると必ずぶち当たる壁に対する、解決手段思想だよね。 たまに、そういう思想を一切勉強しないでプログラムを組んでいる人を見かけるけれど [...]]]></description>
			<content:encoded><![CDATA[<p>ゲームエンジンを組んでいて、デバイスへの依存度が高いと、キャストや抽象化の数が減るから<br />
パフォーマンスは上がるかもしれないけれど、後で違うデバイスへ同じロジックで乗せ替えをしたい時に難しくなる。</p>
<p>デバイスではなくて、ドライバ（API) だけれど、DirectX と openGL のそれぞれに依存している部分を<br />
どの程度依存を強くするか。というのが、両方に対応させるポイントかなと。</p>
<p>たとえば、C++ で InterfaceClass を定義して、それを継承したクラスが<br />
DirectX用の Vector, openGL用の Vector クラスを内包していて<br />
Interfaceは統一されている状態であっても、そのポインタを更に DirectX 用の API に渡すには更にキャストが必要。<br />
しかも、そこに必ず DirectX 用の Vector オブジェクトがこないといけない。<br />
ポインタとしては、抽象クラスに一度キャストされているし、受け口もそうすれば受け取れるけれど<br />
中身が違ったら結局実行時エラーが出る。<br />
それじゃ、抽象化に成功しているとはいえない。<br />
組む時の苦労は何も減らない。むしろ、キャストしてただ単にパフォーマンスが落ちるだけじゃないのか？</p>
<p>どんなに Vector や Matrix, Light を抽象化しようが、最終的にはそれぞれの API が指定しているオブジェクトを渡さないといけないんだもん。</p>
<p>って言うことで、余り依存関係を弱くしても、それがシステム的にいい設計とは限らないと思うわけです。<br />
じゃあ、どこまでを依存にして、どこからを非依存にすれば<br />
ゲームエンジンとして、性能がいいのだろうか？</p>
<p>おそらく、デバイス依存する部分はがっつり依存する。つまり描画周り。<br />
そこを、きちんと切り出しておいて、DIコンテナみたいに、動的に入れ替えが出来れば問題がないはず。<br />
アスペクト指向ってやつかな。</p>
<p>で、ゲーム側ロジック側では抽象クラスとしてしか扱わない。<br />
つまり、InterfaceClass のポインタを受け取って、その関数を扱うけれど、オブジェクトには直にアクセスしない。<br />
描画部分だけは、InterfaceClassのポインタではなく、完全にデバイス依存のオブジェクトポインタを受け取る。<br />
これで、ある程度は分離できるはず。</p>
<p>Javaのフレームワークで、散々アスペクト指向というものに触れてきたけれど<br />
それが役に立っている感じ？</p>
<p>まあ、オブジェクト指向、アスペクト指向、エージェント指向って色々あるけれど<br />
プログラムを本格的に組んでいると必ずぶち当たる壁に対する、解決手段思想だよね。</p>
<p>たまに、そういう思想を一切勉強しないでプログラムを組んでいる人を見かけるけれど<br />
そういう人って、性格にもよるけれど、ちょっと困る場合が多い。</p>
<p>大抵の場合そういう人のプログラムは読めないし、後から変更が出来ない、どこかをいじると次々と動かなくなる。<br />
という場合が多いからだ。</p>
<p>個人差はあるけれど、自分が見かけた人たちは、得てして頑固な性格をしていて<br />
根拠がない理由で頑固なんだよね。</p>
<p>これはどうしてこういう方法を使っているの？<br />
このカラムは何でこのテーブルにあるの？<br />
って聞いても、なんとなく。って答えるんだよね。</p>
<p>まあ、話はそれたけれど、その思想への好き嫌いはそれぞれあるだろうし<br />
勉強しなくても、別にいいんだけれど</p>
<p>他人が読めるプログラムを組んで欲しい。<br />
それに付きます。<br />
動けばいい。っていうプログラムの組み方する人のプログラムはもう二度と見たくないなぁ・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1503/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1503" />
	</item>
		<item>
		<title>WindowsAPI: PeekMessage</title>
		<link>http://blog.redhawk.jp/archives/1421?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=windowsapi-peekmessage</link>
		<comments>http://blog.redhawk.jp/archives/1421#comments</comments>
		<pubDate>Sun, 30 Aug 2009 11:16:06 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1421</guid>
		<description><![CDATA[DirectXのサンプルを眺めていて、Message処理にPeekMessageというのを使っているから 使ってみたんだけれど、CPU使用率が100%に・・・ リファレンス見てみたら、メッセージがなくても待機しないからループ処理ががんがん走るっぽいね。 今回作りたいプログラムにこれを使うのは危険なので、GetMessage使っておこう。 DirectXサンプルの中では、PeekMessageをやって、メッセージ処理がなかったら、Render関数を呼び出すという 処理をしているんだけれど、これは簡単なサンプルだからやっている事で 実際のプログラムだと、Threadの方でRender処理をすれば良いから 時に問題はないかなぁ・・・ むしろ、Message処理をしている間に、Renderがまったく止まるのは実際のプログラムとしては 厳しいかなと。 まあ、要件次第だけれど、俺は止めたくないなー]]></description>
			<content:encoded><![CDATA[<p>DirectXのサンプルを眺めていて、Message処理にPeekMessageというのを使っているから<br />
使ってみたんだけれど、CPU使用率が100%に・・・</p>
<p>リファレンス見てみたら、メッセージがなくても待機しないからループ処理ががんがん走るっぽいね。</p>
<p>今回作りたいプログラムにこれを使うのは危険なので、GetMessage使っておこう。</p>
<p>DirectXサンプルの中では、PeekMessageをやって、メッセージ処理がなかったら、Render関数を呼び出すという<br />
処理をしているんだけれど、これは簡単なサンプルだからやっている事で<br />
実際のプログラムだと、Threadの方でRender処理をすれば良いから<br />
時に問題はないかなぁ・・・</p>
<p>むしろ、Message処理をしている間に、Renderがまったく止まるのは実際のプログラムとしては<br />
厳しいかなと。<br />
まあ、要件次第だけれど、俺は止めたくないなー</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1421/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1421" />
	</item>
		<item>
		<title>VisualStudio: 2008でVC++のみをインストールすると不具合が</title>
		<link>http://blog.redhawk.jp/archives/1367?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=visualstudio-2008%25e3%2581%25a7vc%25e3%2581%25ae%25e3%2581%25bf%25e3%2582%2592%25e3%2582%25a4%25e3%2583%25b3%25e3%2582%25b9%25e3%2583%2588%25e3%2583%25bc%25e3%2583%25ab%25e3%2581%2599%25e3%2582%258b%25e3%2581%25a8%25e4%25b8%258d%25e5%2585%25b7%25e5%2590%2588%25e3%2581%258c</link>
		<comments>http://blog.redhawk.jp/archives/1367#comments</comments>
		<pubDate>Fri, 21 Aug 2009 07:28:05 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1367</guid>
		<description><![CDATA[こちらを見て解決したんですが VisualStudio 2008 で容量をけちって、VC++だけをインストールしたら プロジェクト : error PRJ0003 : &#8216;cl.exe&#8217; の起動中にエラーが発生しました。 というエラーが発生。 ぐぐったら、まず、PATHが通っていないんだろう。って事なので ツール -> オプション -> プロジェクトおよびソリューション -> VC++ディレクトリ C$(VCInstallDir)bin 以外に C:\Program Files\Microsoft Visual Studio 9.0\VC\bin を追加。 それでも解決しなかったので、VC#をインストールしたら解決した。 自分の環境では C:\Program Files\Microsoft Visual Studio 9.0\VC\bin の設定をはずしたらまた同じエラーが出たので両方必要な場合もあるっぽい。]]></description>
			<content:encoded><![CDATA[<p><a href="http://rararahp.cool.ne.jp/cgi-bin/zatulng/read.cgi?mode=all&#038;list=topic&#038;no=1855">こちら</a>を見て解決したんですが</p>
<p>VisualStudio 2008 で容量をけちって、VC++だけをインストールしたら</p>
<p>プロジェクト : error PRJ0003 : &#8216;cl.exe&#8217; の起動中にエラーが発生しました。</p>
<p>というエラーが発生。</p>
<p>ぐぐったら、まず、PATHが通っていないんだろう。って事なので</p>
<p>ツール -> オプション -> プロジェクトおよびソリューション -> VC++ディレクトリ<br />
C$(VCInstallDir)bin<br />
以外に<br />
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin<br />
を追加。</p>
<p>それでも解決しなかったので、VC#をインストールしたら解決した。</p>
<p>自分の環境では<br />
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin<br />
の設定をはずしたらまた同じエラーが出たので両方必要な場合もあるっぽい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1367/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1367" />
	</item>
		<item>
		<title>maya: VisualStudio用pluginwizardのインストール</title>
		<link>http://blog.redhawk.jp/archives/1354?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=maya-visualstudio%25e7%2594%25a8pluginwizard%25e3%2581%25ae%25e3%2582%25a4%25e3%2583%25b3%25e3%2582%25b9%25e3%2583%2588%25e3%2583%25bc%25e3%2583%25ab</link>
		<comments>http://blog.redhawk.jp/archives/1354#comments</comments>
		<pubDate>Tue, 18 Aug 2009 10:29:36 +0000</pubDate>
		<dc:creator>reciente</dc:creator>
				<category><![CDATA[maya]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[VisualC++]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://blog.redhawk.jp/?p=1354</guid>
		<description><![CDATA[こちらのサイトを参考にしました。感謝。 [ maya plug-in ]プラグイン開発 getting start （mayaは、2008, 2009 両方で動作確認。 VisualStudioは2008で確認） maya + VisualStudio をインストールする。 C:\Program Files\Autodesk\Maya2009\devkit\pluginwizard 内にある、「MayaPluginWizard2.0.zip」を解凍する。 「_MayaPluginWizard」フォルダが作成される。 解凍したフォルダ内の MayaPlugInWizard.vsz を編集 Wizard=VsWizard.VsWizardEngine.7.1 ↓ Wizard=VsWizard.VsWizardEngine.9.0 「MayaPlugInWizard.ico」、「MayaPlugInWizard.vsz」「MayaPluginWizard.vsdir」 を C:\Program Files\Microsoft Visual Studio 9.0\VC\vcprojects へと移動。 「MayaPluginWizard」を C:\Program Files\Microsoft Visual Studio 9.0\VC\VCWizards へと移動 C:\Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults 内にある、「CoreWin.vsprops」を開き、編集。 AdditionalDependencies=&#8221;kernel32.lib&#8221; ↓ AdditionalDependencies=&#8221;kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib [...]]]></description>
			<content:encoded><![CDATA[<p>こちらのサイトを参考にしました。感謝。<br />
<a href="http://blog.taikomatsu.com/2007/03/09/maya-plug-in-%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E9%96%8B%E7%99%BA-getting-start/">[ maya plug-in ]プラグイン開発 getting start</a></p>
<p>（mayaは、2008, 2009 両方で動作確認。 VisualStudioは2008で確認）<br />
maya + VisualStudio をインストールする。</p>
<p>C:\Program Files\Autodesk\Maya2009\devkit\pluginwizard<br />
内にある、「MayaPluginWizard2.0.zip」を解凍する。<br />
「_MayaPluginWizard」フォルダが作成される。</p>
<p>解凍したフォルダ内の<br />
MayaPlugInWizard.vsz<br />
を編集</p>
<p>Wizard=VsWizard.VsWizardEngine.7.1<br />
↓<br />
Wizard=VsWizard.VsWizardEngine.9.0</p>
<p>「MayaPlugInWizard.ico」、「MayaPlugInWizard.vsz」「MayaPluginWizard.vsdir」 を<br />
C:\Program Files\Microsoft Visual Studio 9.0\VC\vcprojects<br />
へと移動。</p>
<p>「MayaPluginWizard」を<br />
C:\Program Files\Microsoft Visual Studio 9.0\VC\VCWizards<br />
へと移動</p>
<p>C:\Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults<br />
内にある、「CoreWin.vsprops」を開き、編集。</p>
<p>AdditionalDependencies=&#8221;kernel32.lib&#8221;<br />
↓<br />
AdditionalDependencies=&#8221;kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib&#8221;</p>
<p>ODBCとか使ってる時は、odbc用のlibも読み込まれている場合がある。</p>
<p>File -> New -> Project -> Visual C++ -> MayaPluginWizard を選択する。<br />
（この時点で表示されいない場合、今までの設定に間違いがある）</p>
<p>次にプロジェクト毎に、インクルードファイル、libファイルの設定を行う。</p>
<p>Project -> [Project Name] properties&#8230; [Alt + F7]<br />
Configuration Properties<br />
&nbsp;&nbsp;C/C++<br />
&nbsp;&nbsp;&nbsp;&nbsp;General<br />
Additional Include Directories<br />
に<br />
C:\Program Files\Autodesk\Maya2008\include<br />
を追加する。</p>
<p>Configuration Properties<br />
&nbsp;&nbsp;Linker<br />
Additional Library Directories<br />
に<br />
C:\Program Files\Autodesk\Maya2008\lib<br />
を追加する。</p>
<p>MayaPluginWizardを使わなくくても、エントリークラスと設定がきちんと書かれていれば<br />
maya plugin として、きちんと認識する。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.redhawk.jp/archives/1354/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.redhawk.jp/archives/1354" />
	</item>
	</channel>
</rss>
