Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有更理想的方式发送绘图命令?_Java_Android_Multithreading_Opengl Es_Synchronization - Fatal编程技术网

Java 是否有更理想的方式发送绘图命令?

Java 是否有更理想的方式发送绘图命令?,java,android,multithreading,opengl-es,synchronization,Java,Android,Multithreading,Opengl Es,Synchronization,我仍在努力将我的android应用程序移到OpenGL上,我再一次遇到了一个问题 我已经到了一切正常的地步,唯一的问题是动画似乎有点抖动 我正在监控帧速率,看到绘图线程没有变慢,但每隔一段时间,主循环就会变慢一点,我怀疑我有一个我担心的问题 该应用程序的工作方式是,当创建新对象(例如,敌人)时,实际上会创建两个对象。第一个对象在主线程中创建和映射,然后在其构造函数中创建网格对象,然后将其添加到渲染器连续绘制的组中 每次更改对象的属性(例如其坐标)时,对象都会将必要的命令传递给其网格对应对象(在本

我仍在努力将我的android应用程序移到OpenGL上,我再一次遇到了一个问题

我已经到了一切正常的地步,唯一的问题是动画似乎有点抖动

我正在监控帧速率,看到绘图线程没有变慢,但每隔一段时间,主循环就会变慢一点,我怀疑我有一个我担心的问题

该应用程序的工作方式是,当创建新对象(例如,敌人)时,实际上会创建两个对象。第一个对象在主线程中创建和映射,然后在其构造函数中创建网格对象,然后将其添加到渲染器连续绘制的组中

每次更改对象的属性(例如其坐标)时,对象都会将必要的命令传递给其网格对应对象(在本例中,用于平移网格)

有人认为这是线程安全的通信,但我对此表示怀疑。我还注意到,当创建新对象时,会有更多的帧跳过,我可以通过为相同的游戏对象重复使用相同的网格对象来解决这个问题,但我不相信这会自行解决所有问题

您能想出一种方法来提高效率和线程安全性吗


另一个可能的解决方案:游戏逻辑不必全速(实时)运行,我已将其实际设置为在33毫秒之前不进行更新。所以很明显,我应该在两帧之间有足够的时间画画,我可以设置画画,以便只在线程中的命令下(在游戏逻辑更新之后)调用画画吗?

看起来您需要类似于

使用其中之一,您可以将渲染器放在时间表上,使其以30fps的速度执行,让主/控制线程对帧之间的对象贴图执行任何需要执行的操作

我认为您不需要任何
wait/notify
联锁,因为您真正需要的是在渲染器运行时阻止对
map
的访问。要做到这一点,您只需使地图
同步
。由于这只会每1/30秒发生一次,因此您肯定不会引入显著的开销

您的主要目标应该是尽可能减少CPU上不必要的负载,这是顺利进行多线程工作的关键。试着花尽可能多的时间睡觉或睡觉

已添加

我从33毫秒减去循环所需的时间,并使用结果指定睡眠时间()


我想知道这是否是你的问题的一部分。在Windows机器上,您通常在
currentTimeMillis
上获得15毫秒的分辨率,因此您的睡眠最终可能根本无法入睡。使用
ScheduledThreadPoolExecutor
进行试验可能值得一试,看看它是否能改善您的计时。。。哎呀。。。这是安卓系统,不是吗。还是。。。这可能值得一试。

看起来你需要一种类似于手机的东西

使用其中之一,您可以将渲染器放在时间表上,使其以30fps的速度执行,让主/控制线程对帧之间的对象贴图执行任何需要执行的操作

我认为您不需要任何
wait/notify
联锁,因为您真正需要的是在渲染器运行时阻止对
map
的访问。要做到这一点,您只需使地图
同步
。由于这只会每1/30秒发生一次,因此您肯定不会引入显著的开销

您的主要目标应该是尽可能减少CPU上不必要的负载,这是顺利进行多线程工作的关键。试着花尽可能多的时间睡觉或睡觉

已添加

我从33毫秒减去循环所需的时间,并使用结果指定睡眠时间()


我想知道这是否是你的问题的一部分。在Windows机器上,您通常在
currentTimeMillis
上获得15毫秒的分辨率,因此您的睡眠最终可能根本无法入睡。使用
ScheduledThreadPoolExecutor
进行试验可能值得一试,看看它是否能改善您的计时。。。哎呀。。。这是安卓系统,不是吗。还是。。。可能值得一试。

您使用什么方法来中继网格的状态更改?我得到的印象是,这就是你感觉慢下来的地方。另外,如果你在创建新的播放器时观察到更多的帧跳过,你使用什么机制来创建它们?它们是新的线程吗?您正在使用执行器吗?我目前没有实现任何类型的中继,例如wait()或Notify()。另外,我创建新对象的方法是实现对象的哈希映射,并使用.put为每个新对象分配一个唯一的键。不,它们不是新线程,它们是非常简单的对象。敌人对象实际上只包含一些属性和更新它们所需的方法,它们创建的网格对象都是正方形,可以通过我实现的纹理管理器类对其进行纹理处理。这可能不太理想,但它可以让我简单地切换出每个帧使用的纹理。在讨论线程主题时,我注意到通常的做法是使用sleep()方法停止线程。我只需要我的应用程序以每秒30帧的速度运行。所以在游戏循环中,我有一些代码使用for循环来控制线程,直到最后一个循环周期开始的时间是33毫秒。我很久以前就这样做了,但我开始怀疑这可能会导致一些效率问题。即使它在循环中什么都不做,循环仍然以尽可能快的速度运行,尽可能多地消耗资源,对吗?不必要地占用cpu肯定不是一个好的设计。我还不清楚您的代码是如何组合在一起的,但是实现类似的东西的最整洁的方法是花足够长的时间来计算