当前位置:  编程技术>移动开发
本页文章导读:
    ▪多线程知识点收拾        多线程知识点整理基本概念 多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务,通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线.........
    ▪ 应用意图在Activity之间传递数据小插曲_传递对象        使用意图在Activity之间传递数据小插曲__传递对象 Android中Intent中如何传递对象有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件.........
    ▪ 手机游戏创业人的苦涩:成功率被指0.1%       手机游戏创业者的苦涩:成功率被指0.1% 乐动卓越CEO邢山虎(微博)正陷入“幸福的烦恼”。创业两年后,乐动卓越终于迎来爆发,其开发的手游《我叫MT》在苹果App Store上架后很快升到iPhone.........

[1]多线程知识点收拾
    来源: 互联网  发布时间: 2014-02-18
多线程知识点整理
基本概念

多线程程序在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务,通常,每一个任务称为一个线程,它是线程控制的简称。可以同时运行一个以上线程的程序称为多线程程序。

多进程与多线程的区别:

每个进程拥有自己的一整套变量,而线程则共享数据。

相关接口

•Runnable
◦ 方法 void run()
◦可由Runnable对象构成Thread,不要调用Thread类或者Runable对象的run方法,直接调用run方法,只会执行同一个线程中的任务,而不会启动新的线程。应该调用Thread.start方法,这个方法将创建一个执行run方法的新线程。
•Callable
◦方法 V call() throws Exception;
◦与Runnable类似,但有返回值
•Future
◦方法 V get() throws…
V get(long timeout, TimeUnit unit) throws ….
Void cancle(boolean mayInterupt) //取消计算,如果已经开始根据参数判断是否中断
boolean isCacelled()
boolean isDone() // 还在计算返回false,完成计算返回true
◦保存异步计算的结果,可以启动一个计算,将future对象交给某个线程,然后忘掉它,future对象的所有者在结果计算好之后就可以获得它。
◦第一个get方法的调用被阻塞,直到计算完成。如果在计算完成之前,第二个方法的调用超时,抛出一个timeoutException异常,如果运行该计算的线程被中断,两个方法都将抛出interruptedException,如果计算已经完成,那么get方法立即返回。
◦FutureTask 包装器是一种非常便利的机制,可将Callable转换成future和Runnable,它同时实现二者的接口
Callalbe myComputation = 。。。;
FutureTask task = new FutureTask(myComputation );
Thread t = new Thread(task);
t.start();
.….
V result = task.get();

线程的状态

要获得一个线程的状态,调用getState方法

•新生:当用new操作创建一个新线程时,该线程还没有开始运行,这意味着它的状态是新生。
•可运行:一旦调用start方法,线程处于runnable状态,记住在任何时刻,一个可运行的线程可能正在运行也可能没有运行
•阻塞/等待/计时等待:当线程处于被阻塞或等待状态时,它暂时不活动。它不运行任何代码且消耗最少的资源,直到线程调度器重新激活它。
1.当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态,当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态
2.当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。在调用object.wait方法或者thread.join方法,或者等待lock或condition时就会出现这种情况
3.有几个方法有一个超时参数,调用它们导致线程进入计时等待状态,这一状态将一直保持到超时期满,或者接收到适当的通知。
•终止:两个原因导致终止
1.因为run方法正常退出而自然死亡 (当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时)
2.因为一个没有捕获的异常终止了run方法而意外死亡

没有一个状态叫做中断,中断方法interrupt只是用来申请,当调用该方法时,线程的中断状态被置位。每个线程都应该不时地检查这个标志,以判断线程是否被中断。

如果线程被阻塞,就无法检测中断状态。当一个被阻塞的线程(调用sleep或者wait)上调用interrupt方法时,阻塞调用将会被InterruptedException异常中断。被中断的线程可以决定如何响应中断。

如果在中断状态被置位时调用sleep方法,它不会休眠,相反,它将清除这一状态并抛出InterruptedException。因此如果你的循环调用sleep,不会检测中断状态,应捕获InterruptException异常

线程的属性

