弾幕は1000発程度で限界?

シューティングゲーム作ってます.

1000発程度になると,我が3GHzのPen4でもかなり処理落ちが掛かってきてしまいます.

グラフィック関係も結構速かった気がするんですけどね・・・.

描写以外の処理をなくしてもたいして処理落ちが改善されないんですが,描写処理をなくすと60FPSが出ます.

これはどうするべきか.私が改善できるのは与えるパラメータだけですが,高速化できそうなのはfloatで計算して型変換してintにしていた座標を,固定小数点等を使ってintだけで計算するとかぐらいなんですよね・・・.

でもそんなことしても描写本体が重すぎて駄目でしょうし.

限界か・・・.

現在3本同時開発中

シューティングゲーム:60%(システムは完成したが,弾幕と敵の動きがしょぼ過ぎる.ゲームじゃない.)

オセロ(第三世代w):40%(具体的な処理はほとんど0)

カブロココンテスト :60%(ある程度.でもまだまだ)

さーてやる気の無さが露呈しておりますw

一番最優先はカブロボコンテストですが・・・数週間以内に参加したいな.

配列の読み込み速度の比較

ゲームプログラミングであれば,やはり速度は重要です.

STGをつくるにあたり,今回は配列の読み込み速度を測定してみました.

JavaでHello World コレクション(List)編

こちらでとりあえずArrayListとLinkedListの場合は速度が調べられているのでそれを使うとして,今回は普通の,配列の要素数の固定されている“なんとか[添え字]”で呼び出すやつを調べてみました.

