只是想知道将位图绘制到画布的最快方法是什么?
目前我有一个位图(和绘图画布),我用它来缓冲绘图调用,然后当我绘制到画布时通过应用1px画布翻译有滚动效果.仅此一项就可以将帧速率从60+ FPS降低到~40,非常受欢迎.我现在不使用surfaceView(或GLSurfaceView),但只是想知道我是否遗漏任何会提高速度的东西.onDraw()代码如下
@Override
public void onDraw(Canvas canvas)
{
//update fps text
mFpsTracker.frameTouch();
if(mBufferedBitmap == null)
{
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
mBufferedCanvas = new Canvas(mBufferedBitmap);
}
paint.setColor(Color.BLUE);
mBufferedCanvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
mBufferedCanvas.translate(0, -1);
canvas.drawBitmap(mBufferedBitmap, 0, 0, null);
//draw fps
mTextPaint.setColor(Color.WHITE);
canvas.drawText(mFpsTracker.getFPSString(), 40, 40, mTextPaint);
invalidate();
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的Android应用程序,只显示一个空白的白色屏幕.当我按下HOME按钮关闭应用程序,然后尝试再次打开应用程序,它崩溃,我得到"强制关闭"按钮.在Eclipse中我收到此错误,"ActivityManager:警告:活动未启动,因为正在为用户保留当前活动." 我该如何修复此崩溃?
public class HelloAndroid extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new Panel(this));
}
class Panel extends SurfaceView implements SurfaceHolder.Callback {
private TutorialThread _thread;
public Panel(Context context) {
super(context);
// register our interest in hearing about changes to our surface
SurfaceHolder holder = getHolder();
holder.addCallback(this);
_thread = new TutorialThread(holder, this);
setFocusable(true);
}
@Override
public void onDraw(Canvas canvas) {
// Clear the background
canvas.drawColor(Color.WHITE);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int …Run Code Online (Sandbox Code Playgroud) 我正在制作一个动态壁纸,它在触摸屏幕时融入了一些水波纹效果,但我有点卡住了.
创建多个图像并循环创建一个波纹动画会不会更好?或者在将它放在画布上之前将位图扭曲一下会更好吗?
这是一个通过OpenGL完成的非常好的连锁效果的视频.
我对OpenGL还没有任何经验,并且想知道是否仍然可以在动态壁纸上创建2D水效果?
我在Android中创建游戏,我注意到游戏有内存泄漏.我设法将内存泄漏隔离到一个较小的应用程序,以便我可以看到很好的尝试和解决,如何解决它.
该应用程序使用一个surfaceview作为其视图,并附加一个线程,以便完成所有绘图到屏幕.当我开始一个新活动并关闭我当前正在使用的活动时,会发生内存泄漏.当我在我的测试应用程序上执行内存转储时,我可以看到这一点,因为它只是打开并关闭一个活动(活动a - >活动b - >活动a).我有点想法如何解决这个问题,因为我试图将我创建的所有引用归零(在线程内),iv尝试在我销毁视图时从surfaceview中删除回调,并且在活动中,它似乎没有任何区别.
MemoryLeakActivity.java
package memory.leak;
import memory.leak.view.MemoryLeak;
import android.app.Activity;
import android.os.Bundle;
public class MemoryLeakActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MemoryLeak(this));
}
}
Run Code Online (Sandbox Code Playgroud)
MemoryLeakViewThread.java
package memory.leak.thread;
import memory.leak.view.MemoryLeak;
import android.view.SurfaceHolder;
import android.graphics.Canvas;
public class MemoryLeakViewThread extends Thread {
private MemoryLeak view;
private boolean run =false;
public MemoryLeakViewThread(MemoryLeak view) {
this.view =view;
}
public void setRunning(boolean run) {
this.run =run;
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我编辑了这段代码,将Rect实例移出onDraw方法.我在几台设备上测试过它.
public class BallBouncesActivity extends Activity {
BallBounces ball;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ball = new BallBounces(this);
setContentView(ball);
}
}
class BallBounces extends SurfaceView implements SurfaceHolder.Callback {
GameThread thread;
int screenW; //Device's screen width.
int screenH; //Devices's screen height.
int ballX; //Ball x position.
int ballY; //Ball y position.
int initialY ;
float dY; //Ball vertical speed.
int ballW;
int ballH;
int bgrW;
int bgrH;
int angle;
int bgrScroll;
int dBgrY; //Background scroll speed.
float …Run Code Online (Sandbox Code Playgroud) 我正在制作一款游戏,因为我是Android新手,所以我的设计基于示例LunarLander代码.在它的设计中,GameThread.doStart()调用from GameActivity,然后线程从其GameThread.run()循环运行所有内容,如下所示(为清楚起见,大部分代码已被删除):
public class GameActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
gameView = new GameView(this);
fl = new FrameLayout(this);
fl.addView(gameView);
setContentView(fl);
gameThread = gameView.getThread();
gameThread.doStart();
}
}
Run Code Online (Sandbox Code Playgroud)
.
class GameThread extends Thread
{
public void doStart()
{
}
public void run()
{
while (running)
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();
// Use canvas
}
finally
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了解决我遇到的一些问题,我试图将更多控制权交给GameActivity,如下所示:
public class GameActivity extends Activity
{ …Run Code Online (Sandbox Code Playgroud) 我正试图在画布上移动一个球.a和b类似于x,y坐标位置.从我的代码中试图动态获取不同值的任何方式.a,b是全局变量.但似乎"invalidate()"或屏幕刷新仅在整个循环结束时发生.你知道为什么吗?.如果我必须在另一个线程上构建它,请建议我一些简单的代码.
private void shootBall(){
while (a>b){
a = getPositionX();
b = getPositionY();
invalidate();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我拼凑了一个简单的游戏循环,主要是使用看起来很普遍的技术,特别是在Java的杀手游戏编程书中,在本教程中我刚刚发现:这里 只是一个带有后台缓冲区的简单,定时的游戏循环.
问题是它不会以良好的FPS重绘屏幕.我能从摩托罗拉Xoom中获得的最好成绩是15FPS,目标是24.
如果我的后置缓冲区大小的一半,速度会大幅提升,所以我猜这个问题可能与利用Xoom上的屏幕有关(我的SurfaceView的大小是1280x727)...还有其他游戏看到了以相同的尺寸完美地运行.
我没有任何其他设备可以测试,所以我现在有点卡住了该做什么.
我做错了什么/失踪/无知?
我正在通过android andengine开发游戏.我想为菜单场景创建动画背景.我怎么能这样做?
android ×9
surfaceview ×2
andengine ×1
android-4.0-ice-cream-sandwich ×1
animated ×1
bitmap ×1
canvas ×1
crash ×1
effects ×1
frame-rate ×1
game-loop ×1
graphics ×1
live ×1
memory-leaks ×1
wallpaper ×1