atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • FPSを作ってみる@wiki
  • 進捗状況(2011
  • 10)

FPSを作ってみる@wiki

10)

最終更新:2011年11月01日 02:42

slice

- view
管理者のみ編集可

(2011/10/31)

ソケットとスレッド

現在,ソケット通信はブロッキング動作のAPIを各TCPセッション毎にスレッドを割り振り行っている.
各スレッドは並列に動くのでブロッキングしても問題ない.
しかしこれでは後々具合が悪い事に気付いた.

具体的には割り込み処理が出来ない.
SSL_write()やSSL_read()でブロッキングされているスレッドにアクセスする手段が無いのだ ※1
幸いtwitterクライアント程度のプログラムではコンマ秒を争うリアルタイム性は要らないので
一番単純な方法としてwrite()やread()をノンブロッキング動作に設定し
0.5秒毎とかにパケットが来てるか確認すれば目的は達成できる.
だがこれは所謂ポーリング,スマートとは言い難いし返答が来てから最悪(無意味に)0.5秒待たされる訳で効率も悪い.

何か要求が来るまではスリープしておいて,来たら直ぐに処理する・・・これはイベント(シグナル)を使わなければ出来まい.
ノンブロッキングにした所で意味は無い.

であるならばブロッキング動作はそのままにしwinsock側でソケットにイベントを設定しシグナルを待つ(WaitFor~),
1つのスレッドで複数のTCPセッションを管理する・・以前やった手法である.
スレッドに分ける意味は?と問われれば「それなりに重いHTTPヘッダやJSONの解析を,(もしあれば)複数のCPUで分担して出来る」位しか思いつかないが・・まあいいだろう ※2

#追記
ノンブロッキングにした所で~の項が誤解を招く表現になってしまっているので訂正.
winsockのソケット動作をWSAEventSelect()でノンブロッキングに設定しておき,データが受信されたらシグナルがセットされるようにする.
初回recv()を呼んでWSAEWOULDBLOCKが返ってきたら(つまりまだ受信されていない)先程のシグナルに加えユーザーキャンセル通知用のシグナルを一緒に
WaitForMultipleObjects()にて待つ.
そして通知が来たらデータ受信か,キャンセルかで分岐という寸法.

※1 スレッドをterminateとかは無しで.
※2 ゲームではどちらが優れているか?これもまた判断しかねる.どちらにせよメインスレッドと同期が必要だし.

(2011/10/29)

無駄骨

引き続きStreamAPIを受信する仕組みを実装中.

JSONデータが延々送りつけられるからこれを順番に解析してLuaに渡せばいいな・・・と思いきや
コンテンツタイプはJSONの筈なのになぜか必ず最初の行に数値が入っている事に気付く.

当初は「よくわからんけど最初の行だけとばせば良いんだろ?」程度にしか考えてなかったのだが
ふと見たらHTTPヘッダのTransfer-EncodingフィールドにChunkedとか書いてあるではないか.
早速調べるとこれはHTTP1.1で定義されている方式で,最初にBodyのサイズを決定せず文字通りChunkに分けて
本文を送信するらしい.
Chunkの形式は単純で,最初に数値でChunkのバイトサイズ,
改行を挟み内容,改行,・・・・が1セットで必要なだけこれを続ける.
通信を終わりたくなったらサイズを0にして内容は空行のChunkを送ればこれが終了の合図になる.

ということで無駄な小細工をしていて時間を浪費してしまった.そういう仕様なのね.

(2011/10/28)

SSL対応

予定通りOpenSSLを使用してのSSL対応が完了した.
SSL/TLS自体HTTPから独立しているお陰か初期化とソケット送受信の所を少し抽象化しただけで
本当にアッサリ動いてしまったので驚いた.
が,その後に早速Stream-APIを試そうとするもヘッダに記載するホスト名だけ書き換えて(api.twitter.com => stream.twitter.com)
実際の送付先(要するにIP)を変更し忘れるという凡ミスを犯す.
なんでNotFoundなんだろう~とか,何故かHTMLページ返して来るんですけど~とか.延々とトライアンドエラーの繰り返し.
ちなみにHTMLページの内容は存在しないアドレスにアクセスした時に表示される「そんなページありません云々」だった.

Stream-APIに対応出来ればまた完成に一歩近づく.
ただREST-APIの動作前提でLuaと連携を作っちゃったから実際にUserStreamで取得した呟きを垂れ流すには手直しが必要だろうな.

(2011/10/25)

マージのミス

行列クラスを操作していて直したはずの不具合が直ってない(※1)事に気付いた.早速ソースを見ると何か違和感が.
あれ?これって古いソースじゃん・・・
どうやらこの前書き直した数学ライブラリもどきを,SVNの不慣れな操作でコピー元と先を反対にマージしていたらしい.
ただ,どんな操作をしても履歴から消せないのはSVNの良い所だろうか(元々そう言う物らしいが)
無事に履歴を遡って上書きする前のファイルを救出できた.
その後古いソースに合わせて作っていた部分が山のようにエラーを吐くのでひたすら修正など.

