网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月31日漏签0天
吉里吉里吧 关注:51,259贴子:70,949
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 12回复贴,共1页
<<返回吉里吉里吧
>0< 加载中...

【算半个教程】TJS相关的记录

  • 只看楼主
  • 收藏

  • 回复
  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
语言基础问题这个不管,还是看菜鸟教程吧,主要对一些常规用法的讲解和相关巨坑的记录


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自行下个VSCode并打开,按快捷键Ctrl+Shift+X进入扩展边栏,在顶部搜索框搜索并安装
1、ms-ceintl.vscode-language-pack-zh-hans
2、biscrat.tjs-vscode
3、ms-vscode.cpptools
全部安装完成后,重启VSC
将你kr项目所在的文件夹(exe要在这个目录下,不是data),拖动到VSC打开,勾选信任
按快捷键Ctrl+Shift+D进入运行和调试边栏,创建launch.json文件并打开
使用以下内容替换configurations项大括号内的内容
"name": "(Windows) 启动",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/kr.exe",
"args": [ "-check1=1" , "-check2=2" ],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console":"newExternalWindow"
需要配置一下program项最后的exe名称,与kr那个exe的文件名要相同
args项与快捷方式传入命令行效果相同,可在tjs上使用System.getArgument取得
这种启动项可以配置多个自行研究......配置好后按F5即可启动exe
我用的版本是z,所以有一些东西2没有很正常
官网:http://krkrz.github.io/
z的tjs2doc:http://krkrz.github.io/docs/tjs2/j/contents/index.html
z的默认编码是UTF-8,由于z不再支持ANSI了,所以需要调整使用UTF-16 LE
1、点击VSC左下角齿轮打开设置并搜索编码,将Files.Encoding调整为UTF-16 LE,之后从VSC新建文件即可
2、在exe所在目录新建一个cf文件,写入readencoding="Shift_JIS",切换默认读取编码
其他cf支持项打开krkrrel.exe,在输出中勾选.exe形式可执行文件,之后点开可执行文件设定查看


2025-12-31 11:21:06
广告
不感兴趣
开通SVIP免广告
  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