•优先级:每一个线程有一个优先级,默认情况下,一个线程继承他的父线程的优先级。每当线程调度器有机会选择新线程时,它首先选择具有较高优先级的线程。Yield 方法导致当前执行线程处于让步状态,如果有其它的可运行线程具有至少与此线程同样高的优先级,那么这些线程接下来会被调用。
•守护线程:setDaemon(true)可将线程转换为守护线程。守护线程应该永远不去访问固定资源,如文件,数据库,因为它会在任何时刻甚至在一个操作的中间发生中断。

同步

•锁对象ReentrantLock
◦结构: myLock.lock();
try {}
finally{ myLock.unlock(); }
….
Lock myLock= new ReentrantLock();
◦这一结构确保任何时刻,只有一个线程进入临界区,一旦一个线程封锁锁对象,其他任何线程都无法通过lock语句,当其他线程调用locka时,它们被阻塞,直到第一个线程释放锁对象。
◦锁是可重入的,因为线程可以重复地获得已经持有的锁,锁保持一个持有计数来跟踪对lock方法的嵌套调用,线程在每一次调用lock都要调用unlock来释放锁。
•条件对象
◦结构:myLock.lock();
try{
while(! Ok to proceed)
{ myCondition.await(); } //当前线程被阻塞,并放弃了锁,进入该条件的等待集
do things
myCondition.signalAll(); //解除因为这一条件而等待的所有线程,这些线程竞争后,被激活的线程从阻塞点开始执行程序
}
finally{ myLock.unlock(); }
….
Lock myLock= new ReentrantLock();
Condition myCondition =myLock.newCondition();
◦一个锁对象可以有一个或多个相关的条件对象。

•synchronized关键字
◦结构:public synchronized void method()
{
while(! Ok to procee)
wait();
do things
notifyAll();
}
◦Java中的每一个对象都一个内部锁,如果一个方法用synchronized 声明,那么对象的锁将保护整个方法,也就是说,要调用该方法,线程必须获得内部的对象锁。
◦内部对象锁只有一个相关条件,wait方法放置一个线程到等待集中,nogifyAll方法解除等待线程的阻塞状态
相当于condition中的await和signalAll
◦将静态方法声明为synchronized 也是合法的,如果调用这种方法,该方法获得相关类对象的内部锁,因此没有其他线程可以调用同一个类的这个或任何其他的同步静态方法。
•同步阻塞
◦结构:synchronized(obj)
{ 。。。
}
Object obj = new Object();
•Volatile域
◦结构: public boolean isDone(){return done;}
public void setDone(){done = true;}
private volatile boolean done;
◦volatile关键字为实例域的同步访问提供了一种免锁机制,如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。
◦volatile变量不能提供原子性 例如:
public void flipdone() { done = !done ;} //not atomic 不能确保改变域中的值
◦在这样一种非常简单的情况下,可以使用java.util.concurrent.atomic中提供的包装器类,用于原子的整数,浮点数,数组等。该类有get和set方法,确保是原子的。该实现使用有效的机器指令,在不使用锁的情况下确保原子性。
•锁测试与超时
◦tryLock试图申请一个锁,在成功获得锁后返回true,否则立即返回false,而且线程可以立即离开做其他事情。
◦调用tryLock时可使用超时参数。lock方法不能被中断,如果出现死锁,lock方法将无法终止。然而如果调用带超时参数的tryLock,那么如果线程在等待期间被中断,将抛出InterruptedException,将允许打破死锁。
◦lockInterruptlibly相当于一个超时设为无限的tryLock方法
◦在等待一个条件await时,也可以设置超时
•读/写锁ReentrantReadWriteLock
◦结构: private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock ();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
◦readLock:得到一个可以被多个读操作共用的读锁,但会排斥所有写操作
◦writeLock:得到一个写锁,排斥所有其他所有读操作和写操作。

阻塞队列

