- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 opengl-es 在 android 中使用多线程制作游戏:
class World{
protected static final AtomicInteger entityLock = new AtomicInteger();
private GameEntity entities[];
public World(){
// populate game world with entities
// executed on main thread
addEntity(new GameEntity("tank"));
addEntity(new GameEntity("rifleman"));
addEntity(new GameEntity("rifleman"));
}
void update(){
synchronized(entityLock){
for(int i = 0;i<entities.length;i++){
// move entity to new position
// executed on PhysThread
entities[i].updatePosition();
}
}
if(entity.isDead(){
// remove entity. Enter sync block inside removeEntity() method
removeEntity(entity);
}
}
void draw(GL10 gl){
synchronized(entityLock){
for(int i = 0;i<entites.length;i++){
// draw models
// executed on GLThread
Vector3 entityPosition = entities[i].getPosition();
gl.glTranslatef(entityPosition.x, entityPosition.y, entityPosition.z);
entities[i].draw();
}
}
}
public void addEntity(GameEntity entity){
synchronized(entityLock){
// arrays stuff
}
}
public void removeEntity(GameEntity entity){
synchronized(entityLock){
// arrays stuff
}
}
}
class MyRenderer implements GLSurfaceView.Renderer{
World world;
public MyRenderer(World world){
this.world = world;
}
public void onDrawFrame(GL10 gl) {
// executed on GLThread
world.draw(gl);
}
}
class PhysThreadRunnable implements Runnable{
private long tickRate = 30;
private World world;
private PhysThreadRunnable(World world){
this.world = world;
}
protected void setTickRate(long tickRate){
this.tickRate = tickRate;
}
public void run() {
while(true){
try {
// executed on PhysThread
world.update();
Thread.sleep(1000/tickRate);
} catch (InterruptedException e) {
return;
}
}
}
}
MyActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
World world = new World();
// sets up the game world, populates it with entities
// set up GLSurfaceView (simplified)
setContentView(R.layout.main);
GLSurfaceView mGLView = findViewById(R.id.myGLSurfaceView);
mGLView.setRenderer(new MyRenderer(world));
// start phys thread
PhysThreadRunnable physThreadRunnable = new PhysThreadRunnable(world);
Thread physThread = new Thread(physThreadRunnable);
physThread.start();
}
}
我有一个问题,有时(但不是每次)当我开始游戏时,PhysThread 卡住等待锁被释放(即当我去调试和暂停线程时,它只是坐在 synchronized(entityLock)
inside update()
真正奇怪的是,一段时间后(2 秒到 1 分钟之间),PhysThread 将被解除阻塞,游戏将继续进行,而不会在线程循环的多次迭代中任何线程被锁定。 (即游戏运行良好)
编辑:我在示例中添加了一些额外的内容,以防万一这是问题的原因。基本上,更新和绘制实体数组而不是单个实体
最佳答案
我认为这里的问题可能是“同步” block 无法保证公平。
OpenGL 线程将始终连续渲染,因此它会在完成后立即尝试重新进入 onDraw。由于允许哪个线程进入同步块(synchronized block)的选择是任意的,因此 OpenGL 线程可能会在将锁释放给物理线程之前尝试重新获取锁,并根据一些任意标准将锁授予它并在不允许物理线程进入的情况下结束。
这可以解释为什么它有时会发生而不是其他,因为这是一个任意的决定。
您可以尝试实现公平锁而不是同步块(synchronized block),或者使 OpenGL 自上次物理更新后不会多次尝试重绘场景(让渲染线程 hibernate 直到发生更新).
关于java - 与 Android 中的 GLThread 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11639734/
我刚刚向 Android 市场发布了我的应用程序的新版本,我的新版本在 Activity 中有一个 GLSurfaceView。尽管我没有做任何花哨的事情,但我有一个庞大的用户群,那里有很多不合标准的
我有一个问题。我的应用程序总是崩溃。代码来自this网站...这是一个非常好的教程,我做了他写的所有内容,但无论如何它都崩溃了...我是 openGlES 的新手,所以这可能是我犯的一个非常简单的错误
我使用 opengl ES 2.0 开发 opengl android 应用程序。我的应用程序崩溃并在日志中写入: 07-28 22:55:29.460 13407-13420/? E/Android
我正在使用 opengl-es 在 android 中使用多线程制作游戏: class World{ protected static final AtomicInteger entityLo
尝试使用 Map 对象添加对象时,在此函数的第 4 行出现并发修改异常: public void reloadResources() { taskQueue.add(new GLRes
我正在尝试使用 GLSurface 来显示自定义 View 。 我的xml 我的主要 package net.letsense.matrixtest; import android.a
我正在实现 Google Maps V2,并在其上绘制从外部 GPX 文件、设备路径、设备当前位置和交付点位置接收的交付路线。问题是它大部分时间都有效......接下来是我得到的错误(当它不工作时):
我正在开发一个使用 OpenGL ES 的应用程序,并且在启动应用程序逻辑之前尝试将纹理加载到内存中。我尝试了一些解决方案,但没有成功。 我的 Activity Oncreate 代码。我的 Acti
在我可以在我的 GLSurfaceView 中渲染任何东西之前,我必须运行大量的初始化 这些必须在 OpenGL 线程上完成。 然而,这会在初始化期间挂起我的主线程。 这是我的代码: @Overrid
我在谷歌上搜索了很多,发现了一些关于堆栈溢出的线程,但它没有帮助。我正在尝试通过调用 Intent 来使用 Android 的内置摄像头。这适用于 2.1,但在 2.2 上我得到“致命异常:GLThr
我正在使用 libgdx 制作安卓游戏。游戏运行良好,但在添加此行后应用程序开始随机关闭。game.debugRenderer.render(game.world,playerCamera.combi
我创建 cocos2d-x 应用程序我正在使用 cocos2d-2.0-x-2.0.4尝试在 Android 模拟器上从 Eclipse 运行应用程序时出现错误。 12-04 08:03:13.792
我是一名优秀的程序员,十分优秀!