折角ツイートを表示できるんだし次は
HTTPでツイートの発言者アイコンを取り込んで表示したいと思ったが
ホストアドレスやその他諸処の部分が「どうせTwitter.comとしか通信しないだろう」ってんでハードコーディングされてたり
構造体の名前とか通信スレッドの設計がTwitterAPIクラスと密になっているので分離せにゃイカンなあと.

他にはStreamAPIを将来的には使いたいのもあって予習を兼ねて
ドキュメントを眺めているとSSLしか対応していない模様.
自前でSSLを実装するのは・・・様々な暗号化アルゴリズムに対応させる部分が特に面倒で退屈そうなので遠慮しておく
ここは素直にOpenSSLを使う予定だ.

※1 主に行列とベクトルのエクスプレッションテンプレートな部分だけど詳細は割愛

(2011/10/22)

はいはい放置放置

作業時間の大半をLuaで過ごす日々.Lua・・というかスクリプト言語は単純な記述ミスでさえ実行しないと分からないという欠点が目に付く.
特にLuaに関して言えばlocalで定義したvalueという変数を参照しようと
間違えてValueと書いてしまった場合,ローカルに無い変数という事でそれはグローバル変数を意味する.
グローバル変数にそんなの無いよ!で終われば有り難いがLuaでは存在しない変数を読むと単にnilを返す.
通常nilに演算やテーブル参照を行うとその時点でエラーになるから通常,大きな問題にはならないかと思うが
偶然グローバルにValueがあったら大変な事に・・・
これは値をセットする時も同じだ.

さて,前回から進んだことをつらつら書く.

1.インデックス・頂点バッファのラップクラスを整備.
これらは元々UPバッファ(DrawPrimitiveUPで使う,GPU上に確保しないバッファ)を
効率よくハードウェアバッファに格納し纏めて描画する際に用いていたのだが,他のクラスで使いたくなったので分離.
機能は任意のサイズを全領域ロック,追加書き込みロックなど.
バッファ残量が足りる場合はD3DLOCK_NOOVERWRITEで,そうでなければD3DLOCK_DISCARDでロックしなるべくGPUを待たせないような工夫も.(当たり前の事だが)

2.自前HUDのウィンドウ描画の効率化.
今まではZバッファを使わず馬鹿正直に奥から描画していた所を
ZソートをきちんとしてZバッファの力を借りて手前から描画するとか(Zクリップの期待),
テクスチャでソートしてGPUの負担を減らす努力.
最初Z値の割り振りをどうするかなと悩んだが単純に手前からfloatの解像度限界ギリギリの 1.0/1e-22f 刻みでやってけばいいなと.

3.3D空間にテキストを描画する際にUPバッファ + CPUでビルボード計算していた所を
頂点数が多いのだからGPU上に確保した方が速そうな事に気付き,
ハードウェアバッファとワールド行列を使うようにした.

4.プールアロケータのクラスやbase64変換,URL変換,ハッシュ等々の関数は
他のアプリにも使いそうだなと思ったのでこれらをDLLへ分離した.
DLLを作ったのは久しぶりだから勝手がわからぬ.
基本的にSTLなんかのテンプレートクラス,関数はエクスポート出来なかったよな~とか復習しつつ.
そういえば例外も使えないのか・・・

あぁやっぱり速度関連なのねと思って頂いて結構.

ついでにこれからやろうとしている事をば.
3D空間をツイートが流れていくエフェクトに手をつけ始めた.
ようやく後のゲーム作成も視野に入れた下地が出来てきたかなあという印象で,割とサクサク進む <= モチベーションの維持に効果有り
現状だとツイートが光の柱に沿ってふわふわ流れていくだけなんだけどこれじゃゴチャゴチャして見難いから
遠くに見えるツイートは文字は表示せずにアイコンだけにして近くに寄ったら文字がフェードインする仕様に変えたい.

(2011/10/11)

リファクタリングはここまでにしておく

やっちまった.途中まで書いていた記事を,ついうっかり別のページをクリックして吹っ飛ばしてしまった.
他人がやったとなればハハンと笑って済ます自分だが,遂にというかやはりというか・・
ブログだと書きかけの文章を自動保存してくれたりもするがそこまで贅沢は言わない.
しかし,せめて草稿(アップするけどまだ公開しない)機能くらい欲しい.

閑話休題.今一度気力を振り絞り,書く(メモ帳で)

LuaValueクラスの最適化は終了.だが結果は・・・労力の割に微妙.数パーセント程度の高速化に留まる.
次はシングルスレッド専用リソースハンドル.
前回の「マルチスレッド対応させなくて良いリソースは,ロック・アンロックしない」という奴.
エンジン根幹に関わる変更なので折角だからとSVNのブランチ機能を試してみたり(内部的にはコピーのようだ)
そして一通り動作確認が終わったらマージ.大体手順は掴めた.

