プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
モーション切替パフォーマンス改善01
開発中のメイン画面
モーション切替のパフォーマンスが向上し、槍兵のモーションが切り替わるようになった。部隊移動の既存バグも改修された。



◎素朴な疑問

今回は、モーション切替が遅い原因を調査し、パフォーマンスの改善を図ります。

…で、原因調査で試行錯誤するうちに、ふと疑問が湧きました。

・モーション切替
 =板ポリのテクスチャ切替
  =エフェクト変更発生

というわけで、モーションが切り替わる瞬間のみ遅延するのであれば理解できますが、実際には戦闘中ずっと遅延状態が続きます。

攻撃モーションはきちんと再生されますが、内部的には移動→攻撃→移動→攻撃…のように連続で切り替わっているのかもしれません。



◎原因と対処

コンソールに出力して確認すると、「移動→停止→移動→停止…」でループするパターンや、「歩行→停止→攻撃→歩行→停止→攻撃…」でループするパターンがありました。

このような現象が発生した直接の原因は、移動速度変更メソッド内で、

・移動速度 = 0 の場合 → 停止

・移動速度 > 0 の場合 → 歩行

としていたので、攻撃等の別モーションが絡むと、モーション変更が多発し遅延してました。

停止モーションのテクスチャは歩行モーションと共通なので、遅延は発生しないと考えていたのですが、実際には攻撃時にも移動速度変更メソッドを呼び出していたようです。

移動速度変更メソッドと呼び出し側を修正して対処しました。



◎正しいのに…?

実はその後も「停止→攻撃→停止→攻撃…」等の別パターンが発覚し、それぞれ原因調査&修正しました。

例えば、「歩行→攻撃→歩行→攻撃…」は、下記の条件で発生しました。

・近接攻撃射程範囲内に敵部隊(ターゲット)が不在 &
 索敵範囲内に敵部隊(ターゲット)が存在する &
 移動速度が0
 →移動先の目的地を敵部隊(ターゲット)とする
 →移動速度を上げる(歩行開始モーション)

これは敵部隊が射程外の場合、敵部隊に向けて移動を開始する処理ですが、敵部隊が射程外なのに攻撃モーションに切り替わる(攻撃が発生する)理由がわかりませんでした。

どこかの判定処理がおかしいのかと疑い総チェックしましたが、プログラムは悪くなさそうです。結局この現象は「このパターンが存在する」という結論に至りました。

このパターンが存在するの図

・ターゲットは近接射程外なので、
 ターゲットに向けて移動開始

・他の敵部隊に攻撃されたので、
 移動を停止し攻撃モーションに移行

もし移動先に他の敵部隊が存在して邪魔な場合は、その敵部隊が新たなターゲットになります。しかし横や後ろの敵部隊は移動の邪魔になりません。その場合は最初のターゲットを目指すので、上記の状態がループします。

つまり、各部隊の動きはそれぞれ正しいのですが、しかしモーション切替が多発して遅延するのは問題です。

結局、複数部隊から攻撃された場合も考慮して、「攻撃を受けた部隊は、ターゲットが近接射程外だった場合のみ、ターゲットを変更する」ことにしました。



◎方針変更

こんな調子で修正を続けていくと、修正したパターンに関しては遅延現象が改善されるのですが、次のパターンでは、以前修正した部分も含めて全体の整合を見直す必要があります。

今後、(他の攻撃方法や計略など)パターンが無数に増えることを考えると、従来のやり方(ロジック)に限界を感じました。そこで、ロジック方針を変更します。

従来:
 アクションが変更されたタイミングでモーションを変更する

新方式:
 現在のアクションに応じたモーションを再生する
 (毎フレーム)


というわけで、ここまで修正したロジックをまた組み直します。はふぅ…。



◎既存バグ修正

新方式に修正してテストすると、それなりのパフォーマンスで動くようですが、一個所に多数部隊が集結すると激オモになりました。試しにモーション変更コードをコメント化しても、現象は変わりません。…あれ?この遅延はモーション切替と無関係?

結局この問題は、城に近付く部隊が城内駐留部隊をターゲットと認識することが原因だったので、駐留部隊を無視するよう改修しました。


また、あるタイミングから全ユニットの移動が停止することがあります。この現象は以前から不規則に発生して悩みのタネだったのですが、今回ようやく原因が判明しました。

移動経路定期探索中のユニットを(戦闘発生等の理由で)突然停止させると、定期探索処理はそのクライアントの再要求を永久に待ち続けてしまい、経路探索処理が実質機能停止してしまうのです。

原因が判れば対処は簡単。移動停止処理内で、探索要求クライアントをチェック&初期化したら、直りました。

また、攻撃中はターゲットの方へ向くようにしました。



ちょっと判り難いかもしれませんが、今回の動画は槍兵のモーションを切り替えています。
(騎兵や旗兵は攻撃モーション未作成)

部隊移動やモーション切替等の動作には満足していますが、肝心のパフォーマンスは…微妙ですね(汗)

以前よりは格段に向上したものの、多数の部隊が一斉に攻撃態勢に入ると、

30 ~ 60 fps → 8 ~ 20 fps

まで低下することがあります。1秒後には概ね回復するのが救いかな?



◎次回予告

次回は、部隊回避移動を実装します。

見栄えの向上や敵部隊の包囲が目的ですが、副作用として、遅延現象が若干緩和されるかもしれません。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。