•对于许多线程问题,可以通过使用一个或多个队列以优雅的且安全的方式将其形式化。生产者线程向队列插入元素,消费者线程则取出它们。使用队列,可以安全地从一个线程向另一个线程传递数据。在协调多个线程之间的合作时,阻塞队列是一个有用的工具。
•阻塞队列的方法分为3类:
1.put和take:当试图向满的队列中体添加,或从空的队列中移出元素时,导致线程阻塞。用于将队列当做线程的管理工具来使用。
2.add,remove和element,当试图向满的队列中体添加,或从空的队列中移出元素时抛出异常。
3.offer,poll和peek,当试图向满的队列中体添加,或从空的队列中移出元素时如果不能完成任务,只是给出一个错误提示(返回null),而不会抛出异常。
•阻塞队列的几个变种:
1.LinkedBlockingQueue : 没有上边界
2.ArrayBlockingQueue :构造时需要指定容量
3.priorityBlockingQueue:是一个带优先级的队列,而不是先进先出队列
4.DelayQueue:包含实现Delayed接口的对象

线程安全的集合

•阻塞队列也是线程安全的集合。
•其它集合:
1.ConcurrentHashMap : 有相应的方法用于原子性的关联插入以及关联删除 (散列映像表)
2.ConcurrentSkipListSet : 有序映像表
3.ConcurrentLinkedQueue : 无边界非阻塞队列
4.ConcurrentSkipListMap: 有相应的方法用于原子性的关联插入以及关联删除
•CopyOnWriteArrayList 和 copyOnWriteArraySet 是线程安全的集合。其中所有的修改线程对底层数组进行复制。如果在集合上进行迭代的线程超过修改的线程数,这样的安排是很有用的。当构建一个迭代器的时候,它包含一个对当前数组的引用,如果数组后来被修改了,迭代器仍然引用旧数组。
•Vector和HashTable是线程安全的,但后被弃用,取而代之的是ArrayList和HashMap,它们不是线程安全的。任何集合类通过使用同步包装器变成线程安全的。
List synchArrayList = Collections.synchronizedList(new ArrayList());
Map SynchHashMap = Collections.synchronizedMap(new HashMap());
结果集合的方法使用锁加以保护,提供了线程的安全访问。
如果在另一个线程可能进行修改时,要对集合进行迭代,仍需要使用同步阻塞,因为如果迭代过程中,别的线程修改该集合,迭代器会失效,抛出ConcurrentModificationException。最好使用java.utile.concurrent中定义的集合,不使用同步包装器,有一个例外经常被修改的数组列表,在那种情况下,同步的arrayList可以胜过copyOnWriteArrayList.

执行器

构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命周期很短的线程,应该使用线程池。一个线程池中包含许多准备运行的空闲线程,将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。

•执行器(Executor)类有许多静态工厂方法用来构建线程池:
1.newCachedThreadPool :对于每个任务,如果有空闲线程可用,立即让它执行任务,如果没有则创建一个新线程。
2.newFixedThreadPool :构建一个具有固定大小的线程池,如果提交的任务数多于空闲的线程数,那么把得不到服务的任务放置到队列中。
3.newSingleThreadExecutor:是一个退化了的大小为一个线程池,由一个线程执行提交的任务,一个接着一个。
4.3个方法的返回值都是实现了ExecutorService接口的ThreadPoolExecutor类的对象。
5.传递Runnable或者Callable对象的方法:
i.Future submit(Runnable task)
ii.Future submit(Runnable task,T result)
iii.Future submit(Callable task)
6.调用shutdown方法启动线程池的关闭序列,被关闭的执行器不再接受新的任务,当所有的任务都完成之后,线程池中的线程死亡。shutdownNow取消尚未开始的所有任务并试图中断正在运行的线程
•预订执行(ScheduledExecrtorService)接口具有为预订执行或重复执行任务而设计的方法,它是一种允许使用线程池机制的java.utile.timer的泛化。
1.newScheduledthreadPool
2.newSingleThreadScheduledExecutor
3.二者可以预订Runnable或Callable在初始的延迟之后之运行一次,也可以预订一个Runnable对象的周期性地运行
•控制任务组
1.invokeAny方法提交所有对象到一个Callable对象的集合中,并返回某个已经完成了的任务的结果,但是无法知道返回的究竟是哪个任务的结果(适用于多个线程处理,其中一个完成,则停止所有的情况,如搜索)
2.invokeAll方法提交所有对象到一个Callable对象的集合中,并返回一个future对象的列表,代表所有任务的。
3.ExecutorCompletionService 对结果按照可获得的顺序保存起来,然后进行处理
ExecutorCompletionService service = new ExecutorCompletionService (executor);
for(Callalbe task :tasks ) service.submit(task);
for(int i=0;i<task.size();i++)
{
processFuture(service.take().get());
}

    
[2] 应用意图在Activity之间传递数据小插曲_传递对象
    来源: 互联网  发布时间: 2014-02-18
