优化一点绘制性能

This commit is contained in:
MrZ626
2021-05-02 20:24:03 +08:00
parent e14307045d
commit 32403078bc
2 changed files with 86 additions and 91 deletions

View File

@@ -54,11 +54,12 @@ local setFont=setFont
local int,rnd,abs=math.floor,math.random,math.abs local int,rnd,abs=math.floor,math.random,math.abs
local min,sin=math.min,math.sin local min,sin=math.min,math.sin
local ins,rem=table.insert,table.remove local ins,rem=table.insert,table.remove
local SCR=SCR
local WIDGET,SCR,SCN=WIDGET,SCR,SCN
local xOy=SCR.xOy
local mx,my,mouseShow=-20,-20,false local mx,my,mouseShow=-20,-20,false
local touching--First touching ID(userdata) local touching--First touching ID(userdata)
local xOy=SCR.xOy
joysticks={} joysticks={}
local devMode local devMode
@@ -457,16 +458,15 @@ love.draw,love.update=nil--remove default draw/update
function love.run() function love.run()
local love=love local love=love
local SCN,WIDGET=SCN,WIDGET
local VOC,BG,SYSFX=VOC,BG,SYSFX local VOC,BG,SYSFX=VOC,BG,SYSFX
local TASK,LOG,TEXT=TASK,LOG,TEXT local TASK,LOG,TEXT=TASK,LOG,TEXT
local SETTING=SETTING local TEXTURE,TIME=TEXTURE,TIME
local TIME=TIME local SETTING,VERSION=SETTING,VERSION
local destroyPlayers=destroyPlayers
local STEP,WAIT=love.timer.step,love.timer.sleep local STEP,WAIT=love.timer.step,love.timer.sleep
local FPS=love.timer.getFPS local FPS,MINI=love.timer.getFPS,love.window.isMinimized
local MINI=love.window.isMinimized
local PUMP,POLL=love.event.pump,love.event.poll local PUMP,POLL=love.event.pump,love.event.poll
local frameTimeList={} local frameTimeList={}
@@ -485,9 +485,9 @@ function love.run()
return function() return function()
local _ local _
local t=TIME() local time=TIME()
local dt=t-lastFrame local dt=time-lastFrame
lastFrame=t lastFrame=time
--EVENT --EVENT
PUMP() PUMP()
@@ -533,11 +533,11 @@ function love.run()
--Draw cursor --Draw cursor
if mouseShow then if mouseShow then
local R=int((t+1)/2)%7+1 local R=int((time+1)/2)%7+1
_=minoColor[SETTING.skin[R]] _=minoColor[SETTING.skin[R]]
gc_setColor(_[1],_[2],_[3],min(abs(1-t%2),.3)) gc_setColor(_[1],_[2],_[3],min(abs(1-time%2),.3))
_=SCS[R][0] _=SCS[R][0]
gc_draw(TEXTURE.miniBlock[R],mx,my,t%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5) gc_draw(TEXTURE.miniBlock[R],mx,my,time%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc_draw(TEXTURE[ms.isDown(1)and'cursor_hold'or'cursor'],mx,my,nil,nil,nil,8,8) gc_draw(TEXTURE[ms.isDown(1)and'cursor_hold'or'cursor'],mx,my,nil,nil,nil,8,8)
end end
@@ -594,7 +594,7 @@ function love.run()
gc_setColor(1,1,1) gc_setColor(1,1,1)
gc_draw(TEXTURE.ws_dead,-20,20*i-20) gc_draw(TEXTURE.ws_dead,-20,20*i-20)
elseif status=='connecting'then elseif status=='connecting'then
gc_setColor(1,1,1,.5+.3*sin(t*6.26)) gc_setColor(1,1,1,.5+.3*sin(time*6.26))
gc_draw(TEXTURE.ws_connecting,-20,20*i-20) gc_draw(TEXTURE.ws_connecting,-20,20*i-20)
elseif status=='running'then elseif status=='running'then
gc_setColor(1,1,1) gc_setColor(1,1,1)
@@ -622,10 +622,10 @@ function love.run()
end end
--Fresh power info. --Fresh power info.
if t-lastFreshPow>2.6 then if time-lastFreshPow>2.6 then
if SETTING.powerInfo and LOADED then if SETTING.powerInfo and LOADED then
updatePowerInfo() updatePowerInfo()
lastFreshPow=t lastFreshPow=time
end end
if gc.getWidth()~=SCR.w then if gc.getWidth()~=SCR.w then
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())