tjs预编译指令
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/style.html
@if( exp )
@set( exp )
@endif
预编译指令会在文件读取时直接生效,且仅在这一次读取进行判定
如果想要在这个文件内进行判定,再决定需不需要执行,那还是用普通的if就好
exp中不允许出现.符号,但允许tjs变量和表达式
tjs属性操作
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/property.html
定义我就不管了,主要是属性绑定的问题
var value = &System.title;
使用&prop以访问属性本体,在这个状态下属性跟普通的值一样可以被引用和删除
在引用后,对value进行操作与对System.title的操作相同
这也是2里唯一能够绑定属性的方法了.......
tjs例外抛出
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/exception.html
throw exp;
exp随便是什么都可以,但它必须包含message项
通常是使用 throw new Exception( 文字列 );
需要注意的是,如果这个例外没有被try-catch块捕捉,那么这个错误一定是无法恢复的,无论你用什么方法......
tjs函数相关
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/function.html
1、var func = function{};
2、var func = function( exp ){};
tjs允许使用以上两种形式声明函数,但不允许这么声明类
需要注意的是,这个相当于赋值,所以末尾一定要带分号
function check( input* ){ System.inform( input.join("\n") ); }
函数的参数列表支持使用可变参数,方法是在最后一个参数后面加*
无论是否传入参数,input都会被作成一个Array,可在函数体内访问
这里要提到一个数组的用法,通常是跟这个配合使用的
var parameter = [ 1234 , "!" ];
check( parameter* );
我们可以在数组后面加*以展开数组,这样就相当于check( 1234 , "!" );
关于函数参数体内直接传递时使用...的问题
function A( B ){ B = 4; func(...); func(B); }
A(10);
打印出来你就会发现两个结果是不一样的
...是直接把调用时的参数栈扔过去了,而B实际上在函数体内是修改过的,所以动作不一致
关于函数调用时花里花哨的写法
check( key => value );
其实=>和,是等价的,不过这种写法更利于区分Key-Value键值对
也可以对Key加一些标记来做一些乱七八糟的玩法,但比较危险
tjs的正则匹配
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/regexp.html
这个东西建议菜鸟直接搜一下正则匹配相关的教程
tjs的Date
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/date.html
这个的坑主要是需要自己计算一下日期和月的闰年问题........
new Date之后,Date内的数字是固定的,需要再次new Date才能更新时间值


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
tjs的关键字和值类型
对应doc:
http://krkrz.github.io/docs/tjs2/j/contents/types.html
http://krkrz.github.io/docs/tjs2/j/contents/factor.html
tjs中的关键字有点魔性,这里只说明一些非通用的关键字
// 设置程序断点
1、debugger;
// 改变value执行上下文为contxt,这仅用于函数和属性
2、value = value incontextof context;
// 将右侧对象无效化,这会立即调用该对象的析构函数,但不会将这个值删除
3、invalidate value;
// 判定右侧对象是否无效化
4、isvalid value;
// 对象是否为某个类的实例或派生类实例
5、intances instanceof class;
// with需要指定一个上下文,区间内就可以省略这个前缀了,类似于namespace
6、with( context ){ .value; }
以下关键字在tjs中无效,有错误请指出
1、const
2、enum
3、export
4、import
5、in
6、public
7、private
8、protected
9、synchronized
10、Infinity
tjs值的类型判定略微麻烦,而且存在一些上下文的问题,我就直接丢方法了
不过需要说明一下的是,可能有错误,因为有的地方依赖一些其他的变量或者方法啥的可能没改掉......
var C_CLASSNAME = %[
"Void" => "void",
"Integer" => "Integer",
"Real" => "Real",
"String" => "String",
"Object" => "Object",
"Octet" => "Octet",
"Array" => "Array",
"Dic" => "Dictionary",
"Func" => "Function",
"Class" => "Class",
"Prop" => "Property",
"Null" => "undefined",
"Exception" => "ConductorException"
];
function f_getExp( Exp , Context = global ){
if( Exp == void ){ return Context; }
if( Exp.indexOf(".") != -1 ){
Exp = Exp.split(".");
for( var i = 0 ; i < Exp.count ; i++ ){
try{ Context = Context[ Exp[i] ]; }
catch{ return null; }
}
return Context;
}
try{ return Context[ Exp ]; }
catch{ return null; }
}
function f_isInteger( Value ){ return typeof( Value ) == C_CLASSNAME.Integer; }
function f_isReal( Value ){ return typeof( Value ) == C_CLASSNAME.Real; }
function f_isString( Value ){ return typeof( Value ) == C_CLASSNAME.String; }
function f_isObject( Value ){ return typeof( Value ) == C_CLASSNAME.Object; }
function f_isOctet( Value ){ return typeof( Value ) == C_CLASSNAME.Octet; }
function f_isArray( Value ){ return Value instanceof C_CLASSNAME.Array; }
function f_isDic( Value ){ return Value instanceof C_CLASSNAME.Dic; }
function f_isFunc( Value ){ return Value instanceof C_CLASSNAME.Func; }
function f_isClass( Value ){ return Value instanceof C_CLASSNAME.Class; }
function f_isProperty( Value = "&Value" ){ return Value instanceof C_CLASSNAME.Prop; }
function f_isNull( Value , Contxt = global ){
try{
var Result = f_getExp(...);
if( Result == null ){ return true; }
return typeof( Value ) == C_CLASSNAME.Null;
}catch{ return true; }
}
function f_isVoid( Value , Contxt = global ){
try{
var Result = f_getExp(...);
if( Result == null ){ return true; } // 要注意这里,undefind也直接返回了
return typeof( Value ) == C_CLASSNAME.Void;
}catch{ return true; }
}
function f_isInstance( Value , Class ){
if( f_isString( Class ) ){ Class = C_CLASSNAME[ Class ]; }
if( Class == void ){ return null; }
return Value instanceof Class;
}
function f_isException( Value ){ return isInstance( Value , C_CLASSNAME.Exception );
tjs的class
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/class.html
class主要是有一些继承上的坑...
class A{
class B{}
class C extends B{}
}
这么写是错的,因为extends后面跟的是个表达式而不是个对象,所以正确的写法是
class C extends global.A.B{}
而在多重继承时
class A{}
class B{}
class C extends A, B{
function C(){
super.A(); // 这就错了
global.A(); // 必须要访问原先那个类去调用它才行
global.B(); // 结合一下上面那个表达式,你品...
}
}
tjs没有自己的类型映射,也就没有对应的Type记录,只能Scripts.getClassNames获取一下类名组......
class在未被实例化时,函数可以正常调用,但class未被实例化时不允许存在成员值
访问class内不存在的项会直接报错,也就是为啥上面那玩应判定undefind只能try
单例父类都没有类名,继承单例父类修改类内对象,与直接修改父类对象效果相同


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
tjs的字符串
相关doc:http://krkrz.github.io/docs/tjs2/j/contents/string.html
方法大体上自己看吧...主要是注意一下substr的坐标计算问题
sprintf用的相对比较多,支持%s%i之类的格式化字符,常用模板字符串可以打个包放全局里
与@""不同的是,这个不用改个参数名就重写一次【......
tjs的数组和字典
相关doc:
http://krkrz.github.io/docs/tjs2/j/contents/array.html
http://krkrz.github.io/docs/tjs2/j/contents/dictionary.html
首先数组...
数组可以使用assign( object ),把对象的成员以键值序列的方式copy到数组内
remove会在删除对应元素后,对数组进行紧凑化,earse也一样
仅有z的数组有push、pop、unshift、shift方法组
字典嘛...
(Dictionary.func incontextof target)( parameter );
字典只能这么调用方法,所以建议是直接封装个函数........
tjs的eval和exec
相关doc:
http://krkrz.github.io/docs/kirikiriz/j/contents/f_Scripts_eval.html
http://krkrz.github.io/docs/kirikiriz/j/contents/f_Scripts_exec.html
因为能指定上下文,加上可以用字符串拼表达式,所以还是挺常用的,但注意2没有上下文参数
这里的坑....比如下面这东西它会正常返回值
因为eval在当前栈查不到就会在上一层栈查,直到global..............
var value = %[];
System.inform( Scritps.eval( "System.title" ,,, value ) );
exec倒是没什么坑,利用exec的话也可以做一些控制脚本,并且在于sq交互的时候还是比较好用的.....


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
kr的坑比较多...
krzdoc:http://krkrz.github.io/docs/kirikiriz/j/contents/index.html
System类
http://krkrz.github.io/docs/kirikiriz/j/contents/f_System.html
System函数部分
System.inform
弹窗显示提示,这会阻塞tjs运行,所以是很常用的调试函数
System.addContinuousHandler
System.removeContinuousHandler
这个方法组是注册一个尽可能多执行的方法,类似于update那样的函数
这方法组不是拿来当计时器玩的,除非是要搞中心计时器,但那玩应在kr里消耗也太大了....
System.createAppLock
这个在initialize.tjs里都能看到,就是注册个标记,然后判定这个标记是否已经存在
System.createUUID
生成UID,几乎不存在重复问题
相对来讲如果没有需要这种东西的系统的话,就没啥用
System.doCompact
这个东西除非有相应的规划否则不建议用
通常是用在场景切换,读档缓存整理一类的时候调用
System.exit
System.terminate
实际使用起来其实区别不大,参数都是退出的时候返回一个退出代码
System.getArgument
System.setArgument
获取/设置命令行值,有一些是内部的,也可以通过外部传入
快捷方式命令行,或json的args那里配置
System.getKeyState
获取某个键的按下抬起状态
System.getTickCount
ms单位的时间计时,两次获取相减就是经过的时间
System.readRegValue
读取注册表,设置注册表有registory.dll
System.shellExecute 动作异常
这个动作异常表现为,仅在启动exe时动作正确
而启动快捷方式或者bat的时候,就找不到环境变量了.....
这个BUG在dll中的所有shell同样出现.............
System值部分
System.exeBits exe是32还是64
System.osBits 系统是32还是64
System.osName 系统平台字符,目前就Win
System.exePath exe所在根目录
System.exeName exe完整路径
System.dataPath ..\savedata
System.appDataPath C:\Users\<UserName>\
System.personalPath C:\Users\<UserName>\Documents
System.savedGamesPath C:\Users\<UserName>\Saved Games
需要注意的是,System.savedGamesPath是OS路径
需要Storages.getFullPath( .savedGamesPath ) + "/";才能转为tjs路径........
System.title
快速启动栏的标题
System.desktopLeft
System.desktopTop
System.desktopWidth
System.desktopHeight
桌面可用矩形位置,计算快速启动栏
System.screenWidth
System.screenHeight
桌面矩形大小,不计算快速启动栏


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Debug类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Debug.html
Debug类函数
Debug.message
向控制台输出信息,并调用Debug信息分发委托
需要注意的是,z没有控制台
Debug.addLoggingHandler
Debug.removeLoggingHandler
向Debug信息分发委托注册/注销函数
plugins类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Plugins.html
plugins类函数
Plugins.link
Plugins.unlink
链接解锁dll
Plugins.getList
获得当前注册的dll列表数组,这个列表只有dll本身的名称,不带路径
Font类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Font.html
Font类虽然不是个单例类,但它的实例在每个Layer实例的Layer.font上
Font类函数
Font.getEscWidthX
Font.getEscWidthY
Font.getEscHeightX
Font.getEscHeightY
获取当前字体的文字列偏移量
Font.getTextHeight
Font.getTextWidth
Font.getGlyphDrawRect
获取文字列绘制范围的,高度,宽度,矩形
Font.mapPrerenderedFont
Font.unmapPrerenderedFont
链接解锁预渲染字体
Font.getList
根据Flags返回符合条件的字体列表
Font类值
Font.angle 文字绘制角度,主要是文字列绘制的旋转角度
Font.bold 是否粗体
Font.face 字体名
Font.height 字号大小
Font.italic 是否斜体
Font.resterizer 文字列绘制方式
Font.skrikeout 是否使用删除线
Font.underline 是否使用下划线
ImageFunction类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_ImageFunction.html
ImageFunction类仅用于处理Bitmap
这几个动作异常可能也是我记错了,但我记得以前测试的时候,值不变,运算结果不一样...
ImageFunction类函数
ImageFunction.adjustGamma
调整伽马值
ImageFunction.colorRect
对矩形填充颜色
ImageFunction.doBoxBlur
对矩形位置进行毛玻璃模糊效果
ImageFunction.doGrayScale
对矩形位置进行灰度表换
ImageFunction.drawText
在指定位置绘制文字
ImageFunction.fillRect
对矩形位置直接填充颜色
ImageFunction.flipLR
ImageFunction.flipUD
左右上下翻转
ImageFunction.operateAffine 动作异常
仿射变换...
ImageFunction.operateRect 动作异常
矩形效果合成...
ImageFunction.operateStretch 动作异常
矩形扩大缩小...
Clipboard类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Clipboard.html
Clipboard.hasFormat
判定剪贴板内是否存在内容
Clipboard.asText
剪贴板内保存的文字列值


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Timer类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Timer.html
Timer类构造函数
Timer( func )
传入一个函数体设置为事件
Timer( context , funcid )
传入一个上下文实体,以及函数id,使用id在该上下文中查找该函数,设置为事件
Timer类值
Timer.capacity 该值已失效,最大发生容许量
Timer.enabled 是否启用Timer
Timer.mode Timer执行优先级
Timer.interval
设置Timer触发频率,概率动作异常,异常为1000以下频率有概率无法执行
Timer类事件
Timer.onTimer
也就是触发Timer时调用的事件,在interval较低时,可能会触发太快导致动作异常
这东西需要重写,处理一些乱七八糟的问题,当然这个是简化版......
class C_Timer extends Timer{
var i_mode; // Timer精确优先级
var i_interval; // 击发间隔
var b_enabled; // 是否允许击发
var i_count; // 当前击发次数
var i_capacity; // 击发上限,为0则无上限,默认6
var __f_onTimer; // 传入的事件函数
var __b_allowMltiple; // 是否允许多重击发
// C_Timer()
// C_Timer( func )
// C_Timer( context , funcid )
function C_Timer( Input* ){
i_mode = &mode;
i_interval = &interval;
b_enabled = &enabled;
i_capacity = 6;
Timer( onTimer , "" );
f_setTimerEvent(...);
}
function f_setTimerEvent( Input* ){
switch( Input.count ){
default:
case 0: return;
case 1: __f_onTimer = Input[0]; return;
case 2: __f_onTimer = Input[0][ Input[1] ]; return;
}
}
function onTimer(){
if( !__b_allowMltiple ){ b_enabled = false; }
// 达到指定击发数时,关闭Timer
if( i_count >= i_capacity ){ b_enabled = false; return; }
// 执行Timer事件并增加计数,若事件返回了true,则终止Timer
if( __f_onTimer( this ) ){
b_enabled = false;
i_count++;
return;
}
i_count++;
// 执行完毕后,重新开启Timer
if( !__b_allowMltiple ){ b_enabled = true; }
}
}


2025-12-31 11:15:06
广告
不感兴趣
开通SVIP免广告
  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
AsyncTrigger类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_AsyncTrigger.html
AsyncTrigger类构造函数与Timer类相同,但这个我基本没用过也不知道有没有问题..
AsyncTrigger类函数
AsyncTrigger.cancel
取消触发,估计是移除了onFire的事件
AsyncTrigger.trigger
尝试触发Trigger,在满足条件时调用AsyncTrigger.onFire
AsyncTrigger类值
AsyncTrigger.cached
若为true,无论调用多少次trigger,也只会触发1次
AsyncTrigger.mode
优先级
AsyncTrigger类事件
AsyncTrigger.onFire触发时调用的事件函数
Rect类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/f_Rect.html
Rect的坐标设置和其他设置坐标的方法都不一样............
Lay、Bitmap、Win用的都是设置XYWH,也就是横纵坐标和长宽
Rect用的是XYRB,RB也就是该矩形的右端上下方坐标.........
如果感觉这个设置比较魔性的话,继承一下添加两个方法就*
Rect类构造函数
Rect()
Rect( X , Y , R , B )
Rect( SrcRect )
Rect类函数
Rect.addOffset
为xy添加一个偏移量
Rect.clear
清除记录的所有矩形
Rect.clip
裁剪矩形,是两个矩形的区域相减
Rect.equal
是否为同一矩形
Rect.included
判定某个矩形是否在处于矩形范围内
Rect.includedPos
判定某个坐标是否处于矩形范围内
Rect.intersects
判定两个矩形是否相交
Rect.isEmpty
该矩形是否为空
Rect.set( X , Y , R , B )
设置矩形,要注意这个是RB
Rect.setOffset
设置矩形XY坐标
Rect.setSize( W , H )
设置矩形大小,要注意这个是WH
Rect.union
矩形合成
Rect值
Rect.left
Rect.top
Rect.widt
hRect.height
Rect.buttom
Rect.right
Rect.nativeArray 只读的一个内部矩形列表,与tjs无关


  • 敬启绝音
  • 小吧主
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Bitmap类
相关doc:http://krkrz.github.io/docs/kirikiriz/j/contents/index.html
Bitmap实例不需要设置win和lay目标,使用ImageFunction对Bitmap进行效果操作
另外,Bitmap.save和Bitmap.getSaveOption支持了向图片写入/读取追加数据的参数,因此不需要再用计算偏移量的老方法了
Bitmap类构造函数
Bitmap()
Bitmap( W , H , bpp=32 )
Bitmap( File , ColorKey=clNone )
设置为空,或者指定长宽,要么加载一张图(调用.laod)
Bitmap类函数
Bitmap.copyFrom( SrcBitmap )
进行图像共享,并自动设置Bitmap长宽为SrcBitmap的长宽
调用时进行浅拷贝,后续若图像发生变化则进行深拷贝,浅拷贝基本没有性能消耗
Bitmap.independ(copy=true)
解除图像共享,指定ture则会深拷贝图像,为false则会清空Bitmap
需要注意的是,这玩应只对调用方有效,不是源解除共享浅拷贝就没了...这不是弱引用
Bitmap.getPixel(x, y)
Bitmap.setPixel(x, y, value)
获取/设置Bitmap某个像素的RBG值
Bitmap.getMaskPixel(x, y)
Bitmap.setMaskPixell(x, y, value)
获取/设置Bitmap中某个像素的透明度值
Bitmap.load(image, colorkey=clNone)
读取一张图像,这会自动将Bitmap长宽设置为图像长宽
Bitmap.loadAsync(image)
异步加载图像,加载中时可使用Bitmap.loading确认是否正在加载
加载完成或出现异常时,回调Bitmap.onLoaded事件
Bitmap.loadHeader(image)
获取图像信息(不包含存档数据),需要注意的是,这是个静态方法,在Bitmap实例中不存在
返回一个数据字典,其中必然包含width和height,其他数据随图像格式而定
Bitmap.save(name, type="bmp", meta=null)
Bitmap.load(image, colorkey=clNone)
Bitmap.getSaveOption(type)
保存图像,读取图像,读取图像中保存的数据
save那个meta就是要在图像中追加的数据
而getSaveOption没有文件参数,也就意味着必须要读图之后才能把数据读出来
Bitmap类值
Bitmap.buffer
Bitmap.bufferForWrite
Bitmap.bufferPith
这仨都是C++的只读变量,一些缓冲区之类的东西,tjs完全用不上
Bitmap.loading 确认是否正在加载
BItmap.width 当前Bitmap矩形宽
Bitmap.height 当前Bitmap矩形高
Bitmap类事件
Bitmap.onLoaded(meta, async, error, message)
异步加载图像时回调函数,加载完成或出现异常时触发回调
meta就是追加的数据
async为确认是否异步加载,貌似没什么用
error判定是否出现异常
message异常信息
有一些题外话...关于tjs如何支持管理更多渲染效果,和一些存读的问题......
渲染管线没什么好说的...tjs上可以偷点懒:缓存池->源->渲染管线(假)->交换链->输出
Bitmap负责缓存池和源的部分,缓存池是一个全局管理器,而源则挂在Layer上,利用copyFrom引用缓存池中的数据
至于这里为什么要这么做......主要是依赖问题和GC问题
Layer在查找获取源的时候,如果什么时候都要把整个路径写全...就多少有点复杂,除了要改的时候可能批量修改,还会有一些路径处理上的问题.......
所以造一个缓存池,使用ID<->实际文件进行管理的方式,隔离Layer对实际文件的操作
而Layer主要用于处理 渲染管线(假)->交换链->输出 这一个步骤
Layer在这种情况下可以使用Bitmap保持多个源,同样也可以使用Bitmap保存交换链
但这里就需要分两种情况来对应.........
一种是不需要保存的画面,它通常会在进入标题界面之前就初始化好了,这允许它进行更危险的操作
不需要保存的情况下,管线允许Layer进行任何操作,但不缓存任何值
比如一些比较闹心的裁剪问题,在这种情况下允许操作
而如果需要缓存的话...那就是另外一个事情了,毕竟kr存不了内存快照也存不了物件...
所以在这种情况下,管线仅允许挂载写好的组件...组件可以配置一些参数,并通过控制变量调整所需的效果
例如旋转,旋转可以配置中心点和围绕点,而控制变量则是旋转的角度,这些值就可以被缓存,并在还原的时候正确执行
【当然这种方法也不是特别好用...除非写成预制体,不然组件优先级和组件互相影响的问题还是很头疼......


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 12回复贴,共1页
<<返回吉里吉里吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示