使用意图在Activity之间传递数据小插曲__传递对象
Android中Intent中如何传递对象有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,通过一个简单的例子来给大家讲解一下。 

工程结构图: 

运行结果截图:
mainActivity截图

SerialActivity截图

ParcelActivity截图

Book.java: 
package com.intent.bean;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {
	private String bookName;
	private String author;
	private int publishTime;

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public int getPublishTime() {
		return publishTime;
	}

	public void setPublishTime(int publishTime) {
		this.publishTime = publishTime;
	}

	// 实例化静态内部对象CREATOR实现接口Parcelable.Creator
	public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
		// 将Parcel对象反序列化为Book
		public Book createFromParcel(Parcel source) {
			Book mBook = new Book();
			mBook.bookName = source.readString();
			mBook.author = source.readString();
			mBook.publishTime = source.readInt();
			return mBook;
		}

		public Book[] newArray(int size) {
			return new Book[size];
		}
	};
	
	@Override
	public int describeContents() {
		return 0;
	}

	// 实现Parcelable的方法writeToParcel,将Book序列化为一个Parcel对象
	@Override
	public void writeToParcel(Parcel parcel, int flags) {
		parcel.writeString(bookName);
		parcel.writeString(author);
		parcel.writeInt(publishTime);
	}
}

Person.java: 
package com.intent.bean;

import java.io.Serializable;

public class Person implements Serializable {
	private static final long serialVersionUID = -7060210544600464481L;
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

MainActivity.java: 
package com.intent.activity;

import com.intent.bean.Book;
import com.intent.bean.Person;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
	private Button btn_serial;
	private Button btn_parcel;
	public final static String SER_KEY = "com.intent.activity.ser";
	public final static String PAR_KEY = "com.intent.activity.par";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		setupViews();
	}

	// 我的一贯作风呵呵
	public void setupViews() {
		btn_serial = (Button) findViewById(R.id.btOpenSerialActivity);
		btn_serial.setOnClickListener(this);
		btn_parcel = (Button) findViewById(R.id.btOpenParcelActivity);
		btn_parcel.setOnClickListener(this);
	}

	// Serializeable传递对象的方法
	public void SerializeMethod() {
		Person mPerson = new Person();
		mPerson.setName("wulianghuan");
		mPerson.setAge(22);
		Intent mIntent = new Intent(this, SerialActivity.class);
		Bundle mBundle = new Bundle();
		mBundle.putSerializable(SER_KEY, mPerson);
		mIntent.putExtras(mBundle);
		startActivity(mIntent);
	}

	// Pacelable传递对象方法
	public void PacelableMethod() {
		Book mBook = new Book();
		mBook.setBookName("Think in java");
		mBook.setAuthor("stven");
		mBook.setPublishTime(2010);
		Intent mIntent = new Intent(this, ParcelActivity.class);
		Bundle mBundle = new Bundle();
		mBundle.putParcelable(PAR_KEY, mBook);
		mIntent.putExtras(mBundle);
		startActivity(mIntent);
	}

	// 铵钮点击事件响应
	public void onClick(View v) {
		if (v == btn_serial) {
			SerializeMethod();
		} else {
			PacelableMethod();
		}
	}
}

SerialActivity.java:
package com.intent.activity;

