起動画面(タイトル)のActivityからMain(ゲーム部分)となるActivityに遷移しゲームが始まります。ここまで正常に動作するのですが、
その後、ゲームオーバーやバックキーでタイトル画面に戻った後、再びスタートを押してゲームを始めるとゲームが非常に低速になってしまいます。(1fps以下)
getStateメソッドで確認するとthreadの状態がTIMED_WATINGになっていました。
実現したいことは、ポーズ画面など特定、任意の状態でthreadを一時停止させることと、一度スタート画面のActivityに戻ったのち正常にthreadを走らせることです。
↓のページ同様にwait等も試してみたのですが、下のページの質問者同様に応答がなくなってしまいました。
https://groups.google.com/forum/#!topic ... G1H-1TJm9k
皆様のお知恵を拝借したくトピックを作成させていただきました。アドバイス等、どうかよろしくお願いします。
MainActivity(ゲーム本体部分のActivity)
package com.example.gamebase;
import java.util.LinkedList;
import javax.microedition.khronos.opengles.GL10;
import Tasks.BackGround;
import Tasks.Task;
import Tasks.UnitMgr;
import android.content.Context;
import android.util.Log;
public class GameMgr extends Thread{
private static GameMgr gMgr = new GameMgr();
private static boolean threadRunning = true;
private static LinkedList<Task> _taskList = new LinkedList<Task>(); //タスクリスト
public static GameContext gameContext;
static Context context;
private GameMgr(){}
public static GameMgr getInstance(Context _context, GL10 gl){
context = _context;
gameContext = new GameContext(gl);
_taskList.add( new FpsController() );
_taskList.add( new BackGround(context, gameContext) );
_taskList.add( new UnitMgr(context, gameContext) );
return gMgr;
}
public static void threadStopper(){
threadRunning = false;
}
@Override
public void run() {
while ((_taskList!=null) && (threadRunning == true)) {
if(gameContext.runState == gameContext.RUN){
gameContext.loopInc();
for(int i=0; i<_taskList.size(); i++){
if(_taskList.get(i).onUpdate(gameContext) == false){ //更新失敗なら
_taskList.remove(i); //そのタスクを消す
i--;
}
}
}else{
// Log.d("thread","thread Pause");
}
}
Log.d("threadState","thread Stoped");
return;
}
public void mainDraw(GL10 gl) {
for(int i=0; i<_taskList.size(); i++){
_taskList.get(i).mainDraw(gl);//描画
}
}
}
package glView;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;
import android.util.Log;
import com.example.gamebase.GameMgr;
public class MainRenderer implements Renderer {
private Context context;
public GameMgr gameMgrThread;
final float VIEW_WIDTH = 1080;
final float VIEW_HEIGHT = 1776;
public float scale;
public MainRenderer(Context _context){
context = _context;
}
@Override
public void onDrawFrame(GL10 gl) {
// 画面を塗りつぶす
gl.glClearColor(0.f, 0.4f, 0.2f, 1.f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
gameMgrThread.mainDraw(gl);
}
//*
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//サイズ対応部分
float scaleX = width / VIEW_WIDTH;
float scaleY = height / VIEW_HEIGHT;
if(scaleX > scaleY){
scale = scaleY;
}else{
scale = scaleX;
}
int xAdjustment = (int)((width-VIEW_WIDTH*scale)/ 2);
int yAdjustment = (int)((height-VIEW_HEIGHT*scale)/ 2);
gameMgrThread.gameContext.scale = scale;
gameMgrThread.gameContext.xAdjustment = xAdjustment;
gameMgrThread.gameContext.yAdjustment = yAdjustment;
// GLで利用する領域を設定
gl.glViewport(xAdjustment, yAdjustment, (int)(VIEW_WIDTH*scale), (int)(VIEW_HEIGHT*scale));
// gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, 0.0f, (int)(VIEW_WIDTH), (int)(VIEW_HEIGHT), 0.0f);// pixel指定
//F02E w:1080 h:1776
}
/*/
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL10.GL_PROJECTION);
GLU.gluOrtho2D(gl, 0.0f, 1080, 1776, 0.0f);//1776 1920
}
/**/
@Override
public void onSurfaceCreated(GL10 gl,javax.microedition.khronos.egl.EGLConfig config) {
//背景色をクリア
gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
//ディザを無効化
gl.glDisable(GL10.GL_DITHER);
//gl.glEnable(GL10.GL_DEPTH_TEST);
//テクスチャ機能ON
gl.glEnable(GL10.GL_TEXTURE_2D);
//透明可能に
gl.glEnable(GL10.GL_ALPHA_TEST);
//ブレンド可能に
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glDepthFunc(GL10.GL_LEQUAL);
context.getResources();
gameMgrThread = GameMgr.getInstance(context, gl);//new GameMgr(context, gl);
gameMgrThread.gameContext.gl = gl;
if(gameMgrThread.isAlive()){
gameMgrThread.gameContext.runState = gameMgrThread.gameContext.RUN;
}else{
Log.d("thread state" , gameMgrThread.getState().toString());
gameMgrThread.start();
}
}
}
package com.example.gamebase;
import java.util.LinkedList;
import javax.microedition.khronos.opengles.GL10;
import Tasks.BackGround;
import Tasks.Task;
import Tasks.UnitMgr;
import android.content.Context;
import android.util.Log;
public class GameMgr extends Thread{
private static GameMgr gMgr = new GameMgr();
private final static Object lock = new Object();//String("gameMgrLock");
private static boolean threadRunning = true;
private static LinkedList<Task> _taskList = new LinkedList<Task>(); //タスクリスト
public static GameContext gameContext;
static Context context;
private GameMgr(){}
public static GameMgr getInstance(Context _context, GL10 gl){
context = _context;
gameContext = new GameContext(gl);
_taskList.add( new FpsController() );
_taskList.add( new BackGround(context, gameContext) );
_taskList.add( new UnitMgr(context, gameContext) );
return gMgr;
}
public void threadPoser(){
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void threadResumer(){
synchronized (lock) {
lock.notifyAll();
}
}
public static void threadStopper(){
threadRunning = false;
}
@Override
public void run() {
while ((_taskList!=null) && (threadRunning == true)) {
if(gameContext.runState == gameContext.RUN){
gameContext.loopInc();
for(int i=0; i<_taskList.size(); i++){
if(_taskList.get(i).onUpdate(gameContext) == false){ //更新失敗なら
_taskList.remove(i); //そのタスクを消す
i--;
}
}
}else{
// Log.d("thread","thread Pause");
}
}
Log.d("threadState","thread Stoped");
return;
}
public void mainDraw(GL10 gl) {
for(int i=0; i<_taskList.size(); i++){
_taskList.get(i).mainDraw(gl);//描画
}
}
}