§
    ¬Âj  ã                  ó
  — d Z ddlmZ ddlmZ ddlZddlZddlZddlZddl	Z	ddl
mZ  edd¬¦  «         G d„ d	¦  «        ¦   «         Z edd¬¦  «         G d
„ d¦  «        ¦   «         Z G d„ d¦  «        Z G d„ d¦  «        ZdS )uÂ   
iOS Metal & Mobile Performance Profiler for FreeExile.
Audits 120 FPS ProMotion frame budgets (8.33ms), memory ceilings (< 450MB),
thermal dissipation (< 38Â°C), and zero-allocation hot paths.
é    )Úannotations)Ú	dataclassN)ÚListT)ÚslotsÚfrozenc                  óV   — e Zd ZU dZded<   dZded<   dZded<   d	Zded
<   dZded<   dS )ÚIOSMetalProfilerConfigéx   ÚintÚ
target_fpsg)\�Âõ¨ @ÚfloatÚframe_budget_msg      |@Úmax_ram_budget_mbg      C@Úmax_thermal_temp_celsiusÚsample_framesN)	Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   © ó    ú6C:\Projects\FreeExile\tools\perf\ios_metal_profiler.pyr	   r	      si   € € € € € € à€JÐÐÐÑØ!€OÐ!Ð!Ð!Ñ!Ø$ÐÐ$Ð$Ð$Ñ$Ø&*ÐÐ*Ð*Ð*Ñ*Ø€MÐÐÐÑÐÐr   r	   c                  ój   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   d
ed<   dS )ÚMetalBenchmarkReportr   Úavg_frame_time_msÚp99_frame_time_msÚmin_fpsÚavg_fpsÚpeak_ram_mbÚsteady_temp_celsiusr   Úhot_path_allocationsÚboolÚzero_alloc_verifiedÚis_promotion_compliantN)r   r   r   r   r   r   r   r   r      sx   € € € € € € àÐÐÑØÐÐÑØ€N€N�NØ€N€N�NØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ Ð Ð Ñ Ð Ð r   r   c                  ó,   — e Zd ZdZddd„Zdd„Zdd„ZdS )ÚZeroAllocScratchMemoryzEPre-allocated object pools and scratch memory for hot-path rendering.é   Úcapacityr   ÚreturnÚNonec                ó~   — || _         t          |dz  ¦  «        | _        t          |dz  ¦  «        | _        d| _        d S )Né   é   r   )r(   Ú	bytearrayÚscratch_floatsÚscratch_indicesÚcursor)Úselfr(   s     r   Ú__init__zZeroAllocScratchMemory.__init__+   s<   € Ø ˆŒå'¨°2©Ñ6Ô6ˆÔÝ(¨°A©Ñ6Ô6ˆÔØˆŒˆˆr   c                ó   — d| _         d S )Nr   )r1   )r2   s    r   ÚresetzZeroAllocScratchMemory.reset2   s   € ØˆŒˆˆr   Ú
size_bytesÚ
memoryviewc                ó  — | j         |z   t          | j        ¦  «        k    r/t          d| j         |z   › dt          | j        ¦  «        › �¦  «        ‚t	          | j        ¦  «        | j         | j         |z   …         }| xj         |z  c_         |S )zHAcquires a zero-alloc slice from pre-allocated buffer with bounds check.z"Scratch memory capacity exceeded: z > )r1   Úlenr/   ÚBufferErrorr7   )r2   r6   Úviews      r   Úacquire_scratch_slicez,ZeroAllocScratchMemory.acquire_scratch_slice5   s’   € àŒ;˜Ñ#¥c¨$Ô*=Ñ&>Ô&>Ò>Ð>ÝØl°T´[À:Ñ5MÐlÐlÕRUÐVZÔViÑRjÔRjÐlÐlñô ð õ ˜$Ô-Ñ.Ô.¨t¬{¸T¼[È:Ñ=UÐ/UÔVˆØˆŒ�zÑ!ˆŒØˆr   N)r'   )r(   r   r)   r*   )r)   r*   )r6   r   r)   r7   )r   r   r   Ú__doc__r3   r5   r<   r   r   r   r&   r&   (   s[   € € € € € ØOÐOðð ð ð ð ðð ð ð ðð ð ð ð ð r   r&   c                  ó:   — e Zd ZdZdd„Zdd	„Zdd„Zdd„Zdd„ZdS )ÚIOSMetalPerformanceProfilerz@Audits iOS Metal rendering engine and mobile performance bounds.Úconfigr	   r)   r*   c                ó>   — || _         t          d¬¦  «        | _        d S )Ni   )r(   )r@   r&   Úscratch)r2   r@   s     r   r3   z$IOSMetalPerformanceProfiler.__init__C   s   € ØˆŒÝ-°tÐ<Ñ<Ô<ˆŒˆˆr   Údtr   c                óò   — | j                              ¦   «          | j         j        }d}t          |¦  «        D ]?}|dz  }||         t	          |dz  ¦  «        z   dz  ||<   ||dz            |z   dz  ||dz   <   Œ@dS )zISimulates hot-path kinematics, sprite PBR transforms, and particle steps.é€   r,   éd   éÿ   é   N)rB   r5   r/   Úranger   )r2   rC   ÚbufÚcountÚiÚoffsets         r   Ú_execute_zero_alloc_hot_loopz8IOSMetalPerformanceProfiler._execute_zero_alloc_hot_loopG   s�   € àŒ×ÒÑÔÐØŒlÔ)ˆØˆÝ�u‘”ð 	;ð 	;ˆAØ˜‘VˆFØ˜vœ;­¨R°#©X©¬Ñ6¸$Ñ>ˆC�‰KØ" 6¨A¡:œ°Ñ2°dÑ:ˆC�˜‘
‰OˆOð	;ð 	;r   r   c                óö  — | j         }t          |dd¦  «        }|r$t          j                             |j        ¦  «        nd}|r|j        nd}	 t          j        |¦  «        \  }}|t          |¦  «        z   }n# t          $ r |dz   }Y nw xY wt          j        ¦   «          t          j        ¦   «         }	t          | j        j        ¦  «        D ]}
|                       |¦  «         Œt          j        ¦   «         }t          j        ¦   «          |                     |	d¦  «        }d}|D ]U}|j        D ]K}t          j                             |j        ¦  «        |k    r!||j        cxk    r|k    rn Œ?||j        z  } nŒLŒV|S )zBAudits memory allocations specifically inside the hot-loop method.Ú__code__NÚ r   é<   Úlineno)rN   ÚgetattrÚosÚpathÚabspathÚco_filenameÚco_firstlinenoÚinspectÚgetsourcelinesr9   Ú	ExceptionÚtracemallocÚstartÚtake_snapshotrI   r@   r   ÚstopÚ
compare_toÚ	tracebackÚfilenamerS   rK   )r2   rC   ÚfnÚcodeÚfn_fileÚfn_startÚlinesÚstart_linenoÚfn_endÚsnapshot_startÚ_Úsnapshot_endÚstatsÚallocationsÚstatÚframes                   r   Ú_count_hot_path_allocationsz7IOSMetalPerformanceProfiler._count_hot_path_allocationsQ   s¢  € àÔ.ˆÝ�r˜: tÑ,Ô,ˆØ7;ÐC•"”'—/’/ $Ô"2Ñ3Ô3Ð3ÀˆØ*.Ð5�4Ô&Ð&°Aˆð	#Ý")Ô"8¸Ñ"<Ô"<ÑˆE�<Ø!¥C¨¡J¤JÑ.ˆFˆFøÝð 	#ð 	#ð 	#Ø ‘]ˆFˆFˆFð	#øøøõ 	ÔÑÔÐÝ$Ô2Ñ4Ô4ˆÝ�t”{Ô0Ñ1Ô1ð 	2ð 	2ˆAØ×-Ò-¨bÑ1Ô1Ð1Ð1Ý"Ô0Ñ2Ô2ˆÝÔÑÔÐà×'Ò'¨¸ÑAÔAˆØˆØð 	ð 	ˆDØœð ð �Ý”7—?’? 5¤>Ñ2Ô2°gÒ=Ð=À(ÈeÌlÐBdÐBdÒBdÐBdÐ^dÒBdÐBdÐBdÐBdÐBdØ 4¤:Ñ-�KØ�EøøØÐs   Á)A7 Á7B	ÂB	úList[float]c                ó*  — dg| j         j        z  }t          | j         j        ¦  «        D ]h}t          j        ¦   «         }|                      |¦  «         t          j        ¦   «         }dt          j        |dz  ¦  «        dz  z   }||z
  dz  |z   ||<   Œi|S )zHMeasures hardware simulated frame durations without dynamic allocations.g        gš™™™™™@gš™™™™™É?gÍÌÌÌÌÌÜ?ç     @�@)r@   r   rI   ÚtimeÚperf_counterrN   ÚmathÚsin)r2   rC   Ú	durationsrL   Út0Út1Úsim_render_cost_mss          r   Ú_measure_frame_durationsz4IOSMetalPerformanceProfiler._measure_frame_durationsm   sŸ   € à"% ¨¬Ô)BÑ!Bˆ	Ý�t”{Ô0Ñ1Ô1ð 	Eð 	EˆAÝÔ"Ñ$Ô$ˆBØ×-Ò-¨bÑ1Ô1Ð1ÝÔ"Ñ$Ô$ˆBØ!%­¬°!°c±'Ñ):Ô):¸TÑ)AÑ!BÐØ "™W¨Ñ.Ð2DÑDˆI�a‰LˆLØÐr   r   c                óà  — dt          | j        j        ¦  «        z  }t          d¦  «        D ]}|                      |¦  «         Œ|                      |¦  «        }|                      |¦  «        }|                     ¦   «          t          |¦  «        }t          |¦  «        |z  }|t          |dz  ¦  «                 }|d         }|dk    rd|z  nt          | j        j        ¦  «        }	|dk    rd|z  nt          | j        j        ¦  «        }