これもどのくらい速くなったかと言えばご想像の範囲内という事で.
それよりもテクスチャのソートやシェーダー変数のキャッシュが効いている.
1つ100文字程度の文章をビルボードで20個表示する部分をテクスチャソートしたら
(デバッグビルド基準で申し訳ないが)40FPSだったのが60FPSになった.キャッシュの力は凄い.

自前GUIも現状は半透明を使う関係で奥から手前へ,きちんと順序を守って描画しなければいけないのだが
不透明オンリーにしてテクスチャ + 距離でソートしたらどの位効果があるだろうか.ちょっと興味ある.
ウィンドウの枠もPOINTSTRIPではなく,何らかの手段でサイズを取得して「細長い四角形」として描画すべきだな.等々

さて先月「パフォーマンスアップばかりで云々~」と書いたばかりなのに関わらず今月も二の舞になりそうな香り・・
「10)」をウィキ内検索
LINE
シェア
Tweet
FPSを作ってみる@wiki
記事メニュー
  • トップページ
  • 参考資料ブックマーク等
  • Tips

Media

  • 頂き物
Screen shot
  • FPS_page1
  • FPS_page2
  • FPS_page3
  • Other_page1
Drawing
  • Drawing(analog)
  • Drawing(digital)
  • Drawing(digital) 2
  • Drawing(digital) 3
  • Drawing(digital) 4
  • Drawing(digital) 5
  • Drawing(digital) 6
  • Drawing(digital) 7
  • Drawing(digital) 8
  • Drawing(digital) 9
  • Drawing(digital) 10
  • Drawing(digital) 11
  • Drawing(digital) 12
  • Drawing(digital) 13
Movie
  • movies-list

Old Contents

  • トップページ(old)
  • メモ書き
  • 力仕事UP場
  • ゲームシステムとか
  • バグ・動作報告
  • program(twilve)

Progress log

  • (2018/03)
  • (2017/04)
  • (2017/03)
  • (2016/10)
  • (2016/09)
  • (2016/08)
  • (2016/07)
  • (2016/06)
  • (2016/05)
  • (2016/04)
  • (2016/03)
  • (2016/02)
  • (2016/01)
  • (2015/12)
  • (2015/11)
  • (2015/10)
  • (2015/09)
  • (2015/08)
  • (2015/07)
  • (2015/06)
  • (2015/05)
  • (2015/04)
  • (2015/03)
  • (2015/02)
  • (2015/01)
  • (2014/12)
  • (2014/11)
  • (2014/10)
  • (2014/09)
  • (2014/08)
  • (2014/07)
  • (2014/06)
  • (2014/05)
  • (2014/04)
  • (2014/03)
  • (2014/02)
  • (2014/01)
  • (2013/12)
  • (2013/11)
  • (2013/10)
  • (2013/09)
  • (2013/08)
  • (2013/07)
  • (2013/06)
  • (2013/05)
  • (2013/04)
  • (2013/03)
  • (2013/02)
  • (2013/01)
  • (2012/12)
  • (2012/11)
  • (2012/10)
  • (2012/09)
  • (2012/08)
  • (2012/07)
  • (2012/06)
  • (2012/05)
  • (2012/04)
  • (2012/03)
  • (2012/02)
  • (2012/01)
  • (2011/12)
  • (2011/11)
  • (2011/10)
  • (2011/09)
  • (2011/08)
  • (2011/07)
  • (2011/06)
  • (2011/05)
  • (2011/04)
  • (2011/03)
  • (2011/02)
  • (2011/01)
  • (2010/12)
  • (2010/11)
  • (2010/10)
  • (2010/09)
  • (2010/08)
  • (2010/07)
  • (2010/06)
  • (2010/05)
  • (2010/04)
  • (2010/03)
  • (2010/02)
  • (2010/01)
  • (2009/12)
  • (2009/11)
  • (2009/10)
  • (2009/09)
  • (2009/08)
  • (2009/07)
  • (2009/06)
  • (2009/05)
  • (2009/04)
  • (2009/03)
  • (2009/02)
  • (2009/01)
  • (2008/12)
  • (2008/11)
  • (2008/10)
  • (2008/09)
  • (2008/08)
  • (2008/07)
  • (2008/06)
  • (2008/05)
  • (2008/04)



記事メニュー2

Update Log

取得中です。
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. シュガードール情報まとめウィキ
  6. ソードランページ @ 非公式wiki
  7. ドラゴンボール Sparking! ZERO 攻略Wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. 星飼いの詩@ ウィキ
  10. Dark War Survival攻略
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. 発車メロディーwiki
  8. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. SDガンダム ジージェネレーションジェネシス 攻略Wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  2. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. 魚拓まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  4. 参加者一覧 - ストグラ まとめ @ウィキ
  5. 1103環境(遊戯王) - アニヲタWiki(仮)
  6. 前作からの変更点 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  8. コレクター・ユイ - アニヲタWiki(仮)
  9. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
  10. 画像倉庫 - 鹿乃つの氏 周辺注意喚起@ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.