小编Ste*_*hih的帖子

使用SurfaceView编程和用于游戏开发的线程策略

我正在使用SurfaceView和渲染线程来开发基于LunarLander等结构的游戏.

但是,我遇到了很多问题,我想在这里指出一切.我希望任何想要开发游戏的人都不需要再与他们斗争了.任何对结构有更好了解的人都可以分享他们的经验,因为我还是新手,并渴望学习:)

[1] thread.start()不应多次调用该函数.

在创建表面时创建线程时提到的许多文章,以便在使用该方法暂停活动后再次渲染:

public void surfaceCreated(SurfaceHolder holder) {
    // start the thread here so that we don't busy-wait in run()
    // waiting for the surface to be created
    if (thread.getState() == Thread.State.TERMINATED)
    {
        thread = new LunarThread(getHolder(), getContext(), getHandler());
    }
    thread.setRunning(true);
    thread.start();
}
Run Code Online (Sandbox Code Playgroud)

您可以看到,如果线程未终止且函数被调用,则活动崩溃.

[2]如果您按下"电源"或"红色电话"按钮,或者电话闲置几分钟,则活动将处于onPause()状态,但线程仍在运行.这是一个非常糟糕的做法,所以我需要找到让线程停止的方法,然后重新开始onResume().

[3]如果屏幕锁定是纵向/横向,并且您的游戏粘贴到另一个方向,则屏幕锁定会强制您"定向"一次.这意味着再次开始活动.我仍然无法找到解决方案.(正如我在Android屏幕方向错误中提到的那样)

以下是我修复这些问题的代码:

UIThread

public class UIThread extends Activity
{
    private gameView gameview;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        gameview = (gameView) findViewById(R.id.gameview);
    }
    protected …
Run Code Online (Sandbox Code Playgroud)

multithreading android surfaceview android-activity

15
推荐指数
1
解决办法
2万
查看次数

关于android画布绘图的效率

我一直想知道画布是否有限制边界.

我的意思是,如果我使用像drawline(), drawbitmap(), drawcircle(), android 这样的功能真的在画布上绘制一些东西并浪费一些CPU周期?

因为在所有绘图功能之后,屏幕上的实际图片打印由屏幕尺寸决定.如果我画出屏幕尺寸以外的东西,它就不会显示出来.

我想通过调用大量的绘图功能在我的画布上做一些小细节,并使我的表面"bling bling".如果它超出界限我不想使用它们,如果它们使我的绘图变慢.

我正在通过surfaceview的结构开展一个小游戏,感谢任何建议.

例如:

我有一个机器人从< - > b走出屏幕.

它需要20个绘图功能才能在画布上绘制机器人行走图片.如果我滚动屏幕,那么我可以看到机器人.

因此,如果屏幕外的绘图功能确实需要在屏幕上绘制的时间.我必须检测到只有用户可以看到机器人的位置,然后我画.否则,我没有.

如果绘图功能不浪费太多CPU周期,那么即使当前屏幕看不到机器人,我也可以每次绘制.

android canvas surfaceview

10
推荐指数
2
解决办法
7690
查看次数

杀死 Android 上的活动不会清除内存?

我有一个在 android 上运行的游戏。

基本上,它的结构就像lunarlander

我开始了我的活动,使用布局开始运行课程。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <my.darling.gameView
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

当我按下家时,我每次都可以回到我的比赛中。我总是关闭线程并创建一个新线程。

当我按下 BACK 按钮时出现问题。

我想我的比赛结束了。但是在“点击游戏”->“点击返回”4次之后

出现错误->“意外停止”

我已经覆盖了函数 :onPause()并调用了finish(). 但它仍然会发生。

谁能帮我?

memory android bitmap android-activity

3
推荐指数
1
解决办法
8124
查看次数

如何在从layout:main.xml初始化的类中调用startActivityForResult

这是与"如何从新旧数据中检索数据"相同的问题.

但在我的第一个活动中,我打了个电话setContentView(R.layout.main);.画布上有一个surfaceview图.

我知道的唯一方法是调用getContext()获取上下文,然后调用startActivity().但我不能startActivityForResult()从我得到的上下文调用,似乎它不支持,我只需要在我的活动类中调用它.

任何人都可以给我任何意见吗?

编辑:

这是我的代码:

public class gameView extends SurfaceView implements SurfaceHolder.Callback
{
    public gameView(Context context, AttributeSet attrs)
    {
        //This is how I do : 
        Intent intent = new Intent();
        intent.setClass(getContext(), inputCharactorName.class);
        getContext().startActivity(intent);
        //This what I WANT to , but I don't know how
        //Activity.startActivityForResult(null,FPS);
        //I want to start the activity here;
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-activity

3
推荐指数
1
解决办法
7126
查看次数

android surfaceview无法正常工作

这是一个简单的问题,但我无法弄清楚:

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>

<GG.My_pic.testA
        android:id = "@+id/myview"
        android:layout_width = "fill_parent"
        android:layout_height = "fill_parent"
    />

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

在月球着陆器中,主线程使用

    // tell system to use the layout defined in our XML file
    setContentView(R.layout.lunar_layout);
Run Code Online (Sandbox Code Playgroud)

但我不能用我的

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
Run Code Online (Sandbox Code Playgroud)

如果我将R.layout.main更改为 - > new testA(this),它就可以了

(testA是扩展SurfaceView实现SurfaceHolder.Callback的类)

为什么??

java android surfaceview

2
推荐指数
1
解决办法
3662
查看次数