import com.intent.bean.Person;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SerialActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		TextView mTextView = new TextView(this);
		Person mPerson = (Person) getIntent().getSerializableExtra(MainActivity.SER_KEY);
		mTextView.setText("name: " + mPerson.getName() + " , "
				+ "age: " + mPerson.getAge());
		setContentView(mTextView);
	}
}

ParcelActivity.java: 
package com.intent.activity;

import com.intent.bean.Book;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class ParcelActivity extends Activity {
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		TextView mTextView = new TextView(this);
		Book mBook = (Book) getIntent().getParcelableExtra(MainActivity.PAR_KEY);
		mTextView.setText("name: " + mBook.getBookName() + " , "
				+ "Author: " + mBook.getAuthor() + " , " + "PublishTime: "
				+ mBook.getPublishTime());
		setContentView(mTextView);
	}
}

res/layout/main.xml 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btOpenSerialActivity"
        android:text="使用意图传递Serializable对象"/>
    
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btOpenParcelActivity"
        android:text="使用意图传递Parcelable对象"/>

</LinearLayout>


AndroidManifest.xml文件(将两个新增的Activity,SerialActivity,ParcelActivity)声明一下 :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.intent.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MainActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SerialActivity"/>
    </application>

</manifest>




    
[3] 手机游戏创业人的苦涩:成功率被指0.1%
    来源: 互联网  发布时间: 2014-02-18
手机游戏创业者的苦涩:成功率被指0.1%

乐动卓越CEO邢山虎(微博)正陷入“幸福的烦恼”。创业两年后,乐动卓越终于迎来爆发,其开发的手游《我叫MT》在苹果App Store上架后很快升到iPhone付费榜首位,仅仅两天的游戏限免后就有超过53万玩家注册并进入游戏。好运突然降临让服务器一度被拖垮。为缓解服务器压力,邢山虎不仅紧急调配港澳台繁体版,还亲自当起客服。

《我叫MT》推出前,乐动卓越可谓是惨淡经营,糟糕业绩甚至让邢山虎不敢开董事会。邢山虎曾透露,按照之前的现金流情况,乐动卓越撑到今年“五一”前后就会难以为继。《我叫MT》的推出则扭转了被动局面,还很有可能“赚大钱”。

邢山虎并不是第一个幸运儿。更高兴的当属光环游戏、数字顽石的员工。在春节即将到来之际,《神仙道》开发商光环游戏的创始人姚剑军(微博)宣布,奖励给员工6台宝马320Li。数字顽石CEO吴刚也宣布奖励员工4台宝马。他们的底气都来自去年在手机游戏上的成功:《神仙道》网页游戏成功后又推出手机版,去年宣称月赚千万;数字顽石旗下《二战风云》也实现月收入千万的目标。

手机游戏市场的火热不断吸引新玩家入驻。金山、蓝港已明显减少对大型端游研发,将更多精力投入到手游和页游。一家知名社交网站也已垂涎这手机游戏这块蛋糕,其创始人对腾讯科技透露,公司在2012年进行手机游戏立项,产品将于2013年上半年推出。网龙CFO胡泽民、360董事长周鸿祎(微博)、搜狗CEO王小川等也均对腾讯科技表示看好手机游戏市场。

不过,手游市场早已是一片红海,国内每个月流水达到千万的手机游戏厂商没几家,更多开发者经营惨淡。个人移动游戏开发者黄峻公开表示,个人游戏开发者已死。如果继续将游戏开发下去,自己可能某天就死在电脑前,而合伙伙伴可能要面临离婚。艾瑞分析师曹笛直言,移动游戏在2013年到2014年会实现飞跃,不过,当前市场存在不小泡沫。

泥巴网络董事长兼CEO王磊也对腾讯科技表示,大多数开发者很悲剧,仅仅是四川就有好几家手游公司在裁员,不少公司基本生存在生死线上。很多手机游戏即便能在App Store通过刷榜或者口碑传播能占据前列,但基本只能维持1个月左右时间。

毋庸置疑,手机游戏是移动互联网产业变现能力最强、也是最被看好的市场之一,但如何让这个市场更健康的成长,需要从业者更多思考。