d\  }}|dk    }|o?|| j        j        k    o/|| j        j        k    o|| j        j        k    o|| j        j        k    }t          |||
|	|||||¬¦	  «	        S )	z?Executes frame loop profiling and computes performance metrics.g      ð?é
   g®Gáz®ï?éÿÿÿÿr   ru   )gfffffÆp@gffffffB@)	r   r   r   r   r   r    r!   r#   r$   )r   r@   r   rI   rN   rr   r~   Úsortr9   Úsumr   r   r   r   r   )r2   rC   rl   Úallocations_during_hot_pathÚframe_durations_msÚnÚavg_msÚp99_msÚmax_msr   r   r   Ústeady_tempÚzero_alloc_okÚpromotion_oks                  r   Úrun_benchmarkz)IOSMetalPerformanceProfiler.run_benchmarkx   s¢  € à•5˜œÔ/Ñ0Ô0Ñ0ˆÝ�r‘”ð 	2ð 	2ˆAØ×-Ò-¨bÑ1Ô1Ð1Ð1à&*×&FÒ&FÀrÑ&JÔ&JÐ#Ø!×:Ò:¸2Ñ>Ô>ÐØ×ÒÑ!Ô!Ð!åÐ"Ñ#Ô#ˆÝÐ'Ñ(Ô(¨1Ñ,ˆØ#¥C¨¨D©¡M¤MÔ2ˆØ# BÔ'ˆà%+¨a¢Z Z�&˜6‘/�/µU¸4¼;Ô;QÑ5RÔ5RˆØ%+¨a¢Z Z�&˜6‘/�/µU¸4¼;Ô;QÑ5RÔ5RˆØ#.Ñ ˆ�[à4¸Ò9ˆàð DØ˜$œ+Ô5Ò5ðDà˜$œ+Ô5Ò5ðDð ˜tœ{Ô<Ò<ðDð ˜tœ{ÔCÒCð 	õ $Ø$Ø$ØØØ#Ø +Ø!<Ø -Ø#/ð

ñ 

ô 

ð 
	
r   N)r@   r	   r)   r*   )rC   r   r)   r*   )rC   r   r)   r   )rC   r   r)   rs   )r)   r   )	r   r   r   r=   r3   rN   rr   r~   r�   r   r   r   r?   r?   @   s~   € € € € € ØJÐJð=ð =ð =ð =ð;ð ;ð ;ð ;ðð ð ð ð8	ð 	ð 	ð 	ð&
ð &
ð &
ð &
ð &
ð &
r   r?   )r=   Ú
__future__r   Údataclassesr   rZ   rx   rU   rv   r]   Útypingr   r	   r   r&   r?   r   r   r   ú<module>r‘      sc  ððð ð #Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ð €�˜dÐ#Ñ#Ô#ðð ð ð ð ñ ô ñ $Ô#ðð €�˜dÐ#Ñ#Ô#ð	!ð 	!ð 	!ð 	!ð 	!ñ 	!ô 	!ñ $Ô#ð	!ðð ð ð ð ñ ô ð ð0^
ð ^
ð ^
ð ^
ð ^
ñ ^
ô ^
ð ^
ð ^
ð ^
r   