View File

@@ -9,32 +9,13 @@ local gc_stencil,gc_setStencilTest=gc.stencil,gc.setStencilTest
local int,ceil,rnd=math.floor,math.ceil,math.random local int,ceil,rnd=math.floor,math.ceil,math.random
local max,min,sin,modf=math.max,math.min,math.sin,math.modf local max,min,sin,modf=math.max,math.min,math.sin,math.modf
local setFont,mDraw,mStr=setFont,mDraw,mStr local setFont,mDraw,mStr,mText=setFont,mDraw,mStr,mText
local TIME=TIME local SKIN,TEXTURE,IMG=SKIN,TEXTURE,IMG
local TEXT,COLOR,GAME,TIME=TEXT,COLOR,GAME,TIME
local shader_alpha,shader_lighter=SHADER.alpha,SHADER.lighter
local drawableText,missionEnum,minoColor=drawableText,missionEnum,minoColor
local frameColorList={ local frameColorList={[0]=COLOR.Z,COLOR.lG,COLOR.lB,COLOR.lV,COLOR.lO}
[0]=COLOR.Z,
COLOR.lG,
COLOR.lB,
COLOR.lV,
COLOR.lO,
}
--local function drawCell(y,x,id)gc_draw(SKIN.curText[id],30*x-30,-30*y)end
local function stencilBoard()gc_rectangle('fill',0,-10,300,610)end
local function drawGrid(P)
local d=P.fieldBeneath+P.fieldUp
gc_setLineWidth(1)
gc_setColor(1,1,1,P.gameEnv.grid)
for x=1,9 do
gc_line(30*x,-10,30*x,600)
end
gc_push('transform')
gc_translate(0,d-30*int(d/30))
for y=0,19 do
gc_line(0,30*y,300,30*y)
end
gc_pop()
end
local function boardTransform(mode) local function boardTransform(mode)
if mode then if mode then
if mode=="U-D"then if mode=="U-D"then
@@ -49,15 +30,35 @@ local function boardTransform(mode)
end end
end end
end end
local function applyFieldOffset(P,notNorm)
if not notNorm then gc_translate(150,0)end
local O=P.fieldOff
gc_translate(O.x+150,O.y+300)
gc_rotate(O.a)
gc_translate(-150,-300)
end
local function stencilBoard()gc_rectangle('fill',0,-10,300,610)end
local function drawGrid(P)
gc_setLineWidth(1)
gc_setColor(1,1,1,P.gameEnv.grid)
for x=1,9 do gc_line(30*x,-10,30*x,600)end
local dx=P.fieldBeneath+P.fieldUp
dx=dx-30*int(dx/30)
gc_translate(0,dx)
for y=0,19 do gc_line(0,30*y,300,30*y)end
gc_translate(0,-dx)
end
local function drawRow(h,V,L,showInvis) local function drawRow(h,V,L,showInvis)
local texture=SKIN.curText local texture=SKIN.curText
local t=TIME()*4 local t=TIME()*4
for i=1,10 do for i=1,10 do
if L[i]>0 then if L[i]>0 then
if V[i]>0 then if V[i]>0 then
local a=V[i]*.05 gc_setColor(1,1,1,V[i]*.05)
gc_setColor(1,1,1,a) gc_draw(texture[L[i]],30*i-30,-30*h)
gc_draw(texture[L[i]],30*i-30,-30*h)-- drawCell(j,i,L[i])
elseif showInvis then elseif showInvis then
gc_setColor(1,1,1,.3+.08*sin(.5*(h-i)+t)) gc_setColor(1,1,1,.3+.08*sin(.5*(h-i)+t))
gc_rectangle('fill',30*i-30,-30*h,30,30) gc_rectangle('fill',30*i-30,-30*h,30,30)
@@ -72,7 +73,7 @@ local function drawField(P)
if P.falling==-1 then--Blocks only if P.falling==-1 then--Blocks only
if ENV.upEdge then if ENV.upEdge then
gc_setShader(SHADER.lighter) gc_setShader(shader_lighter)
gc_translate(0,-4) gc_translate(0,-4)
--<drawRow> --<drawRow>
for j=start,min(start+21,#F)do drawRow(j,V[j],F[j])end for j=start,min(start+21,#F)do drawRow(j,V[j],F[j])end
@@ -90,7 +91,7 @@ local function drawField(P)
local h=1 local h=1
if ENV.upEdge then if ENV.upEdge then
gc_push('transform') gc_push('transform')
gc_setShader(SHADER.lighter) gc_setShader(shader_lighter)
gc_translate(0,-4) gc_translate(0,-4)
--<drawRow> --<drawRow>
for j=start,min(start+21,#F)do for j=start,min(start+21,#F)do
@@ -149,7 +150,7 @@ local function drawFXs(P)
for i=1,#P.moveFX do for i=1,#P.moveFX do
local S=P.moveFX[i] local S=P.moveFX[i]
gc_setColor(1,1,1,.6-S[4]*.6) gc_setColor(1,1,1,.6-S[4]*.6)
gc_draw(texture[S[1]],30*S[2]-30,-30*S[3])-- drawCell(S[3],S[2],S[1]) gc_draw(texture[S[1]],30*S[2]-30,-30*S[3])
end end
--ClearFX --ClearFX
@@ -168,13 +169,13 @@ local function drawGhost(P,clr)
local CB=P.cur.bk local CB=P.cur.bk
for i=1,#CB do for j=1,#CB[1]do for i=1,#CB do for j=1,#CB[1]do
if CB[i][j]then if CB[i][j]then
gc_draw(texture[clr],30*(j+P.curX-1)-30,-30*(i+P.ghoY-1))-- drawCell(i+P.ghoY-1,j+P.curX-1,clr) gc_draw(texture[clr],30*(j+P.curX-1)-30,-30*(i+P.ghoY-1))
end end
end end end end
end end
local function drawBlockOutline(P,texture,trans) local function drawBlockOutline(P,texture,trans)
SHADER.alpha:send("a",trans) shader_alpha:send("a",trans)
gc_setShader(SHADER.alpha) gc_setShader(shader_alpha)
local CB=P.cur.bk local CB=P.cur.bk
for i=1,#CB do for j=1,#CB[1]do for i=1,#CB do for j=1,#CB[1]do
if CB[i][j]then if CB[i][j]then
@@ -190,11 +191,11 @@ local function drawBlockOutline(P,texture,trans)
end end
local function drawBlock(P,clr) local function drawBlock(P,clr)
gc_setColor(1,1,1) gc_setColor(1,1,1)
local texture=SKIN.curText local texture=SKIN.curText[clr]
local CB=P.cur.bk local CB=P.cur.bk
for i=1,#CB do for j=1,#CB[1]do for i=1,#CB do for j=1,#CB[1]do
if CB[i][j]then if CB[i][j]then
gc_draw(texture[clr],30*(j+P.curX-1)-30,-30*(i+P.curY-1))-- drawCell(i+P.curY-1,j+P.curX-1,clr) gc_draw(texture,30*(j+P.curX-1)-30,-30*(i+P.curY-1))
end end
end end end end
end end
@@ -287,8 +288,8 @@ local function drawHold(P)
local ENV=P.gameEnv local ENV=P.gameEnv
if ENV.holdCount==0 then return end if ENV.holdCount==0 then return end
local holdQueue=P.holdQueue
local N=ENV.holdCount*72 local N=ENV.holdCount*72
local texture=SKIN.curText
gc_push('transform') gc_push('transform')
gc_translate(-140,36) gc_translate(-140,36)
gc_setColor(0,0,0,.4)gc_rectangle('fill',0,0,124,N+8) gc_setColor(0,0,0,.4)gc_rectangle('fill',0,0,124,N+8)
@@ -297,21 +298,22 @@ local function drawHold(P)
mText(drawableText.hold,62,-51) mText(drawableText.hold,62,-51)
gc_setColor(1,1,1) gc_setColor(1,1,1)
if #P.holdQueue<P.gameEnv.holdCount and P.nextQueue[1]then if #holdQueue<ENV.holdCount and P.nextQueue[1]then
N=1 N=1
else else
N=P.holdTime+1 N=P.holdTime+1
end end
gc_push('transform') gc_push('transform')
gc_translate(62,40) gc_translate(62,40)
for n=1,#P.holdQueue do for n=1,#holdQueue do
if n==N then gc_setColor(.6,.4,.4)end if n==N then gc_setColor(.6,.4,.4)end
local bk,clr=P.holdQueue[n].bk,P.holdQueue[n].color local bk,clr=holdQueue[n].bk,holdQueue[n].color
local texture=SKIN.curText[clr]
local k=#bk>2 and 2.2/#bk or 1 local k=#bk>2 and 2.2/#bk or 1
gc_scale(k) gc_scale(k)
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if bk[i][j]then if bk[i][j]then
gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i+1.36-#B*.5,j+2.06-#B[1]*.5,clr) gc_draw(texture,30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))
end end
end end end end
gc_scale(1/k) gc_scale(1/k)
@@ -343,25 +345,25 @@ end
local function drawFinesseCombo_norm(P) local function drawFinesseCombo_norm(P)
if P.finesseCombo>2 then if P.finesseCombo>2 then
local S=P.stat local S=P.stat
local _=P.finesseComboTime local t=P.finesseComboTime
local str=P.finesseCombo.."x" local str=P.finesseCombo.."x"
if S.finesseRate==5*S.piece then if S.finesseRate==5*S.piece then
gc_setColor(.9,.9,.3,_*.2) gc_setColor(.9,.9,.3,t*.2)
gc_print(str,20,570) gc_print(str,20,570)
gc_setColor(.9,.9,.3,1.2-_*.1) gc_setColor(.9,.9,.3,1.2-t*.1)
elseif S.maxFinesseCombo==S.piece then elseif S.maxFinesseCombo==S.piece then
gc_setColor(.7,.7,1,_*.2) gc_setColor(.7,.7,1,t*.2)
gc_print(str,20,570) gc_print(str,20,570)
gc_setColor(.7,.7,1,1.2-_*.1) gc_setColor(.7,.7,1,1.2-t*.1)
else else
gc_setColor(1,1,1,_*.2) gc_setColor(1,1,1,t*.2)
gc_print(str,20,570) gc_print(str,20,570)
gc_setColor(1,1,1,1.2-_*.1) gc_setColor(1,1,1,1.2-t*.1)
end end
if _>0 then if t>0 then
gc_push('transform') gc_push('transform')
gc_translate(20,600) gc_translate(20,600)
gc_scale(1+_*.08) gc_scale(1+t*.08)
gc_print(str,0,-30) gc_print(str,0,-30)
gc_pop() gc_pop()
else else
@@ -399,7 +401,6 @@ local function drawLife(life)
end end
local function drawMission(P) local function drawMission(P)
if not P.curMission then return end if not P.curMission then return end
local missionEnum=missionEnum
local L=P.gameEnv.mission local L=P.gameEnv.mission
local cur=P.curMission local cur=P.curMission
@@ -456,7 +457,7 @@ function draw.drawNext_norm(P)
gc_scale(k) gc_scale(k)
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if bk[i][j]then if bk[i][j]then
gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr) gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))
end end
end end end end
gc_scale(1/k) gc_scale(1/k)
@@ -494,7 +495,7 @@ function draw.drawNext_hidden(P)
gc_scale(k) gc_scale(k)
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if bk[i][j]then if bk[i][j]then
gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr) gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))
end end
end end end end
gc_scale(1/k) gc_scale(1/k)
@@ -514,21 +515,14 @@ function draw.drawNext_hidden(P)
end end
gc_pop() gc_pop()
end end
draw.applyFieldOffset=applyFieldOffset
function draw.applyFieldOffset(P,notNorm)
if not notNorm then gc_translate(150,0)end
local O=P.fieldOff
gc_translate(O.x,O.y)
gc_translate(150,300)
gc_rotate(O.a)
gc_translate(-150,-300)
end
function draw.drawTargetLine(P,r) function draw.drawTargetLine(P,r)
if r<21+(P.fieldBeneath+P.fieldUp)/30 and r>0 then if r<21+(P.fieldBeneath+P.fieldUp)/30 and r>0 then
gc_setLineWidth(4) gc_setLineWidth(4)
gc_setColor(1,r>10 and 0 or rnd(),.5) gc_setColor(1,r>10 and 0 or rnd(),.5)
gc_push('transform') gc_push('transform')
draw.applyFieldOffset(P) applyFieldOffset(P)
gc_line(0,600-30*r,300,600-30*r) gc_line(0,600-30*r,300,600-30*r)
gc_pop() gc_pop()
end end
@@ -543,7 +537,7 @@ function draw.norm(P)
--Field-related things --Field-related things
gc_push('transform') gc_push('transform')
draw.applyFieldOffset(P) applyFieldOffset(P)
--Fill field --Fill field
gc_setColor(0,0,0,.6) gc_setColor(0,0,0,.6)
@@ -585,10 +579,12 @@ function draw.norm(P)
local centerX=30*(P.curX+P.cur.sc[2])-15 local centerX=30*(P.curX+P.cur.sc[2])-15
--Draw ghost & rotation center --Draw ghost & rotation center
if ENV.ghost then drawGhost(P,curColor)end if ENV.ghost then
if ENV.center and ENV.ghost then drawGhost(P,curColor)
gc_setColor(1,1,1,trans*ENV.center) if ENV.center then
gc_draw(IMG.spinCenter,centerX,-30*(P.ghoY+P.cur.sc[1])+15,nil,nil,nil,4,4) gc_setColor(1,1,1,trans*ENV.center)
gc_draw(IMG.spinCenter,centerX,-30*(P.ghoY+P.cur.sc[1])+15,nil,nil,nil,4,4)
end
end end
local dy=ENV.smooth and P.ghoY~=P.curY and(P.dropDelay/ENV.drop-1)*30 or 0 local dy=ENV.smooth and P.ghoY~=P.curY and(P.dropDelay/ENV.drop-1)*30 or 0
@@ -697,7 +693,7 @@ function draw.norm_remote(P)
--Field-related things --Field-related things
gc_push('transform') gc_push('transform')
draw.applyFieldOffset(P) applyFieldOffset(P)
--Draw username --Draw username
setFont(30) setFont(30)
@@ -816,12 +812,12 @@ function draw.norm_remote(P)
--Score & Time --Score & Time
setFont(25) setFont(25)
local tm=int(P.stat.time*100)*.01 local time=int(P.stat.time*100)*.01
gc_setColor(0,0,0,.3) gc_setColor(0,0,0,.3)
gc_print(P.score1,18,509) gc_print(P.score1,18,509)
gc_print(tm,18,539) gc_print(time,18,539)
gc_setColor(COLOR.lY)gc_print(P.score1,20,510) gc_setColor(COLOR.lY)gc_print(P.score1,20,510)
gc_setColor(COLOR.N)gc_print(tm,20,540) gc_setColor(COLOR.N)gc_print(time,20,540)
drawFinesseCombo_remote(P) drawFinesseCombo_remote(P)
drawLife(P.life) drawLife(P.life)
@@ -894,7 +890,7 @@ function draw.demo(P)
gc_translate(P.x,P.y) gc_translate(P.x,P.y)
gc_scale(P.size) gc_scale(P.size)
gc_push('transform') gc_push('transform')
draw.applyFieldOffset(P,true) applyFieldOffset(P,true)
--Frame --Frame
gc_setColor(0,0,0,.6) gc_setColor(0,0,0,.6)
@@ -920,13 +916,12 @@ function draw.demo(P)
gc_pop() gc_pop()
local blockImg=TEXTURE.miniBlock local blockImg=TEXTURE.miniBlock
local libColor=minoColor
local skinSet=ENV.skin local skinSet=ENV.skin
--Draw hold --Draw hold
local N=1 local N=1
while P.holdQueue[N]do while P.holdQueue[N]do
local id=P.holdQueue[N].id local id=P.holdQueue[N].id
_=libColor[skinSet[id]] _=minoColor[skinSet[id]]
gc_setColor(_[1],_[2],_[3],.3) gc_setColor(_[1],_[2],_[3],.3)
_=blockImg[id] _=blockImg[id]
gc_draw(_,15,40*N-10,nil,16,nil,0,_:getHeight()*.5) gc_draw(_,15,40*N-10,nil,16,nil,0,_:getHeight()*.5)
@@ -937,7 +932,7 @@ function draw.demo(P)
N=1 N=1
while N<=ENV.nextCount and P.nextQueue[N]do while N<=ENV.nextCount and P.nextQueue[N]do
local id=P.nextQueue[N].id local id=P.nextQueue[N].id
_=libColor[skinSet[id]] _=minoColor[skinSet[id]]
gc_setColor(_[1],_[2],_[3],.3) gc_setColor(_[1],_[2],_[3],.3)
_=blockImg[id] _=blockImg[id]
gc_draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5) gc_draw(_,285,40*N-10,nil,16,nil,_:getWidth(),_:getHeight()*.5)