手机游戏高速成长 创业者寄望通过游戏变现

当前移动互联网行业有很多产品,比如啪啪、唱吧、陌陌,看起来前途似锦,不过,却面临商业模式不清晰,用户黏性较差、变现能力不强等问题,用户并没培养出良好的付费习惯,支付体系尚未健全,品牌广告主仍持观望态度,市场仍需培养。此外,大的互联网巨头借助资本优势,强势进入市场,给中小企业造成威胁,渠道营销推广成本也在增高。

作为离钱最近的手机游戏自然受到青睐。搜狗CEO王小川公开表示,未来两年无线上的变现主要以游戏为主,游戏是移动互联网里最快能产生利润的领域,适合小团队创业。手机游戏会吸收大量创业者及更多智能手机用户,把手机用户变成移动互联网用户,花更多时间来使用智能机上打电话之外的应用。手机游戏将会在2013年获得大的爆发。

艾瑞报告也显示,截止2012年底,中国移动(微博)互联网网民数达6亿,超PC网民数,预计到2013年,移动游戏市场渗透率达25.25%。手机游戏市场规模将增长到78.5亿元。

遭遇融资困难的移动互联网创业者,为生存不得不改变玩法。一位国内知名社交产品创业者在守着当初的项目一年多后,开始寄望通过游戏扭转困境。这位创业者表示,做一个像唱吧、啪啪这样的产品不仅难,而且仅仅是外表光鲜,只能是苦苦的熬着。一些原来资历与能力不如自己的人却通过游戏身价上千万。“手机游戏更接地气,在商业上他们羡慕我们,说你们做唱吧、啪啪、陌陌太牛了,我们也觉得他们牛,说你们怎么挣那么多钱啊。”

上述人士强调,如今自己做游戏并非是不专注,搜狐能熬到今天当初也是靠SP,后来又靠游戏才挺过来,人人CEO陈一舟(微博)创业也是靠广告,靠游戏慢慢挺到最后。今天在移动互联网创业也一样,不能老靠VC投资,创业者要做有理想化的事业,也必须解决自身的生存问题,不能被一些互联网大佬心灵鸡汤式的话语给迷惑。

《神仙道》运营方黄一孟(微博)无疑是好例子,当初下载网站VeryCD差点关闭,黄一孟还哀叹:7年的心血和积累,说关就要关,说停就要停。没有人能甘心,但也早料到这一刻会突然到来。当初这一磨难却让黄一孟成功转型。如今《神仙道》已是最成功的网页游戏之一,黄一孟也成网页游戏市场的风云人物。不少创业者意图通过手机游戏再创这些的辉煌。

实际上,手机游戏市场的快速发展还是让不少游戏行业人士意外。仅仅在2012年初期,很多网游公司甚至认为端游依然占据主导地位,手机游戏仅仅是一个小市场,赚不了大钱,如今移动游戏市场迅猛扑来,不仅让很多端游公司的惶恐,更快这些公司的调整。金山CEO张宏江(微博)近日表示,金山将放弃研发新端游,新项目全部转型手机游戏和网页游戏。蓝港CEO王峰(微博)也表示,将重点扶持网页游戏和手机游戏发展。

创业者的苦涩:游戏成功率被指仅0.1%

手机游戏创业并未坦途。即便手游《我叫MT》取得暂时成功,邢山虎也不敢大意。邢山虎对腾讯科技坦言,做手游只是看上去热闹,如果一款游戏日活跃用户50万,端游公司年收入应该有四亿,而手游公司只是不至于立刻倒闭而已。

造成这一局面的原因在于苹果App Store的推荐位置有限,抢入前十才有希望获得更多用户主动下载。而App Store的推荐位置基本上是经常更新,邢山虎最大希望就是在春节前守住《我叫MT》在App Store的位置,春节后通过版本更新继续维系。

