<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; xpwang168</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/xpwang168/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 14:23:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>多线程切换View时线程不同步的问题 -- 游戏状态跳转管理</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/09/15/view/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/09/15/view/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 06:45:54 +0000</pubDate>
		<dc:creator>xpwang168</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[并行计算]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/09/15/view/</guid>
		<description><![CDATA[  目前我想到的解决线程不同步问题的方法： I 条件判断 view plain /** * 解决多线程切换View时线程不同步的问题 */ public static boolean hasInit; public GameView currentView; public void paint(Graphics g) { if(!hasInit) { return; } currentView.paint(g); } public void update() { if(!hasInit) { return; } currentView.update(); } public static boolean isRunning = true; public void run () { while (isRunning) { update(); paint(g); } [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>目前我想到的解决线程不同步问题的方法：<br />
I 条件判断<br />
view plain<br />
/**<br />
* 解决多线程切换View时线程不同步的问题<br />
*/<br />
public static boolean hasInit;</p>
<p>public GameView currentView;<br />
public void paint(Graphics g) {<br />
if(!hasInit) {<br />
return;<br />
}<br />
currentView.paint(g);</p>
<p>}</p>
<p>public void update() {<br />
if(!hasInit) {<br />
return;<br />
}<br />
currentView.update();<br />
}<br />
public static boolean isRunning = true;<br />
public void run () {<br />
while (isRunning) {<br />
update();<br />
paint(g);<br />
}<br />
}</p>
<p>public void switchState(GameView view) {<br />
hasInit = false;<br />
// 释放上个View的资源<br />
currentView.freeRes();<br />
currentView = view;<br />
// load新View的资源<br />
currentView.init();<br />
hasInit = true;<br />
}</p>
<p>public abstract class GameView {</p>
<p>public abstract void init();</p>
<p>public abstract void freeRes();</p>
<p>public abstract void paint(Graphics g);</p>
<p>public abstract void update();<br />
}</p>
<p>多个线程访问switchState跳转状态时，主线程run还在跑，而另外一个线程跳转状态时会出现：<br />
currentView.freeRes(); 当前资源已经释放，主线程却还在用的情况。<br />
currentView.init();新的View还没初始化完，主线程却已经开始用。<br />
用hasInit 来限制这段释放老资源load新资源的时间，比避免NullPointer的问题。</p>
<p>II 缓存机制<br />
以上方法只是表面上可行，其实根本上并没有解决问题，只是在一定程度上降低了几率而已<br />
view plain<br />
/**<br />
* 缓存机制来<br />
* 解决多线程切换View时线程不同步的问题<br />
*/<br />
public void paint(Graphics g) {<br />
currentView.paint(g);<br />
}</p>
<p>public void update() {<br />
currentView.update();<br />
}<br />
public static boolean isRunning = true;<br />
public void run () {<br />
while (isRunning) {<br />
ViewManager.changeView();<br />
update();<br />
paint(g);<br />
}<br />
}</p>
<p>/**<br />
* 界面基类<br />
* @author wangxueping01<br />
*/<br />
public abstract class GameView {</p>
<p>public abstract void init();</p>
<p>public abstract void freeRes();</p>
<p>public abstract void paint(Graphics g);</p>
<p>public abstract void update();<br />
}</p>
<p>/**<br />
* 界面管理<br />
* @author wangxueping01<br />
*/<br />
public class ViewManager {</p>
<p>/** 当前的View */<br />
public static GameView currentView;</p>
<p>/** 缓存的View */<br />
public static GameView cacheView;</p>
<p>/**<br />
* 缓存跳转的状态View<br />
* @param view<br />
*/<br />
public static void switchView(GameView view) {<br />
cacheView = view;<br />
}<br />
/**<br />
* 每帧最开始调用<br />
*/<br />
public static void changeView() {<br />
if (cacheView != null &amp;&amp; cacheView != currentView) {<br />
currentView = cacheView;<br />
// 释放上个View的资源<br />
currentView.freeRes();<br />
currentView = view;<br />
// load新View的资源<br />
currentView.init();<br />
}<br />
cacheView = null;<br />
}<br />
}</p>
<p>虽然缓存机制也不能保证完成线程同步，<br />
view plain<br />
switchView 和 changeView 应该是互斥的。<br />
但是对游戏来说，速度第一位。<br />
目前采用第二种 同步机制需要进一步研究<br />
III 同步机制<br />
给互斥的方法加上synchronized<br />
view plain<br />
public class ViewManager {</p>
<p>/** 当前的View */<br />
public static GameView currentView;</p>
<p>/** 缓存的View */<br />
public static GameView cacheView;</p>
<p>/**<br />
* 缓存跳转的状态View<br />
* @param view<br />
*/<br />
public static synchronized void switchView(GameView view) {<br />
cacheView = view;<br />
}<br />
/**<br />
* 每帧最开始调用<br />
*/<br />
public static synchronized void changeView() {<br />
if (cacheView != null &amp;&amp; cacheView != currentView) {<br />
currentView = cacheView;<br />
// 释放上个View的资源<br />
currentView.freeRes();<br />
currentView = view;<br />
// load新View的资源<br />
currentView.init();<br />
}<br />
cacheView = null;<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/09/15/view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

