2017-02-03 2 views
0

Я делаю простой 2D-игра с холстом в android. Я думаю, этого достаточно для моей игры. Но блокировка и разблокировка операций холста с использованием около 40% 50 CPU. Это нормально? или Что мне делать? Существует мой код игры петли:Android Canvas с использованием слишком большого количества CPU

while(GVars.isGameRunning){ 
     c=holder.lockCanvas(); 
     p.setColor(Color.argb(255, 229, 43, 68)); 
     c.drawRect(GMethods.createRec(0,0,GVars.size[0], 90),p); 
     for (int i = 0; i < GVars.size[0]/110; i++){ 
      c.drawRoundRect(new RectF(i*100+30,100,i*100+130,100+100),10,10,p); 
     } 
     p.setColor(Color.argb(255,255,255,255)); 
     p.setTextSize(50); 
     c.drawText("Simple text:", 0,60, p); 
     holder.unlockCanvasAndPost(c); 
     try{Thread.sleep(GVars.waitTime/*waitTime =30*/);}catch(Exception ex){}; 
    } 

Извините за мой английский.

Редактировать: Я попробовал еще раз. (В основной теме) И теперь он использует% 10 процессора. Я думаю, что это то, чего я хочу. : D Спасибо!

@Override 
public void onDraw(Canvas c){ 
    p.setTextSize(50); 
    for (int i = 0; i < GVars.size[0]/110; i++){ 
     p.setColor(Color.argb(255,183, 33, 53)); 
     c.drawRoundRect(new RectF(i*100+i*10, 100+5, i*100+100+i*10, 100+100+10),10,10,p); 
    } 
    p.setColor(Color.argb(255,255,255,255)); 
    c.drawText("Test:", 0,60, p); 
    invalidate(); 
    try{Thread.sleep(20);}catch (Exception ex){} 
} 
+0

Вы должны использовать механизм событий Android, а не собственный цикл. –

+0

стр. Вы должны также включить класс и метод, который содержит ваш код, чтобы предоставить больше контекста. –

+0

У вас не должно быть 'Thread.sleep()' в 'onDraw()'. Это все равно заморозит основной поток приложения. Вам также не нужно вызывать 'invalidate()'. –

ответ

1

Цикл в вашем коде блокирует поток основного события. Вместо этого вы должны использовать механизм событий из Android API. В частности, вам необходимо переопределить View.onDraw().

+0

Нет, это не блокирует. Петля находится в другом потоке. Извините, я не упоминал об этом. – zekikos

+0

И я попробовал переопределить onDraw(), но он все еще использовал слишком много CPU. – zekikos

+0

@zekikos Вам нужно показать, что вы сделали. С помощью текущего кода покажите класс и метод, которые его содержат. Также покажите, что вы пытались сделать в 'onDraw()'. Возможно, вы подумали, что вы выполняете цикл в другом потоке, но это невозможно, поскольку вы можете использовать только представления в основном потоке пользовательского интерфейса. Если вы попытаетесь использовать их в другом потоке, ваше приложение потерпит крах с исключением. –

Смежные вопросы