业内人士还指出,所谓手游企业月赚千万是指其在iOS和Android等平台的流水,扣除分成后开发商真正能赚的不会太多。业界有传闻称,苹果App store中国区分成前月收入实际是6000万元,如加上破解市场的91的月3500万,大概是1亿的月流水。分成后只剩下不到7000万的收入给所有的国内iOS开发商瓜分,这个数字只够页游《神仙道》、《神曲》一个月的收入流水,却要用其支撑起整个国内iOS创业团队、投资者的信心和对未来的想象力。

甚至有行业人士称,除了个别游戏外,一些手游宣称月赚千万其实存在很多虚假成分,之所以这么宣传是因为“有些企业想获得融资,吹出泡沫才可以有好的估值。之所以数字顽石能月赚千万,别人主要市场是在欧洲,赚的是欧元,能和国内比么?光环游戏发宝马车,也主要依靠的是网页游戏的《神仙道》。”

天使投资人曾李青曾表示,4年前投资的网页游戏每一个都很成功,而最近2年投的除极个别的以外几乎都关门了。“今天如果我们还想创业,想做一个百度和腾讯的可能性基本上没有,剩下的机会只是做出优秀的小公司。由于高房价和高生活压力,已经丧失了早年腾讯和华为出现的时候那种环境。现在投一个项目200、300万人民币,一年就花完了。”

有观点指出,国内网游市场规模是移动游戏规模5-8倍。如果网页游戏公司创业都要去死,那移动游戏只会死的更惨。甚至有人感叹称,移动游戏存在一个巨大的坑,只允许极少数人活下来,成功的几率仅有0.1%,却有无数的人往里面跳。

实际上,乐动卓越推出《我叫MT》前,也已推出了8款游戏,成功者寥寥。邢山虎坦言:“去年挣得一共都没到十万美元,有几款产品一分钱都没挣”。当乐网总裁肖永泉、摩卡CEO宋啸飞(微博)也均对腾讯科技坦言,2012年手机游戏虚火有点旺。

在水深火热之中的个人开发者黄峻就大吐苦水,称创业到现在每天都蹲家里,开发的第一个游戏,一开始评价还不错,限免的时候一天能下个几千个。忽然过了一两周,下载量下滑到几乎为零,特别是收费以后经常是零下载。尝试免费合作推广后基本上没作用,反而还被分去了几百块钱。刷榜则面临着很高的价格,基本一天5000,创业者根本消费不起。

黄峻称,推出另一款游戏后又是一样的结局,叫好不叫座。虽然画面精美,而且是3D画面合体类游戏,但下载量寥寥无几,甚至国内有一个网站提供了无限金币的破解版,这半年时间的辛苦等于又是付诸东流。最后自己都很犹豫是出门去找工作,还是继续坚持开发。

2013年手机游戏竞争更残酷

手机游戏行业注定成更大红海,无数人寄望如手游《我叫MT》般的幸运,摩卡CEO宋啸飞透露,2013年将推8款手机游戏。呈天游COO韩静也表示,今年将推3到4款游戏,她认为,2013年将是手机游戏洗牌的一年,这一年像盛大、完美、金山等大型端游公司将更大力度的杀入进来,小公司也将面临更尴尬地位,要么是一炮而红,要么是更快消亡。

对于手游市场的探索者来说,更多的则是碰碰运气。前文提及的社交产品创业者表示:“我们三个游戏今年马上要发布,也不知道未来会怎么样,也许三个都失败,也许有一款两款成功,即便都失败,我们还可以再做三款,这三款还不行,我们还可以继续再做三款。以一款100万的成本计算,我们还有足够的钱烧,这也意味着是机会。”

更多的创业者或许没有这样的机会,一项游戏不成功创业可能就遭遇失败。对此,数字顽石CEO吴刚表示,手游公司应对冲击时应该注意:别慌张,也别得意忘形,别赚钱就盲目扩充规模,把自己做成个端游公司。应该继续保持小团队灵活及核心玩法创新的优势,把钱用在自己最擅长的地方,而不是用在别人最擅长的地方。


    
最新技术文章:
▪Android开发之登录验证实例教程
c/c++ iis7站长之家
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3