一応,こちらでもLinkedListとArrayListを調べたほうが良いのでしょうが,上のサイトのサンプルソースがエラー9個も出てコンパイルできないので(爆*1,まあ割愛,ということで.

多分メモリ速度は大して変わらんでしょう.そんなに前の記事じゃないみたいだし.

以下,ソースです.

基本的にあのソース再利用してます.

import java.util.*;
public class List {
public static void main(String[] args) {
try {
long start, end;
int[] Matrix = new int[100000];
int tmp;
/** かきこみ **/
start = System.currentTimeMillis();
for (int i=1;i<100000;i++) {
Matrix[i] = i;
}
end = System.currentTimeMillis();
System.out.println("配列 かきこみ : " + (end - start));
/** よみこみ **/
// 配列
start = System.currentTimeMillis();
for (int i=1;i<100000;i++) {
tmp = Matrix[i];
}
end = System.currentTimeMillis();
System.out.println("配列 よみこみ : " + (end - start));
} catch (Exception e) {
e.printStackTrace();
}
}
}

で,実行してみます.

E:\***>java List
配列 かきこみ : 0
配列 読み込み : 0

はやっ!測定不能みたいです.

仕方ないので0の数を2つ*2ほど増やしてみます.

E:\***>java List
配列 かきこみ : 47
配列 読み込み : 47

うえwwww速すぎwwwww

と言うわけで,滅茶苦茶速いですね!

出来るだけ普通の配列を使いましょう(当然

*1:ArrayListをList型に入れようとしてもできない・・・らしい.これ,本当にこのときはコンパイルできたのか?

*2:3つ増やしたらヒープサイズが足りなくなりましたw

カブロボプログラム

株ロボコンテストっていうのが世間にはあるそうで.

どういうコンテストかっていうと株を自動売買するプログラムを募集して,そのプログラムと実際の株価データを使って取引させて,その結果でコンテストしてるらしいです.

これはやらないとね(何

すべてフリーでできます.アドレスは以下.

http://www.kaburobo.jp/

この入門書買ってきたんですけど,自分が考えた戦略はもうすでに書いてあった_| ̄|○

どういうのかって言うと,まず基本的な考え方として株価には上下する法則があるというもの.

んで,株価の大まかな動きを算出して,その平均を使って株価が上がり始めるとき,下がり始める時の平均株価をだして,それを上回る,もしくは下回ったらウォッチを開始して,あがりきる,もしくは下がりきって反対の方向に転じたら売る・もしくは買う.

一応実装してみようと思います.

この本の筆者が「少林卓球製作委員会」という謎な名前で出ていたので自分もその系統で行きそうな悪寒w

またオセロプログラム書いてるんだけど

こんな本かって来ました.

とりあえず今の状態を確認してみたところ,家にあった昔のVAIO-C1MRX(クルーソー0.7GHz)で動かしても,今のメインマシンのテトラ君2号(Pen4 3.0GHz)でも大して速度が変わらないんですよ.

CPUが違うとはいえ,クロックがこんなにも違うのに実行速度が同じってことは,別の部分に足を引っ張られて思考ルーチンが遅くなっているということ.

で,真っ先に思い浮かぶのがメモリアクセス.かなり無茶してます.盤面を元に戻すために配列のコピーをしたりとか普通です.

ぱっと本を読んだところ,メモリアクセスを最低にするためのテクなんかも載っているようです.

オリジナリティを無くさないためにほどほどにしつつ,参考にしたいと思います.

修飾キー設定用のJButton拡張クラス・キーリスナを設計しよう

タイトルのとおりです.私が色々やった結果を乗っけてます.

ソースは汚いのであまり乗せたくない・・・.

キーリスナに関して

KeyEvent#getModifiers()やKeyEvent#getKeyCode()を使って判断していきます.

何のキーを押しているかどうかを判断するには,KeyTypedかKeyReleasedを使うしかありません.

また,KeyReleasedを使うと,ユーザが

  • 修飾キーを押す
  • 別の普通のキーを押す
  • 修飾キーを離す
  • 別の普通のキーを離す

という順番で入力した場合,修飾キーしか判断されません.

(離す順番が逆なら大丈夫.)

というわけでKeyPressedを使って判断します.

しかし,KeyPressedを使ってもユーザが修飾キーを押せば修飾キーのみを,普通のキーを押せば普通のキーしか判断されません.

というわけで修飾キーの時は無視します.

最終的にKeyPressedのソースはこんな感じ.

public void keyPressed(KeyEvent e){
if(e.getKeyCode() == e.VK_SHIFT ||
e.getKeyCode() == e.VK_CONTROL ||
e.getKeyCode() == e.VK_META ||
e.getKeyCode() == e.VK_ALT){}else{//修飾キーの場合は無反応
/*キーの検出*/
/*ボタンテキストにキーのテキストを設定*/
/*キーの設定*/
/*リスナ(自分)の削除*/
}
}

KeyEvent#getSource()を使うとソースが省略できるかも.

Java:ショートカットをつけよう

Frame.addKeyListener(KeyListener e)では取得できない!

とりあえず真っ先に思いつく方法としてキーイベントを使ってみる方法があると思うんですが・・・.

ここを見る限り,フレーム上にキーリスナを取得しそうなコンポーネントがあると,もうだめ.

JFrame#processKeyEventをオーバーライドしてみるが・・・しかし・・・駄目.

このメソッドでキー入力は全て処理しているはずですから,これをオーバーライドすれば良いに違いない!

というわけで,オーバーライドしてショートカット処理をしてみたのですが,どうも呼ばれません.

デバッガで確認済み.ここに通知が来ないということなんですね・・・.

InputMapを使え!

こちらを見てください.これのとおり,InputMapとActionMapを組み合わせて使えば,出来るのではないかな・・・と.

とりあえず実装してみました.

・・・お,出来る!カンペキです.

ただし,問題点があって,ShiftやAltなどの修飾キーだけでは使えません・・・.

これは仕方が無いですね・・・.逆に修飾キーが無くても使えるので,まあ十分でしょう.

ショートカットキーに必ず修飾キーをつけなくちゃいけないというのも面倒ですから.

なに!Javaからネイティブコード使えるの?

Javaからネイティブコードを使ったプログラムが書けるらしい!

これなら妄想が実現できるかも!?

ここを参考にBorland C++ Compilerで組んでみますか・・・.

あと問題になるのは,プラグイン方式をどうやって実装するか.

サブクラスの検出とか出来るのかな・・・?

教えてえろいひと.