forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Android (http://forum.boolean.name/forumdisplay.php?f=150)
-   -   Android, OpenGL 2.0 и многопоточность (http://forum.boolean.name/showthread.php?t=19125)

Igor 29.04.2014 02:59

Android, OpenGL 2.0 и многопоточность
 
Есть сильное чувство, что я чего-то не понимаю.
Методы обновления и рисования GLSurfaceView, вызываются в своём потоке. В другом потоке я меняю игровой мир с дофига большим состоянием (ибо стратегия).
На данный момент мне в голову приходит такой способ:
в потоке логики изменять состояние мира
PHP код:

synchronized(world){
   
//do something, причём может быть долгой операцией


вызывать рисование
PHP код:

view.queueEvent(new Runnable() {
   public 
void run() {
     
view.requestRender();
   }});
return 
true

и реализация рисования:
PHP код:

public void onDrawFrame(GL10 gl10) {
...
   
synchronized(world){
       
//рисование
   



Обновление мира и вызовы рисования скорее всего будут идти вперемежку.
Мне кажется, что если я вызову рисование, а потом сразу начну менять мир какой-нибудь долгой операцией (порядка секунды), то метод onDrawFrame, может быть вызван чуть позже, чем я начну снова менять мир - получится, что рисования изменений не произошло (вернее, оно завершится, но в лучшем случае через секунду), а так нехорошо.
Проще говоря, мне нужно заблокироваться до того момента, как экран будет обновлён, и только после возобновить поток с игровой логикой.
Как это по-человечески без велосипедов сделать?


Часовой пояс GMT +4, время: 13:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot