teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2016/06/10 03:04

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -4,4 +4,57 @@
4
4
 
5
5
  SurfaceViewで速度が改善された理由はダブルバッファリングうんぬんではなく、SurfaceViewが開発者が自分で描画プログラムを描くことに特化しているからです。そして、それでカクカクするということは描画処理、及びアルゴリズムに問題が有るといえます。
6
6
 
7
- コードが書かれていないため、どこが悪いとは指摘できませんが…
7
+ コードが書かれていないため、どこが悪いとは指摘できませんが…
8
+
9
+ ---
10
+ 以下追記
11
+ ###コード改善のアドバイス
12
+ まずぱっとみ、Threadを作りすぎだと思います。設計としては、Sakura自身をスレッドにするのではなく、Sakuraの配列を管理するスレッドを作りましょう。簡素に書きますので、エラーとかあったらご容赦を。
13
+ ```Java
14
+ // CanvasView
15
+ public void run(){
16
+ // Sakura管理スレッドここから
17
+ Thread sakuraManageThread = new Thread(new Runnable() {
18
+ public void run() {
19
+ while(true) {
20
+ try{
21
+ Thread.sleep(5);
22
+ }
23
+ catch(InterruptedException e){
24
+ throw new RuntimeException(e);
25
+ }
26
+ for(int i=0;i<sakuraCount;i++) {
27
+ Sakura s = sakura[i];
28
+ s.update();
29
+ }
30
+ }
31
+ }
32
+ });
33
+ sakuraManageThread.start();
34
+ // ここまで
35
+ while (trueOrFalse == true){
36
+ //省略
37
+ }
38
+ }
39
+
40
+ // Sakura
41
+ // Thread継承をやめ、runのかわりに下記に置き換える
42
+ public void update() {
43
+ if(select == 1){
44
+ pointX += (Math.random() * 1);
45
+ }
46
+ else{
47
+ pointX -= (Math.random() * 1);
48
+ }
49
+
50
+ phi += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
51
+ theta += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
52
+ pointY += distanceY; //落下処理
53
+
54
+ setRotPosition();
55
+ }
56
+ // Thread継承をやめたので、MainActivityでstartを呼んでいる箇所も削除
57
+ ```
58
+
59
+ こうすることでむやみにThreadを500個増やすようなことがなくなります。
60
+ これで動作が改善するか確かめてみてください。