1.unity urp源码学习一(渲染流程)
2.Tensorflow 编译加速器 XLA 源码深入解读
3.python代ç 大å
¨ç®åï¼
4.Hikari源码分析 - AntiDebug
unity urp源码学习一(渲染流程)
sprt的平台一些基础:
绘制出物体的关键代码涉及设置shader标签(例如"LightMode" = "CustomLit"),以确保管线能够获取正确的源码shader并绘制物体。排序设置(sortingSettings)管理渲染顺序,平台如不透明物体从前至后排序,源码透明物体从后至前,平台以减少过绘制。源码.each 源码逐物体数据的平台启用、动态合批和gpuinstance支持,源码以及主光源索引等配置均在此进行调整。平台
过滤规则(filteringSettings)允许选择性绘制cullingResults中的源码几何体,依据RenderQueue和LayerMask等条件进行过滤。平台
提交渲染命令是源码关键步骤,无论使用context还是平台commandbuffer,调用完毕后必须执行提交操作。源码例如,平台context.DrawRenderers()用于绘制场景中的网格体,本质上是源码上传无法运行执行commandbuffer以渲染网格体。
sprt管线的基本流程涉及context的命令贯穿整个渲染流程。例如,首次调用渲染不透明物体,随后可能调用渲染半透明物体、天空盒、特定层渲染等。流程大致如下:
多相机情况也通过单个context实现渲染。
urp渲染流程概览:
渲染流程始于遍历相机,如果是游戏相机,则调用RenderCameraStack函数。此函数区分base相机和Overlay相机:base相机遍历渲染自身及其挂载的Overlay相机,并将Overlay内容覆盖到base相机上;Overlay相机仅返回,不进行渲染操作。
RenderCameraStack函数接受CameraData参数,其中包含各种pass信息。添加pass到m_ActiveRenderPassQueue队列是乌龟办理溯源码关键步骤,各种pass类实例由此添加至队列。
以DrawObjectsPass为例,其渲染流程在UniversialRenderer.cs中实现。首先在Setup函数中将pass添加到队列,执行时,执行队列内的pass,并按顺序提交渲染操作。
Tensorflow 编译加速器 XLA 源码深入解读
XLA是Tensorflow内置的编译器,用于加速计算过程。然而,不熟悉其工作机制的开发者在实践中可能无法获得预期的加速效果,甚至有时会导致性能下降。本文旨在通过深入解读XLA的源码,帮助读者理解其内部机制,以便更好地利用XLA的性能优化功能。
XLA的分时首板源码源码主要分布在github.com/tensorflow/tensorflow的多个目录下,对应不同的模块。使用XLA时,可以采用JIT(Just-In-Time)或AOT( Ahead-Of-Time)两种编译方式。JIT方式更为普遍,对用户负担较小,只需开启一个开关即可享受到加速效果。本文将专注于JIT的实现与理解。
JIT通过在Tensorflow运行时,从Graph中选择特定子图进行XLA编译与运行,实现了对计算图的加速。Tensorflow提供了一种名为JIT的使用方式,它通过向Tensorflow注册多个优化PASS来实现这一功能。这些优化PASS的执行顺序决定了加速效果。
核心的优化PASS包括但不限于EncapsulateXlaComputationsPass、MarkForCompilationPass、EncapsulateSubgraphsPass、店家要溯源码BuildXlaOpsPass等。EncapsulateXlaComputationsPass负责将具有相同_xla_compile_id属性的算子融合为一个XlaLaunch,而XlaLaunch在运行时将子图编译并执行。
AutoClustering则自动寻找适合编译的子图,将其作为Cluster进行优化。XlaCompileOp承载了Cluster的所有输入和子图信息,在运行时通过编译得到XlaExecutableClosure,最终由XlaRunOp执行。
在JIT部分,关键在于理解和实现XlaCompilationCache::CompileStrict中的编译逻辑。此过程包括两步,最终结果封装在XlaCompilationResult和LocalExecutable中,供后续使用。
tf2xla模块负责将Tensorflow Graph转化为XlaCompilationResult(HloModuleProto),实现从Tensorflow到XLA的转换。在tf2xla中定义的XlaOpKernel用于封装计算过程,并在GraphCompiler::Compile中实现每个Kernel的计算,即执行每个XlaOpKernel的Compile。
xla/client模块提供了核心接口,用于构建计算图并将其转换为HloModuleProto。XlaBuilder构建计算图的结构,而XlaOpKernel通过使用这些基本原语描述计算过程,最终通过xla_builder的Build方法生成HloComputationProto。
xla/service模块负责将HloModuleProto编译为可执行的Executable。该过程涉及多个步骤,包括LLVMCompiler的编译和优化,最终生成适合特定目标架构的可执行代码。此模块通过一系列的优化pass,如RunHloPasses和RunBackend,对HloModule进行优化和转换,最终编译为目标代码。
本文旨在提供XLA源码的深度解读,帮助开发者理解其工作机制和实现细节。如有问题或疑问,欢迎指正与交流,共同探讨和学习。期待与您在下一篇文章中再次相遇。
python代ç å¤§å ¨ç®åï¼
pythonæ趣çç¼ç¨ä»£ç
class?Point:
row=0col=0def?__init__(self,?row,?col):self.row=row
self.col=col
def?copy(self):return?Point(row=self.row,?col=self.col)
#åå§æ¡æ¶
import?pygame
import?random
#åå§å
pygame.init()
W=
H=
ROW=
COL=
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('è´ªåè')
bg_color=(,,)
snake_color=(,,)
head=Point(row=int(ROW/2),?col=int(COL/2))
head_color=(0,,)
snakes=[
Point(row=head.row,?col=head.col+1),Point(row=head.row,?col=head.col+2),Point(row=head.row,?col=head.col+3)]
#çæé£ç©
def?gen_food():
while?1:pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
#æ¯å¦è·è碰ä¸äº
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True#è身å
for?snake?in?snakes:
if?snake.row==pos.row?and?snake.col==pos.col:is_coll=True
break
if?not?is_coll:
breakreturn?pos#å®ä¹åæ
food=gen_food()
food_color=(,,0)
direct='left'#left,right,up,down
#
def?rect(point,?color):
cell_width=W/COLcell_height=H/ROWleft=point.col*cell_widthtop=point.row*cell_heightpygame.draw.rect(window,?color,
(left,?top,?cell_width,?cell_height)
)pass#游æ循ç¯
quit=True
clock=pygame.time.Clock()
while?quit:
#å¤çäºä»¶for?event?in?pygame.event.get():if?event.type==pygame.QUIT:
quit=Falseelif?event.type==pygame.KEYDOWN:
if?event.key==?or?event.key==:if?direct=='left'?or?direct=='right':
direct='up'elif?event.key==?or?event.key==:if?direct?==?'left'?or?direct?==?'right':
direct='down'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='left'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='right'#åä¸è¥¿eat=(head.row==food.row?and?head.col==food.col)#éæ°äº§çé£ç©if?eat:food?=?gen_food()
#å¤ç身å#1.æåæ¥ç头ï¼æå ¥å°snakesç头ä¸snakes.insert(0,?head.copy())#2.æsnakesçæåä¸ä¸ªå æif?not?eat:snakes.pop()
#移å¨if?direct=='left':head.col-=1
elif?direct=='right':head.col+=1
elif?direct=='up':head.row-=1
elif?direct=='down':head.row+=1
#æ£æµdead=False#1.æå¢if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:dead=True
#2.æèªå·±for?snake?in?snakes:if?head.col==snake.col?and?head.row==snake.row:
dead=Truebreakif?dead:print('æ»äº')
quit=False
#渲æââç»åºæ¥#èæ¯pygame.draw.rect(window,?bg_color,?(0,0,W,H))#è头for?snake?in?snakes:rect(snake,?snake_color)
rect(head,?head_color)rect(food,?food_color)#pygame.display.flip()#设置帧é¢ï¼é度ï¼clock.tick(8)#æ¶å°¾å·¥ä½
è¿æ¯ä¸ä¸ªç®æçè´ªåèç代ç ï¼è½ç¶ç»æç®åï¼ä½æ¯è¯¥æçåè½é½æ¯å®æ´çï¼å¯ç©æ§ä¹ä¸é
æ±pythonæ°æ®æ åå代ç ï¼ä½¿ç¨pythonæ ååæ°æ®ç代ç å¦ä¸ï¼
fromsklearnimportpreprocessing
importnumpyasnp
X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
X_scaled=preprocessing.scale(X)
print(X_scaled)
pythonå£è¯æ 代ç ç®å```python#Pythonå£è¯æ 代ç foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```
æå±ï¼å¦ææ³æ¹åæ çå½¢ç¶ï¼å¯ä»¥å¨ä»£ç ä¸æ·»å æ´å¤çæ§å¶åæ°ï¼å¦å¨æ¯ä¸è¡ä¸æ·»å ä¸åçç©ºæ ¼æ°ï¼ä½¿å¾æ çå½¢ç¶ä¸ä¸æ ·ãåæ¶å¯ä»¥éè¿æ·»å HTMLæ ç¾ï¼ä½¿ç¨CSSæ ·å¼æ¥æ¹åå£è¯æ çé¢è²ãèæ¯åæåççã
个æç®python代ç ï¼æ¿èµ°å³ç¨
Helloï¼å¤§å®¶å¥½ï¼ææ¯ç¨åºæ±ªå°æ~
è½ç¶pythonæ¯ä¸ä¸ªæå ¥é¨çè¯è¨ï¼ä½æ¯å¾å¤äººä¾ç¶è¿æ¯ä¼é®å°åºæä¹æ ·å¦Pythonææå¿«ï¼çæ¡å½ç¶æ¯å®æåç§å°é¡¹ç®ï¼åªæèªå·±å»æ³ä¸åï¼æè®°å¾ä½è§åãæ¬æåçæ¯ä¸ªæç®ä»»å¡ï¼åå¦è å¯ä»¥å°è¯çèªå·±å®ç°ï¼æ¬æåæ ·ä¹æ¯æ®µä»£ç ï¼Pythonå¼åè ä¹å¯ä»¥ççæ¯ä¸æ¯æ没æ³å°çç¨æ³ã
以ä¸æ¹æ³å¯ä»¥æ£æ¥ç»å®å表æ¯ä¸æ¯åå¨éå¤å ç´ ï¼å®ä¼ä½¿ç¨set()å½æ°æ¥ç§»é¤ææéå¤å ç´ ã
ç»å®å ·ä½ç大å°ï¼å®ä¹ä¸ä¸ªå½æ°ä»¥æç §è¿ä¸ªå¤§å°åå²å表ã
è¿ä¸ªæ¹æ³å¯ä»¥å°å¸å°åçå¼å»æï¼ä¾å¦ï¼Falseï¼Noneï¼0ï¼ââï¼ï¼å®ä½¿ç¨filter()å½æ°ã
æ们常ç¨For循ç¯æ¥éåæ个å表ï¼åæ ·æ们ä¹è½æ举å表çç´¢å¼ä¸å¼ã
å¦ä¸ä»£ç 段å¯ä»¥å°æå 好çæ对å表解å¼æ两ç»ä¸åçå ç»ã
该æ¹æ³å°éè¿éå½çæ¹å¼å°å表çåµå¥å±å¼ä¸ºå个å表ã
该æ¹æ³å°è¿å第ä¸ä¸ªå表çå ç´ ï¼ä¸ä¸å¨ç¬¬äºä¸ªå表å ãå¦æåæ¶è¦åé¦ç¬¬äºä¸ªå表ç¬æçå ç´ ï¼è¿éè¦å ä¸å¥set_b.difference(set_a)ã
å¦ä¸ä»£ç åå¯ä»¥ç¨æ¥è®¡ç®æ§è¡ç¹å®ä»£ç æè±è´¹çæ¶é´ã
该ç®æ³ä¼æä¹±å表å ç´ ç顺åºï¼å®ä¸»è¦ä¼éè¿Fisher-Yatesç®æ³å¯¹æ°å表è¿è¡æåºï¼
ä¸éè¦é¢å¤çæä½å°±è½äº¤æ¢ä¸¤ä¸ªåéçå¼ã
以ä¸ï¼æ¯æç®åå举çå个pythonæç®ä»£ç ï¼æ¿èµ°å³ç¨ï¼å¸æå¯¹ä½ ææ帮å©ï¼
pythonæ°æ代ç æåªäºï¼pythonæ°æ代ç æå¦ä¸ï¼
defnot_emptyï¼sï¼ã
returnsandlenï¼sãstripï¼ï¼ï¼0ã
#returnsandsãstripï¼ï¼ã
#å¦æç´æ¥ååsãstripï¼ï¼é£ä¹så¦ææ¯Noneï¼ä¼æ¥éï¼å 为None没æstripæ¹æ³ã
#å¦æsæ¯Noneï¼é£ä¹Noneandä»»ä½å¼é½æ¯Falseï¼ç´æ¥è¿åfalseã
#å¦æséNoneï¼é£ä¹å¤å®sãtripï¼ï¼æ¯å¦ä¸ºç©ºã
ç¸å ³ç®ä»ã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±æ°çåè½åæ°æ®ç±»åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
å¹´æï¼è¯è¨æµè¡ææ°çç¼è¯å¨Tiobeå°Pythonå å为æå欢è¿çç¼ç¨è¯è¨ï¼å¹´æ¥é¦æ¬¡å°å ¶ç½®äºJavaãCåJavaScriptä¹ä¸ã
è´¨æ°è¡¨ä»£ç ï¼è´¨æ°è¡¨ä»£ç æ¯æç¨ç¼ç¨è¯è¨çæä¸ç³»åè´¨æ°ç代ç ãè´¨æ°æ¯æåªè½è¢«èªèº«å1æ´é¤çèªç¶æ°ï¼å¦2ï¼3ï¼5ï¼7çã
ä¸åçç¼ç¨è¯è¨æä¸åçå®ç°æ¹æ³ï¼æå¯ä»¥ç»ä½ ä¸äºåèã以ä¸æ¯ä¸äºç½ä¸æç´¢å°çè´¨æ°è¡¨ä»£ç 示ä¾ï¼
Cè¯è¨ï¼
#includestdio.hintmain(){ ?inti,j;?printf("2\n");?for(i=3;i=;i+=2)//ä»3å¼å§éåå¥æ°
{ for(j=3;ji;j++)//å¤ææ¯å¦è½è¢«å°äºå®çå¥æ°æ´é¤{ ?if(i%j==0)//å¦æè½æ´é¤ï¼åè·³åºå¾ªç¯
break;
}if(j==i)//å¦æ循ç¯æ£å¸¸ç»æï¼å说ææ¯è´¨æ°ï¼æå°åºæ¥
printf("%d\n",i);}?return0;}
Pythonï¼
#!/usr/bin/python#-*-coding:UTF-8-*-
#è¾åºæå®èå´å çç´ æ°
#ç¨æ·è¾å ¥æ°æ®lower=int(input("è¾å ¥åºé´æå°å¼:"))
upper=int(input("è¾å ¥åºé´æ大å¼:"))
fornuminrange(lower,upper+1):?#ç´ æ°å¤§äº1
ifnum1:foriinrange(2,num):?if(num%i)==0:breakelse:?print(num)
Hikari源码分析 - AntiDebug
一、框架分析 针对PASS的具体实现进行深入分析。该PASS旨在提升编译后程序的抵抗调试能力,其核心逻辑包括两个主要方面: 链接预编译的反调试IR代码 特定于平台的内联汇编注入 针对Darwin操作系统上的AArch架构,若未找到ADBCallBack和InitADB函数,PASS会尝试直接注入内联汇编代码。该代码片段可能利用系统调用,如ptrace,来检测是否处于调试环境。 此外,配置允许用户指定预编译反调试IR文件的路径和函数混淆概率。 具体实现包括: 检查预编译IR路径,构建默认路径并链接预编译的IR文件。 修改ADBCallBack和InitADB函数属性,确保它们在编译和链接阶段表现出反调试行为。 初始化标志和目标三元组信息,准备为每个模块提供初始化和链接预编译IR的过程。 模块处理和函数处理涉及应用概率值来决定是否对模块和函数应用反调试混淆。 预编译的反调试IR文件包含了一系列用于反调试的函数和结构,如检测调试器的代码、修改执行路径以规避调试跟踪、以及插桩代码以检测异常行为。 通过LLVM工具链中的llvm-dis工具,可以将.bc文件转换为可读的LLVM IR文件。该文件结构包含多个结构体定义、全局声明、函数实现和属性。 函数ADBCallBack简单地终止程序并执行无法到达的指令。函数InitADB执行系统调用和检查来检测调试状态,可能涉及进程信息查询、动态库加载、系统调用、内存分配、异常端口检查等操作。 系统调用声明确保了程序能调用各种底层函数进行操作,如sysctl、dlopen、dlsym、task_get_exception_ports、isatty、ioctl等。 总结,通过在编译器优化阶段插入反调试逻辑,相较于源代码实现,基于LLVM Pass的AntiDebug方法提供了更好的隐蔽性、可移植性、灵活性、维护性和混淆程度。然而,这种方法需要对LLVM框架有深入理解,可能增加构建和调试复杂度。