2013-11-20 4 views
0

Я делаю 2D-игру с обработкой, когда добавляю свет, fps падает до 20 ~ с 30, если я добавлю еще один, он упадет еще больше. Но обработка использует только% 15 процессора, независимо от того, как я могу увеличить его, поэтому я могу видеть 30 кадров в секунду?Обработка процессора Ограничение

void castLight(int mapNum){ 
    color c = color(0, 0, 0); 
    if(mapNum == 1){ 
    for(int x = 0; x < width; x++){ 
     for(int y = 0; y < height; y++){ 
     if(improvedLights){ 
      putShadow = improvedLights();//not working 
     } else { 
      putShadow = true; 
     } 
     for(int i = 0; i < torchHolder1.size(); i++){ 
      if(dist(x, y, torchHolderX1.get(i), torchHolderY1.get(i)) <= maxDist){ 
      if(improvedLights){ 
       putShadow = improvedLights(); 
      } else { 
       putShadow = false; 
      } 
      } 
     } 
     if(putShadow){ 
      int loc = x+y*width; 
      float r,g,b; 
      r = red (pixels[loc]); 
      g = green (pixels[loc]); 
      b = blue (pixels[loc]); 
      r -= 100; 
      g -= 100; 
      b -= 100; 
      r = constrain(r, 0, 255); 
      g = constrain(g, 0, 255); 
      b = constrain(b, 0, 255); 
      if(torchAnimCounter % 31 < 16){ 
      c = color(r, g, b); 
     } else { 
      c = color(r+10, g+10, b+10); 
      } 
      pixels[y*width + x] = c; 
     } 
     } 
    } 
    for(int i = 0; i < torchHolderX1.size(); i++){ 
     for(int x = torchHolderX1.get(i) - maxDist; x < torchHolderX1.get(i) + maxDist; x++){ 
     if(x - maxDist < torchHolderX1.get(i) && x + maxDist > torchHolderX1.get(i)){ 
      torchCrossX = true; 
     } else { 
      torchCrossX = false; 
     } 
     for(int y = torchHolderY1.get(i) - maxDist; y < torchHolderY1.get(i) + maxDist; y++){ 
      if(y - maxDist < torchHolderY1.get(i) && y + maxDist > torchHolderY1.get(i)){ 
      torchCrossY = true; 
      } else { 
      torchCrossY = false; 
      } 
      float d = dist(x, y, torchHolderX1.get(i), torchHolderY1.get(i)); 
      if(torchCrossX && torchCrossY){ 
      if(dist(x, y, torchHolderX1.get(i), torchHolderY1.get(i)) <= maxDist){ 
       if(x > 0 && x < width && y > 0 && y < height){ 
       int loc = x+y*width; 
       float r,g,b; 
       r = red (pixels[loc]); 
       g = green (pixels[loc]); 
       b = blue (pixels[loc]); 
       float adjustBrightness = maxDist-d-100; 
       r += adjustBrightness; 
       g += adjustBrightness; 
       b += adjustBrightness; 
       r = constrain(r, 0, 255); 
       g = constrain(g, 0, 255); 
       b = constrain(b, 0, 255); 
       if(torchAnimCounter % 31 < 16){ 
        c = color(r, g, b); 
       } else { 
        c = color(r+10, g+10, b+10); 
       } 
       pixels[y*width + x] = c; 
       } } } } } } 
    }//and same things goes for the second map 
+1

мы будем благодарны больше информации о свете, потому что 2D-геометрия не требует молнии. Как вы это настроили или какой свет вы используете? Сколько у вас объектов в эскизе? Возможно, какой-нибудь фрагмент кода будет замечательным. – Majlik

+0

Я просто настраиваю яркость на основе расстояния между источником света и пикселями, без теней. У меня нет большого объекта в моем эскизе, не более 5-6 объектов существ и одного игрока. Я попытаюсь поместить некоторые фрагменты из кодов, которые регулируют яркость. (Ожидание 8 часов) – user3012462

+0

В общем, я бы предположил, что это количество вложенных циклов в вашей схеме draw(), которая, вероятно, замедляется ваша программа ... –

ответ

0

Почему бы не использовать встроенные возможности OPENGL для зажигания модели? Кажется, вы делаете много ручной обработки пиксельных данных для настройки яркости, предположительно для реалистичного затенения и т. Д., Но 3D-модель, размещенная в сцене с PointLight (или что-то еще), сделает все это, и она будет полностью преимущество графического процессора.

+0

Я не пробовал затенение с помощью OPENGL, но когда я переключаюсь на OPENGL, мое пиксельное искусство кажется ужасным. – user3012462

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