scribble code

twitter に書いていたネタのサルベージ。

  • LazyD3DDeviceContext

https://github.com/i-saint/LazyD3D11DeviceContext/blob/master/LazyD3D11DeviceContext.h
D3D11 はどんな些細な render state の変更も馬鹿正直に逐次ドライバの命令を呼びに行くらしく、例えば全く同じ内容の PSSetShaderResources() を 10000 回とか連続で呼んだら激烈に遅くなります。
これを改善するため、ID3D11DeviceContext を継承したものを独自に作成、render state の変更をバッファリングし、必要なタイミング (Draw, Dispatch, Map など) で初めて本来の device context に変更を伝える、という代物です。
ちなみに D3D9 ではこの LazyD3D11DeviceContext 相当のことを D3D9Device 自身が内部的にやっていたそうで、D3D10 を堺にそのような介入はなくなったそうです。

  • View Frustum Culling

https://github.com/i-saint/scribble/blob/master/ViewFrustumCulling.h
view frustum と AABB の交差判定を SSE でそれなりに高速に行うつもりのコード。これまでで趣味と仕事で 3,4 回同じ内容書いたのでコピペ用。
参考:
http://fgiesen.wordpress.com/2010/10/17/view-frustum-culling/
http://crazyjoke.free.fr/doc/3D/plane%20extraction.pdf

  • Print Callstack

https://github.com/i-saint/D3DHookInterface/blob/master/Utilities/Callstack.cpp
デバッグに大活躍のあれ。コールスタックを得てシンボル名や行番号を得て文字列として出力するコード。


https://github.com/i-saint/scribble/blob/master/ExceptionCallstack.cpp
SEH (access violation とかの Windows の例外) を捕まえてスタックフレームを辿ってリターンアドレスからシンボル名や行番号を得て文字列として出力するコード。